quartz 2.x学习使用

来源:互联网 发布:七天网络查分登陆入口w 编辑:程序博客网 时间:2024/06/08 19:08

Quartz API

Quartz API核心接口有:
Scheduler – 与scheduler交互的主要API,是运行job的容器;
Job – 你通过scheduler执行任务,你的任务类需要实现的接口;
JobDetail – 定义Job的实例;
Trigger – 触发Job的执行;
JobBuilder – 定义和创建JobDetail实例的接口;
TriggerBuilder – 定义和创建Trigger实例的接口;

Scheduler在使用之前需要实例化。一般通过SchedulerFactory来创建一个实例。
Scheduler的生命期,从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job),

JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。Trigger对象被用来触发job的执行。你希望将任务纳入到进度,要实例化一个Trigger并且“调整”它的属性以满足你想要的进度安排。Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job传递参数。Quartz打包了很多不同类型的Trigger,但最常用的Trigge类是SimpleTrigger和CronTrigger。

SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
CronTrigger按照日历触发,例如“每个周五”,每个月10日中午或者10:15分。

为什么要分为Jobs和Triggers?
jobs可以被创建并且存储在job scheduler中,而不依赖于trigger,而且,很多triggers可以关联一个job.
另外的好处就是这种“松耦合”能使与日程中的Job相关的trigger过期后重新配置这些Job, 这样以后就能够重新将这些Job纳入日程而不必重新定义它们。这样就可以更改或者替换trigger而不必重新定义与之相连的job标识符。

简单实践
建立一个Java Project,引入包这里写图片描述
1、建立Job类

package quartz.job;import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public class MyJob implements Job {    @Override    public void execute(JobExecutionContext arg0) throws JobExecutionException {        JobDataMap data = arg0.getMergedJobDataMap();        System.out.println("MyJob "                + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss")                        .format(new Date()) + " someProp ---> "                + data.getString("someProp"));    }}

2、构建运行程序

package quartz.main;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.SimpleScheduleBuilder;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;import quartz.job.MyJob;public class Main {    public static void main(String[] args) throws Exception {        SchedulerFactory sf = new StdSchedulerFactory();        Scheduler scheduler = sf.getScheduler();   //构建scheduler         scheduler.start();          //构造JobDetail         JobDetail jobDetail = JobBuilder.newJob(MyJob.class) //加入自己的 Job                  .withIdentity("myJob", "group1") // name "myJob", group "group1"                  .build();        // Trigger the job to run now, and then every 3 seconds        Trigger trigger = TriggerBuilder.newTrigger()          .withIdentity("myTrigger", "group1")          .startNow()          .withSchedule(SimpleScheduleBuilder.simpleSchedule()              .withIntervalInSeconds(3)  //时间间隔//            .repeatForever()          //一直重复                .withRepeatCount(5))       //重复5次,启动之后会立即执行一次,所以实际执行6.build();        scheduler.scheduleJob(jobDetail, trigger);    }}

执行结果
MyJob 2016-36-22 14:36:01 someProp —> null
MyJob 2016-36-22 14:36:04 someProp —> null
MyJob 2016-36-22 14:36:07 someProp —> null
MyJob 2016-36-22 14:36:10 someProp —> null
MyJob 2016-36-22 14:36:13 someProp —> null
MyJob 2016-36-22 14:36:16 someProp —> null

0 0