调度器(scheduler):定时定频率的去执行任务
任务(job):业务逻辑
触发器(trigger):让任务生效的时间
JobDetail(包含任务实现类,任务信息)
trigger(触发器)
SimpleTrigger()
CronTrigger(实现复杂的业务逻辑 常用)
scheduler
Job
JobDetail(通过反射机制实现job)
JobBuilder
JobStore
Trigger(类)
TriggerBuilder
ThreadPool
Scheduler
Calendar
监听器
JobListener TriggerListener SchedulerListener
Quartz使用写自己的job类实现job接口
在execute方法中编写业务逻辑
自定义类
定义jobDetail trigger 对象
Demo
myjob
import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印当前时间 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is:" + sf.format(date)); // 编写具体的业务逻辑 System.out.println("Hello World!"); } }
package cn.miye.web; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 创建一个JobDetail实例,将该实例与HelloJobClass绑定 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("myJob", "group1") .usingJobData("message","hello myJob1") .usingJobData("FloatJobValue",3.14F) .build(); // 创建一个Trigger实例,定义该job立即执行,并每隔两秒钟执行一次,直到程序停止 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("mytrigger", "group1") .usingJobData("message","hello myTrigger1") .usingJobData("DoubleTriggerValue",2.0D) .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2).repeatForever()).build(); // 创建Scheduler实例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); scheduler.start(); // 打印当前时间 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is:" + sf.format(date)); scheduler.scheduleJob(jobDetail, trigger); } }
job实例在Quartz中额生命周期
每次调度器执行job时,它在调用execute方法前会创建一个新的job实例
当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收
jobDetai
JobDetail为job实例提供了许多设置属性,以及jobDataMap成员变量属性,它用来存储特定job实例的状态信息,调度器需要借助jobDetail对象来添加job实例
jobdetail用来绑定job,携带job的一些信息
job的一些属性 name group jobClass jobDataMap
组默认不写是DEFAULT
取出jibDetail的属性
jobDetail.getKey().getName();
jobDetail.getKey().getGroup();
JobExectionContext
当Scheduler调用一个job,就会将jobExecutionContext传递给job的execute()方法
job能通过jobExecutionContext对象访问到Quartz运行时候的环境及job本身的明细数据
JobDataMap
在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取
JobDataMap可以用来装载任何可序列化的数据对象
当job实例对象被执行时这些参数对象会传递给它
JobDataMap实现JDK的Map接口,并且添加了一些非常方便的方法用来存取基本数据类型
(键值对形式存取)
获取JobDataMap的两种方式
从Map中直接获取
map中直接获取
package cn.miye.web; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.TriggerKey; public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印当前时间 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is:" + sf.format(date)); // 编写具体的业务逻辑 System.out.println("Hello World!"); //获取jobDetail的名称和分组 JobKey key = context.getJobDetail().getKey(); System.out.println(key.getName()+":"+key.getGroup()); //获取trigger的名称和分组 TriggerKey trkey = context.getTrigger().getKey(); System.out.println(trkey.getName()+":"+trkey.getGroup()); //获取自定义传入的自定义参数的值 JobDataMap dataMap = context.getJobDetail().getJobDataMap(); JobDataMap tdataMap = context.getTrigger().getJobDataMap(); String jobMsg = dataMap.getString("message"); float jobFloatValue = dataMap.getFloat("FloatJobValue"); String triggerMsg = tdataMap.getString("message"); Double triggerDoubleValue = tdataMap.getDouble("DoubleTriggerValue"); System.out.println(jobMsg+"--"+jobFloatValue); System.out.println(triggerMsg+"--"+triggerDoubleValue); //获取jobDetail和trigger合并的key //如果jobDetail和trigger的key值相同,那么trigger会覆盖jobDetail JobDataMap mergedJobDataMap = context.getMergedJobDataMap(); String msg = mergedJobDataMap.getString("message"); Float mergetJobFloatValue = mergedJobDataMap.getFloat("FloatJobValue"); Double mergeTriggerDoubleValue = mergedJobDataMap.getDouble("DoubleTriggerValue"); System.out.println(msg); System.out.println(mergetJobFloatValue); System.out.println(mergeTriggerDoubleValue); } }
job实现类中添加setter方法对应JobDataMap的键值
(Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动的调用这些setter方法)
通过setter方法获取(定义的成员变量名称应与传入的key的名称相同)
package cn.miye.web; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.TriggerKey; public class HelloJob implements Job { private String message; private Float FloatJobValue; private Double DoubleTriggerValue; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Float getFloatJobValue() { return FloatJobValue; } public void setFloatJobValue(Float floatJobValue) { FloatJobValue = floatJobValue; } public Double getDoubleTriggerValue() { return DoubleTriggerValue; } public void setDoubleTriggerValue(Double doubleTriggerValue) { DoubleTriggerValue = doubleTriggerValue; } @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印当前时间 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is:" + sf.format(date)); System.out.println(message); System.out.println(FloatJobValue); System.out.println(DoubleTriggerValue); } }
传递自定义参数
.usingJobData("key1","value1").usingJobData("key2",value2)
trigger
Quartz中的触发器,用来告诉调度程序什么时候触发,即Trigger对象是用来触发Job的
trigger通过builder模式创建
原文:http://www.cnblogs.com/miye/p/7248271.html