zoukankan      html  css  js  c++  java
  • 后端——框架——定时任务——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对象的工具类,实现构建者设计模式。

  • 相关阅读:
    bat常用指令记录
    物料主数据MM01扩充时默认值的设置 BADI_MATERIAL_REF
    CK11,CK11N 成本估算数据读取
    VUE中具名插槽和匿名插槽的使用
    VUE+element页面按钮调用dialog
    线程进程随笔
    "反直觉" 的Unity粒子系统API
    一个RingBuffer(C语言)
    一个极其简单(陋)的内存分配器
    nginx 转发接口出现 403 forbidden
  • 原文地址:https://www.cnblogs.com/rain144576/p/14749947.html
Copyright © 2011-2022 走看看