常用任务调度组件介绍
1. quartz(最新2.3.1版本)
quartz中,关键组成部分为:Job、Trigger、Scheduler
- Scheduler: 调度程序维护作业详细信息(JobDetail)和触发器的注册表。一旦注册,调度程序将负责在相关的触发器触发时(调度时间到达时)执行作业。
- Job:调度程序当触发器触发时,具体执行的作业任务。
- Triiger:控制某个具体作业任务执行的规律,如什么时候开始执行,什么时候结束执行,期间执行间隔什么(每秒/分钟/小时等)。
1.1 Job与JobDetail介绍
job是调度器调度执行的具体任务,JobDetail是对这个job任务进行具体的修饰,比如这个任务的基本描述(description),唯一标识(JobKey)等信息。
1.1.1 Job
Job是一个接口,里面只有一个方法:execute(JobExecutionContext context)
public interface Job {
void execute(JobExecutionContext context)
throws JobExecutionException;
}
任何需要任务调取程序执行的任务类都需要实现Job接口,execute(JobExecutionContext context)方法中实现具体任务。如图中MyJob类实现Job接口: public class MyJob implements Job {
public class MyJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) {
JobKey jobKey=jobExecutionContext.getJobDetail().getKey();
System.out.println(new SimpleDateFormat("yyyyMMddhhmmsssSSS").format(new Date())+":执行"+ jobKey.getName()+":"+jobKey.getGroup());
}
}
myJob作业就是打印任务详情(JobDetail下面将介绍)。
1.1.2 JobDetail介绍
之前介绍过,任务调度程序Schedule必须是作业详细信息(JobDetail)和触发器,而JobDetail又是对Job(如MyJob)信息的具体修饰。
JobDetail的是一个接口,其实现类只有一个:
JobDetail可以通过JobBuilder类的build方法进行创建(最终创建的是JobDetailmple),JobBuilder结构如下:
在通过build()创建jobDetail之前,可以通过 newJob()方法管理具体的作业任务(如MyJob),设置描述信息widthDescription()、唯一标识withdIdentity(),执行数据usingJobData()等。
下面是创建JobDetail的代码:
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withDescription("my first job")
.withIdentity("jobName", "jobGroupName")
.build();
截止为止,我们已经对Quartz中三要素之一:job与JobDetail 有了一个了解,那么如何控制作业的执行,将有下面Trigger去实现。
1.2 Trigger介绍
Trigger就是一个触发器,控制某一任务具体在什么时候触发执行,比如在某一时间点, 或者在某一时间段,执行几次,执行间隔等。
Trigger实现有如下六种,其中已经实现类:CalendarIntervalTriggerImpl, CronTriggerImpl, DailyTimeIntervalTriggerImpl, SimpleTriggerImpl
1.2.1 SimpleTriggerImple 简单触发器
根据其名字子可知,简单的触发器,是触发器类型中最简单的一种,其只能用于在给定的时间点触发作业,并可选地在指定的时间间隔内重复。下面是我创建一个SimpleTriggerImple:
Trigger trigger = TriggerBuilder.newTrigger()//1创建TriggerBuilder
.withIdentity("triggerName", "triggerGroupName")//2定义触发器唯一标识
.withSchedule(repeatSecondlyForever())//3-1设置执行触发时间
.startAt(date)//3-2设置开始时间
.endAt(end)//3-2设置结束时间
.build();//4通过2-3的数据,生成SimpleTriggerBuilder
其中第2步,通过设置trigger的名字和分组生成唯一标识TriggerKey 源码:
public TriggerBuilder<T> withIdentity(String name, String group) {
key = new TriggerKey(name, group);
return this;
}
重点第3步,通过设置不同的ScheduleBuilder,如果是生成SimpleTriggerImple,那这边必须是