前置知识--Quartz
quartz使用
概念:什么是quartz?
任务调度。简单来说,就是设置某个时间,该干什么事情。
里面有三个比较重要的对象:
- job(任务)
我们需要实现一个接口,并重写execute()方法,用户书写任务。
我们需要知道JobDetail对象,调度器用。 - Trigger(触发器)
可以使用SimplTrigger触发,也可以使用CronTrigger触发(cron表达式描述各种复杂的时间调度计划)。 - Scheduler(调度器)
调度job与trigger。
举一个非常简单的例子:
// 实现Job接口,重写execute()方法。
public class DemoJob implements Job {
public DemoJob() {
}
public void execute(JobExecutionContext context)throws JobExecutionException{
System.err.println("这是要执行的任务");
}
}
// 第一步,创建JobDetail实例,并于DemoJob绑定
JobDetail jobDetail = newJob(DemoJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.build();
// 第二步,构建触发器
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// 第三步,创建调度器Scheduler并执行
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
关于quartz的细节
1.可以在构建JobDetail的时候,传一些参数给Job对象。通过JobDataMap。
JobDetail job = newJob(DemoJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.usingJobData("testKey1", "value1")
.usingJobData("testKey2", "value2")
.build();
public class DemoJob implements Job {
public DemoJob() {
}
public void execute(JobExecutionContext context)throws JobExecutionException{
// JobDataMap 用于接收JobDetails的数据
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
// 获取这两个值
String key1Value = dataMap.getString("testKey1");
String key2Value = dataMap.getString("testKey2");
}
}
2.监听器:JobListener、TriggerListeners、SchedulerListeners
触发JobDetails对象的时候,监听器起作用。同理,别的也是这样。
只需两步:
- 实现JobListener,并重写其中的方法。
- 通过scheduler,添加全局监听。
3.JobStore
定义:JobStore是存放Job和Trigger的地方。因为我们需要被Scheduler调用的任务大多数并不是一次性的任务,而是需要被定时触发,或者某个时间点才能被触发的。
因此我们需要一个容器来存储Job和Trigger的相关内容。
JobStore有三种存储模式:
1.一种是基于本地内存的RAMJobStore模式。
2.一种是基于数据库的JDBCJobStore。
3.一种是名为TerracottaJobStore的模式,该模式不依赖数据库。