本篇介绍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对象的工具类,实现构建者设计模式。