Quartz源码解析 - JobExecutionContext、TriggerKey、JobDetail

怎甘沉沦 提交于 2020-01-14 09:17:45

目录

一. JobExecutionContext 

二.  TriggerKey

三. JobDetail


 

一. JobExecutionContext 

/**
 * 一个包含着大量环境信息的处理的上下文簇,当JobDetail被执行的时候,这个上下文传递给JobDetail,
 * 并且在执行完成的时候传递给Trigger实例
 * 
 * JobExecutionContext也是由Scheduler.getCurrentlyExecutionJobs()方法返回的。 * 
 */
public interface JobExecutionContext {

    /**
     * 获取调度器
     */
    public Scheduler getScheduler();

    /**
     * 获取触发器
     */
    public Trigger getTrigger();

    /**
     * 获取由Trigger引用的Calendar
     */
    public Calendar getCalendar();

    /**
     * 如果工作因为恢复而重新执行,这个方法返回true
     */
    public boolean isRecovering();

    public TriggerKey getRecoveringTriggerKey() throws IllegalStateException;

    public int getRefireCount();

    public JobDataMap getMergedJobDataMap();

    /**
     * 获取JobDetail
     */
    public JobDetail getJobDetail();

    /**
     * 获取Job实例
     *
     * 注意: Job实例在远程调度器中不可用 
     */
    public Job getJobInstance();

    /**
     * 实际的触发器启动的时间。
     */
    public Date getFireTime();

    /**
     * 触发器启动工作的时间。
     */
    public Date getScheduledFireTime();

    public Date getPreviousFireTime();

    public Date getNextFireTime();

    /**
     * 获取唯一的ID。它标识着触发器启动的实例。这对于这个JobExecutionContext也是唯一的。
     */
    public String getFireInstanceId();
    
    /**
     * 返回Job在完成之前设置的结果
     * 
     * 这个结果对于Quartz是无意义的,但是对于JobListener和TriggerListener是有意义的。
     */
    public Object getResult();

    /**
     * 设置Job的执行结果。
     *
     * 这个结果对于Quartz是无意义的,但是对于JobListener和TriggerListener是有意义的。
     */
    public void setResult(Object result);

    /**
     * job运行的时长。当job已经完成或者抛出一个异常,返回的值为-1。这个值对于JobListener和TriggerListener是有用的。
     */
    public long getJobRunTime();

    /**
     * 将指定的键和值放到上下文数据集合中
     */
    public void put(Object key, Object value);

    /**
     * 获取上下文数据集合中给定键的值
     */
    public Object get(Object key);

}

二.  TriggerKey

/**
 * 表示一个job或者trigger key的对象
 */
public class Key<T>  implements Serializable, Comparable<Key<T>> {
  
    private static final long serialVersionUID = -7141167957642391350L;

    /**
     * The default group for scheduling entities, with the value "DEFAULT".
     */
    public static final String DEFAULT_GROUP = "DEFAULT";

    private final String name;
    private final String group;
    
    public Key(String name, String group) {
        if(name == null)
            throw new IllegalArgumentException("Name cannot be null.");
        this.name = name;
        if(group != null)
            this.group = group;
        else
            this.group = DEFAULT_GROUP;
    }

    public String getName() {
        return name;
    }

    public String getGroup() {
        return group;
    }

    @Override
    public String toString() {
        return getGroup() + '.' + getName();
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((group == null) ? 0 : group.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        @SuppressWarnings("unchecked")
        Key<T> other = (Key<T>) obj;
        if (group == null) {
            if (other.group != null)
                return false;
        } else if (!group.equals(other.group))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    public int compareTo(Key<T> o) {
        
        if(group.equals(DEFAULT_GROUP) && !o.group.equals(DEFAULT_GROUP))
            return -1;
        if(!group.equals(DEFAULT_GROUP) && o.group.equals(DEFAULT_GROUP))
            return 1;
            
        int r = group.compareTo(o.getGroup());
        if(r != 0)
            return r;
        
        return name.compareTo(o.getName());
    }
    
    public static String createUniqueName(String group) {
        if(group == null)
            // “default”
            group = DEFAULT_GROUP;
        
        String n1 = UUID.randomUUID().toString();
        String n2 = UUID.nameUUIDFromBytes(group.getBytes()).toString();
        
        return String.format("%s-%s", n2.substring(24), n1);
    }
}

 

/**
 * 唯一标识 {@link Trigger}.
 * 
 */
public final class TriggerKey extends Key<TriggerKey> {
  
    private static final long serialVersionUID = 8070357886703449660L;

    public TriggerKey(String name) {
        super(name, null);
    }

    public TriggerKey(String name, String group) {
        super(name, group);
    }

    public static TriggerKey triggerKey(String name) {
        return new TriggerKey(name, null);
    }
    
    public static TriggerKey triggerKey(String name, String group) {
        return new TriggerKey(name, group);
    }
    
}

三. JobDetail

/**
 * 表示一个给定Job实例的细节属性。JobDetails是由JobBuilder创建的或者定义的
 * 
 * Quartz没有存储Job的实际实例,但是可以通过JobDetail,定义一个实例
 *
 * Job有一个名字和组,两者唯一标识Job
 * 
 * Trigger是Job被执行的机制。许多Triggers可以指向相同的Job。但是一个Trigger只能指向一个Job
 */
public interface JobDetail extends Serializable, Cloneable {

    public JobKey getKey();

    /**
     * 返回描述
     */
    public String getDescription();

    /**
     * 获取Job
     */
    public Class<? extends Job> getJobClass();

    /**
     * 获取跟Job关联的JobDataMap
     */
    public JobDataMap getJobDataMap();

    /**
     * 没有Trigger指向Job,Job是否应该持久化
     * 如果明确设置,默认是<code>false</code>.
     */
    public boolean isDurable();

    /**
     * 关联的Job类是否携带{@link PersistJobDataAfterExecution}注解
     */
    public boolean isPersistJobDataAfterExecution();

    /**
     * 关联的Job类是否携带{@link DisallowConcurrentExecution}注解
     */
    public boolean isConcurrentExectionDisallowed();

    /**
     * 指示Scheduler是否应该在'recovery'或者'fail-over'情形下,重新执行
     * 如果没有明确设置,默认的值是false
     */
    public boolean requestsRecovery();

    public Object clone();
    
    /**
     * 获取一个JobBuilder。JobBuilder是用来配置来生产一个JobDetail。
     */
    public JobBuilder getJobBuilder();

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!