quartz中的Job
Job接口
需要执行的调度任务必须实现Job
接口, 重写其execute()
方法.
以上就是对Job
接口, 我们在使用上的理解, Job
接口的定义也非常简单只有一个execute()
方法
void execute(JobExecutionContext context)
throws JobExecutionException;
JobBuilder和JobDetail
还记得我们是怎么定义一个任务的吗? 没错, 使用JobBuilder
JobDetail job = newJob(HelloJob.class) // (1)
.withIdentity("myJob", "group1") // (2)
.build(); // (3)
让我们拆解一下这三个步骤
(1) 创建一个JobBuilder用来定义一个JobDetail并且设置将要被执行的类名称
public static JobBuilder newJob(Class <? extends Job> jobClass) {
JobBuilder b = new JobBuilder();
b.ofType(jobClass);
return b;
}
(2) 有三个重载方法, 通过设置name
和group
来唯一标识一个任务, 最终是封装成一个JobKey
对象
public JobBuilder withIdentity(String name) {
key = new JobKey(name, null);
return this;
}
(3) 根据JobBuilder
创建JobDetail
public JobDetail build() {
JobDetailImpl job = new JobDetailImpl(); // JobDetail接口的唯一实现类JobDetailImpl
job.setJobClass(jobClass);
job.setDescription(description);
if(key == null)
key = new JobKey(Key.createUniqueName(null), null);
job.setKey(key);
job.setDurability(durability);
job.setRequestsRecovery(shouldRecover);
if(!jobDataMap.isEmpty())
job.setJobDataMap(jobDataMap);
return job;
}
JobDetail的其他属性
private JobKey key;
private String description;
private Class<? extends Job> jobClass;
private boolean durability;
private boolean shouldRecover;
private JobDataMap jobDataMap = new JobDataMap();
protected JobBuilder() {
}
-
key
JobKey
我们前面已经介绍过了, 是用来唯一标识一个任务 -
description
任务的描述, 非常容易理解
-
jobClass
实现
Job
接口的实现类 -
durability
如果一个job是非持久的,当没有活跃的trigger与之关联的时候,会被自动地从scheduler中删除。也就是说,非持久的job的生命期是由trigger的存在与否决定的
-
shouldRecover
用来设置当调度程序出现恢复或者故障转移情况时, 是否需要重新执行任务, 关于恢复和故障转移会在以后说到, 本篇主要论述和任务相关的实现
-
jobDataMap
可以使任务携带自定义的键值对数据, 方便运行时获取