一、什么是 Quartz Scheduler
Quartz Scheduler是一个特性丰富、开源的一个任务调度库,可以应用于所有的Java App。Quartz 可以创建简单和复杂的任务调度,可以执行几十、几百、上万个任务。任务被定义成标准的Java组件,可以执行任意的程序。Quartz Scheduler支持很多企业特性,譬如说 JTA事物和集群。
二、我们用 Quartz Scheduler 能做什么
在你的应用中,有很多任务需要在时间的某一个时刻发生,或者有很多循环发生的任务,Quartz Scheduler 将会是你理想中的选择。
1. Driving Process Workflow(驱动流程工作流):当一个新的秩序被初始化好,调度一个job在两个小时内触发,将会检查秩序的状态,如果某一个需要确认的信息还没有收到,就触发一个预警消息,同时将秩序的状态更新为 ‘等待调停’。
2. 系统维护:在每天的某个固定的时间,将数据库的内容变成一个xml文件。
3. 在应用中,提供提醒的服务。
三、Quartz 的特性
特性一:Runtime Environments (运行时环境)
1. Quartz 可以被植入到另外一个自由独立的应用中。
2. Quartz 可以在应用中初始化,参入到XA 事物中。
3. Quartz 可以作为一个独立的程序运行,譬如被使用到 远程接口调用中。
4. Quartz 可以初始化为一个 job执行的独立程序的集群。
特性二:Job Scheduling(任务跳读)
当触发器发生,任务可以被调度执行。触发器包含以下指令:
1. 一天中某一个时间。
2. 一个星期的某一个时间。
3. 一个月的某一个时间。
4. 一年中的某一个时间。
5. 注册的Calendar 列出来某一些不确定的时间(国庆节等)。
6. 在某一段时间内重复一定的次数。
7. 一直重复,直到某一个结束时间。
8. 无限期的重复。
9. 重复的延迟间隔。
创建Job的时候可以给Job一个名称,然后放到一个组(group)中。触发器也可以有名称,放入到一个组里面,这样scheduler 就可以很好的去管理他们。Job可以加入到scheduler一次,但是可以注册到触发器多次。在企业Java环境中,Job可以执行的工作可以作为分布式事物中的一部分。
特性三:Job Execution(任务执行)
1. Job可以是实现了 Job接口的任意类。
2. Job类的实例可以被Quartz初始化,也可以被你的Java应用初始化。
3. 当触发器发生的时候,调度器可以通知零个或者多个实现了 JobListener 和 TriggerListener 接口的java对象。当Job已经执行的时候,这些监听器也会被唤醒。
4. 当Job执行完成的时候,会返回一个 JobCompletionCode,通知调度器任务完成或者失败。JobCompletionCode可以来知道调度器接下来的一些动作。
特性四:Job Persistence(Job持久化)
1. 在Quartz的设计中,提供了一个 JobStore 接口,实现这个接口可以提供好各种各样机理的Job存储。
2. 在使用 JDBCJobStore 时,所有的 Job 和 trgger 配置为 ‘non-volatile’,通过Jdbc保存在数据库中。
3. 在使用 RAMJobStore 时,所有的 Job 和 trgger 保存在内存中,因此在程序执行的时候,没有持久化。
特性五:Transactions(事物)
1. 使用 JobStoreCMT , Quartz可以加入到 JTA 事物中。
2. Quartz可以管理 Job执行上下文的 JTA 事物,所以 Job所执行的任务 会 在一个 JTA 事物中。
特性六: Clustering Features(集群的特性)
1. 提供了 容错机制。
2. 提供了负载均衡机制。
3. Quartz 的 集群特性 依赖于 数据库持久(由JDBCJobStore 实现的)。
4. Terracotta 扩展了 Quartz, 提供了集群的能力而不需要后端的数据库。
特性七:Listeners & Plug-Ins(监听器和插件)
1. 应用可以捕获到 调度的事件,从而可以监听和控制 Job和Trgger 的行为。
2. 插件的机理 可以 给 Quartz 增加一些功能,例如: 保存Job执行的历史记录,从文件中加载 Job 和 触发器。
3. Quartz 提供了 一些工厂方法,可以创建 一些 插件和监听器。
四、 Quartz 的一个简单应用Demo
Job的实现代码:
package net.qh.test.job; import org.quartz.Job; import org.quartz.JobExecutionContext; /** * Created by Administrator on 2016/03/28. */ public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) { String msg = " hello My Job, fire-time:"+jobExecutionContext.getFireTime() +", InstanceId:"+jobExecutionContext.getFireInstanceId() +", JobRunTime: "+jobExecutionContext.getJobRunTime() +", key:"+jobExecutionContext.getMergedJobDataMap().get("key"); System.out.println(msg); } }
Main方法:
package net.qh.test.job; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.Collections; /** * Created by Administrator on 2016/03/28. */ public class Demo { public static void main(String[] args) throws SchedulerException { Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .usingJobData(new JobDataMap(Collections.singletonMap("key","value"))) .withIdentity("myJob", "myGroup") .build(); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "myGroup") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()) .build(); scheduler.scheduleJob(jobDetail,trigger); } }
运行输出:
log4j:WARN No appenders could be found for logger (org.quartz.impl.StdSchedulerFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. hello My Job, fire-time:Tue Mar 29 13:57:24 GMT+08:00 2016, InstanceId:1459231044819, JobRunTime: -1, key:value hello My Job, fire-time:Tue Mar 29 13:57:29 GMT+08:00 2016, InstanceId:1459231044820, JobRunTime: -1, key:value hello My Job, fire-time:Tue Mar 29 13:57:34 GMT+08:00 2016, InstanceId:1459231044821, JobRunTime: -1, key:value hello My Job, fire-time:Tue Mar 29 13:57:39 GMT+08:00 2016, InstanceId:1459231044822, JobRunTime: -1, key:value hello My Job, fire-time:Tue Mar 29 13:57:44 GMT+08:00 2016, InstanceId:1459231044823, JobRunTime: -1, key:value hello My Job, fire-time:Tue Mar 29 13:57:49 GMT+08:00 2016, InstanceId:1459231044824, JobRunTime: -1, key:value