-
一、三个核心概念
- 调度器(scheduler)
- 任务(job)
- 触发器(trigger)
-
二、主要用到的设计模式
- Builder模式(创建jobdetail,trigger)
- Factory模式(创建Scheduler)
- 组件模式
- 链式写法
-
三、重要组成
- Job
- JobDetail
- JobDetail
- JobStore
- Trigger:SimpleTrigger、CronTrigger
- TriggerBuilder:
- ThreadPool:共享线程池,解决并发问题
- Scheduler
- Calendar:一个Trigger可以和多个Calendar关联,以排除或包含某些时间点
- 监听器:JobListener,TriggerListner,SchedulerListener
-
四、一张图![Quartz体系结构](http://img.blog.csdn.net/20170815185405168?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSURvZzE0OXRhbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
-
五、浅谈Job
-
Job实例在Quartz中的生命周期
每次调度器执行job时,它在调用execute()方法前会创建1个新的job实例。
当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收。
- JobDetail重要属性:name,group,jobClass,jobDataMap
- JobExecutionContext:Job通过访问JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据
-
JobDataMap:在进行任务调度时,JobDataMap存储在JobExecutionContext中,非常方便获取;JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时会传递参数给这些对象;JobDataMap实现了JDK的map接口(key-value)。
用法1:在jobDetail或者Trigger里用“usingJobData()”添加键值对数据,在job里用jobDataMap中的getJobDataMap()或者getMergedJodDataMap()获取【若Trigger和JobDetail的key值一致,getMergedJodDataMap()会覆盖掉JobDetail中的值】。举例说明:
//添加数据
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob","group1")
.usingJobData("message", "hello jobDetail1")
.usingJobData("message", "hello jobDetail2")
.build();
//获取数据
JobDataMap jobDataMap=context.getJobDetail().getJobDataMap();
String msg1=jobDataMap.getString("message");
用法2:直接在Job类中添加setter()方法对应JobDataMap的键值。
-
六、浅谈Trigger
- Trigger通用属性:Jobkey/StartTime/EndTime,StartTime和EndTime的值类型是java.util.Date.
- CronTrigger:基于日历的作业调度。
- Cron表达式:秒、分钟、小时、日、月、周、天。
此处应插2张图 ![Cron表达式特殊字符意义对应表]()
![通配符说明]()
-
七、浅谈Scheduler
使用Quartz实现任务:每2秒打印一次“Hello Job”
HelloJob.java
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{
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// 编写具体的业务逻辑
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Exec time is: "+sdf.format(date));
System.out.println("Hello Job!");
}
}
HelloScheduler.java
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.ScheduleBuilder;
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{
//使用builder模式创建1个JobDetail实例,将该实例与HelloJob.class绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).
withIdentity("myJob","group1").build();
//使用builder模式创建1个Trigger实例,定义该job立即执行,并且每隔2秒钟重复执行1次,直到永远
Trigger trigger=TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow().withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever())
.build();
//创建Scheduler实例,使用factory模式创建
SchedulerFactory sfact=new StdSchedulerFactory();
Scheduler scheduler=sfact.getScheduler();
scheduler.start();
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current time is: "+sdf.format(date));
scheduler.scheduleJob(jobDetail, trigger);
}
}