文章目录
一、quartz介绍
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。
Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。
二、核心概念
Quartz 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任务调度的元数据, scheduler 是实际执行调度的控制器。
1、trigger
触发器,用于定于任务调度的时间规则,即按照什么时间规则去执行任务。Quartz 中主要提供了四种类型的 trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和 NthIncludedDayTrigger。Trigger也有一个相关联的JobDataMap,用于给Job传递一些触发相关的参数。
最常用的:
SimpleTrigger:用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
CronTrigger:按照日历触发,例如“每个周五”,每个月10日中午或者10:15分。
2、job
被调度的任务,主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。
- Quartz无状态Job实现了org.quartz.Job接口,有状态Job实现了org.quartz.StatefulJob接口。
- 对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。
- 一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job。
3、scheduler
任务调度器,由 scheduler 工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二种工厂 StdSchedulerFactory 使用较多,因为 DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。 Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。
4、作业管理和存储
作业一旦被调度,调度器需要记住并且跟踪作业和它们的执行次数。Quartz通过一个称之为作业存储(JobStore)的概念来做作业存储和管理。
Quartz提供两种基本作业存储类型。第一种类型叫做RAMJobStore,它利用内存来持久化调度程序信息。
优点: 不要外部数据库,配置容易,运行速度快
缺点: 因为调度程序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。另外因为存储到JVM内存里面,所以可以存储多少个Job和Trigger将会受到限制
第二种类型的作业存储称为JDBC作业存储,提供两种不同的实现。两种JDBC作业存储都需要JDBC驱动程序和后台数据库来持久化调度程序信息。这两种类型的不同在于你是否想要控制数据库事务或者释放控制给应用服务器(这类似于J2EE领域中,容器管理事务CMT和Bean管理事务BMT之间的区别),这两种JDBC作业存储是:
JobStoreTX:当你想要控制事务或工作在非应用服务器环境中时使用;
JobStoreCMT:当你工作在应用服务器环境中和想要容器控制事务时使用。
优点: 支持集群,因为所有的任务信息都会保存到数据库中,可以控制事物,还有就是如果应用服务器关闭或者重启,任务信息都不会丢失,并且可以恢复因服务器关闭或者重启而导致执行失败的任务
缺点: 运行速度的快慢取决与连接数据库的快慢