本篇介绍Job相关对象。
Job:它代表一个任务,通常自定义任务实现此接口,实现execute方法。
JobKey:代表任务的唯一标识。
JobDataMap:存储Job运行时的数据。等价于Job的”属性(property)”。
JobDetail:在Job的基础上添加一些额外的信息,例如JobKey,group等等。
JobBuilder:用于创建JobDetail。
JobListener:监听Job的生命周期。
JobStore:持久化Job数据。有两种RAMJobStore,存储在内存中,JobStoreCMT, 存储在数据库中。
1、Job
public interface Job {
/**
* <p>
*
* <p>
* The implementation may wish to set a
* {@link JobExecutionContext#setResult(Object) result} object on the
* {@link JobExecutionContext} before this method exits. The result itself
* is meaningless to Quartz, but may be informative to
* <code>{@link JobListener}s</code> or
* <code>{@link TriggerListener}s</code> that are watching the job's
* execution.
* </p>
*/
void execute(JobExecutionContext context)
throws JobExecutionException;
}
实现自定义Job,HelloWorld示例中为HelloJob,在execute方法中只打印”Hello Quartz”。
2、JobKey
public final class JobKey extends Key<JobKey> {
private static final long serialVersionUID = -6073883950062574010L;
public JobKey(String name) {
super(name, null);
}
public JobKey(String name, String group) {
super(name, group);
}
public static JobKey jobKey(String name) {
return new JobKey(name, null);
}
public static JobKey jobKey(String name, String group) {
return new JobKey(name, group);
}
}
JobKey对象较为简单,有两个属性,name表示Job的名称,group表示Job的分组名称,二者的组合必须是唯一的。
3、JobDataMap
JobDataMap表示Job运行时的数据,等价于Job的property。在调用newJob时,会将所有的JobDataMap合并,源码如下:
public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException {
Job job = super.newJob(bundle, scheduler);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.putAll(scheduler.getContext());
jobDataMap.putAll(bundle.getJobDetail().getJobDataMap());
jobDataMap.putAll(bundle.getTrigger().getJobDataMap());
// 这个方法会调用set相关的方法
setBeanProps(job, jobDataMap);
return job;
}
4、JobDetail
它是将上述所有对象关联起来,并额外提供Job的attribute。Job的attribute如下:
- jobClass:Job接口的实现类
- key:Job的唯一标识,由JobKey提供。
- jobDataMap:由JobBuilder的usingJobData添加的键值对。由JobDataMap提供。
- description:Job的描述
- durability:表示Job是否是持久的,决定Job对象的生命周期,当该值为false时,无关联Trigger时会被gc。
- requestsRecovery:当由于意外原因导致日程被关闭,当日程被重新创建时,是否恢复之前的任务。
源码如下:
public JobDetail build() {
JobDetailImpl job = new 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;
}
5、JobStore
Job的持久化功能是由JobStore接口提供的,最常见的有两种方式,
第一种是RAMJobStore,持久化数据到内存中。当电脑重启,或者是程序停止运行,内存数据会被清空。主要用于学习。
第二种是JobStoreCMT,它是将上下文中的属性保存到数据库中,其中事务由数据源负责。
第三种是JobStoreTX,与JobStoreCMT类似,区别在于事务的提交和回滚会由JobStoreTX负责。不常见。
6、JobListener
public interface JobListener {
public String getName();
public void jobToBeExecuted(JobExecutionContext context);
public void jobExecutionVetoed(JobExecutionContext context);
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException);
}
- getName:返回Job的名称。
- jobToBeExecuted:Job就绪,准备执行之前执行此方法
- jobExecutionVetoed:Job被否决时执行,如果存在TriggerListener,其中的vetoJobExecution方法返回true时,Job被否决。其他情况不会执行。
- jobWasExecuted:JoJob执行完之后执行此方法。
7、JobBuilder
构建Job对象的工具类,实现构建者设计模式。