作业调度框架Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目。
核心概念
- Job 表示一个工作,要执行的具体内容。
- JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行的调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
- JobBuilder 用于定义/构建JobDetail实例,用于定义作业的实例。
- Trigger 代表一个调度参数的配置,什么时候去调。
- TriggerBuilder 用于定义/构建触发器实例。
- Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
例子
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.CalendarIntervalScheduleBuilder.*;
import static org.quartz.DateBuilder.*;
public class QuartzTest {
public static void main(String[] args) {
try {
// 通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 调度启动
scheduler.start();
// 创建一个JobDetail实例,指定DumbJob
JobDetail job = newJob(DumbJob.class)
.withIdentity("job1", "group1")
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.141f)
.build();
// 通过SimpleTrigger定义调度规则:马上启动,每40秒运行一次
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// 注册并进行调度
scheduler.scheduleJob(job, trigger);
//scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DumbJob implements Job {
private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);
String jobSays;
float myFloatValue;
ArrayList state;
public DumbJob() {
}
//实现Job接口方法
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getMergedJobDataMap(); // Note the difference from the previous example
state.add(new Date());
System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
public void setJobSays(String jobSays) {
this.jobSays = jobSays;
}
public void setMyFloatValue(float myFloatValue) {
myFloatValue = myFloatValue;
}
public void setState(ArrayList state) {
state = state;
}
}
Triggers介绍
最常用的两种trigger会分别是:SimpleTrigger和CronTrigger。
SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。比如,你有一个trigger,你可以设置它在2015年1月13日的上午11:23:54准时触发,或者在这个时间点触发,并且每隔2秒触发一次,一共重复5次。
CronTrigger通常比Simple Trigger更有用,如果您需要基于日历的概念而不是按照SimpleTrigger的精确指定间隔进行重新启动的作业启动计划。使用CronTrigger,您可以指定号时间表,例如“每周五中午”或“每个工作日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和1月份的星期五“。
TriggerListeners、JobListeners、SchedulerListeners
Listeners是您创建的对象,用于根据调度程序中发生的事件执行操作。
trigger相关的事件包括:触发器触发,触发失灵,触发完成。
job相关事件包括:job即将执行的通知,以及job完成执行时的通知。
scheduler相关的事件包括:添加job/触发器,删除job/触发器,调度程序中的严重错误,关闭调度程序的通知等。
jobstores
JobStore负责跟踪您提供给调度程序的所有“工作数据”:jobs,triggers,日历等。
RAMJobStore是使用最简单的JobStore,它也是性能最高的(在CPU时间方面)。RAMJobStore以其明显的方式获取其名称:它将其所有数据保存在RAM中。缺点是当您的应用程序结束(或崩溃)时,所有调度信息都将丢失
JDBCJobStore也被恰当地命名 - 它通过JDBC将其所有数据保存在数据库中。