后端——框架——定时任务——quartz——Job

  本篇介绍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如下:

  1. jobClass:Job接口的实现类
  2. key:Job的唯一标识,由JobKey提供。
  3. jobDataMap:由JobBuilder的usingJobData添加的键值对。由JobDataMap提供。
  4. description:Job的描述
  5. durability:表示Job是否是持久的,决定Job对象的生命周期,当该值为false时,无关联Trigger时会被gc。
  6. 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);
}
  1. getName:返回Job的名称。
  2. jobToBeExecuted:Job就绪,准备执行之前执行此方法
  3. jobExecutionVetoed:Job被否决时执行,如果存在TriggerListener,其中的vetoJobExecution方法返回true时,Job被否决。其他情况不会执行。
  4. jobWasExecuted:JoJob执行完之后执行此方法。

7、JobBuilder

构建Job对象的工具类,实现构建者设计模式。

原文地址:https://www.cnblogs.com/rain144576/p/14749947.html