Quartz源码分析之Trigger

Trigger用于记录job的启动时间,失效日期,描述,是否删除等信息。我们使用的代码调用如下:

Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger","group1").startAt(runTime).build();

先看Trigger的定义:

public enum TriggerState { NONE, NORMAL, PAUSED, COMPLETE, ERROR, BLOCKED }
public enum CompletedExecutionInstruction { NOOP, RE_EXECUTE_JOB, SET_TRIGGER_COMPLETE, DELETE_TRIGGER, 
public static final int MISFIRE_INSTRUCTION_SMART_POLICY = 0;
public String getDescription();
public String getCalendarName();
public JobDataMap getJobDataMap();  
public boolean mayFireAgain();  
public Date getStartTime(); 
public Date getEndTime(); 
public Date getNextFireTime();  
public Date getPreviousFireTime();

主要定义了如上这些接口操作,包括了是否从trigger 列表中删除,开始执行时间,失效日期,下一次执行时间,上一次执行时间等内容。

看TriggerBuilder的逻辑:
这里首先调用了newTrigger()方法,这个类有如下字段:

private TriggerKey key;
private String description;
private Date startTime = new Date();
private Date endTime;
private int priority = Trigger.DEFAULT_PRIORITY;
private String calendarName;
private JobKey jobKey;
private JobDataMap jobDataMap = new JobDataMap();

newTrigger()方法调用了私有的TriggerBuilder()构造函数。初始化了如上参数。

public static TriggerBuilder<Trigger> newTrigger() {
        return new TriggerBuilder<Trigger>();
}
private TriggerBuilder() {}

withIdentify()方法构造了TriggerKey类,用户初始化上面TriggerKey这个字段,同时返回TriggerBuilder类。

public TriggerBuilder<T> withIdentity(String name, String group) {
        key = new TriggerKey(name, group);
        return this;
}

再次调用了startAt()来初始化trigger启动的时间:

public TriggerBuilder<T> withIdentity(String name, String group) {
        key = new TriggerKey(name, group);
        return this;
}

最后调用build()方法:

public T build() {

        if(scheduleBuilder == null)
            scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
        MutableTrigger trig = scheduleBuilder.build();

        trig.setCalendarName(calendarName);
        trig.setDescription(description);
        trig.setStartTime(startTime);
        trig.setEndTime(endTime);
        if(key == null)
            key = new TriggerKey(Key.createUniqueName(null), null);
        trig.setKey(key); 
        if(jobKey != null)
            trig.setJobKey(jobKey);
        trig.setPriority(priority);

        if(!jobDataMap.isEmpty())
            trig.setJobDataMap(jobDataMap);

        return (T) trig;
    }

这里主要有一个MutableTrigger类,这个类被返回到了Trigger接口引用。因此这个类肯定是Trigger的子类。同时设置了Trigger接口中定义的字段。
最主要的是

 scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
 MutableTrigger trig = scheduleBuilder.build();

看一下SimpleScheduleBuilder 类的逻辑:

public static SimpleScheduleBuilder simpleSchedule() {
        return new SimpleScheduleBuilder();
    }

这里很简单的返回了一个了SimpleScheduleBuilder对象。同时调用build方法来构造了Trigger对象,主要逻辑在这里了:

public MutableTrigger build() {

        SimpleTriggerImpl st = new SimpleTriggerImpl();
        st.setRepeatInterval(interval);
        st.setRepeatCount(repeatCount);
        st.setMisfireInstruction(misfireInstruction);

        return st;
    }

这里构造了一个SimpleTriggerImpl对象,同时设置了两个属性,这两个属性也是Trigger接口中所要求的。这里Trigger接口很多。至于为什么是这么个设计,后续再逐一分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz 提供了 TriggerListener 接口,可以通过实现该接口来监听 Trigger 的状态变化。TriggerListener 接口包含了以下几个方法: 1. triggerFired(Trigger trigger, JobExecutionContext context): 当一个 Trigger 触发时,该方法被调用。 2. vetoJobExecution(Trigger trigger, JobExecutionContext context): 在 Job 执行之前,该方法被调用。如果该方法返回 true,Job 将不会执行。 3. triggerMisfired(Trigger trigger): 当一个 Trigger 被错过时,该方法被调用。 4. triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode): 当一个 Trigger 完成时,该方法被调用。其中参数 triggerInstructionCode 可以是一个枚举类型,表示下一步应该执行的指令。 在实现 TriggerListener 接口后,需要将其注册到 Quartz 调度器中,以便监听 Trigger 状态的变化。 示例代码如下: ```java public class MyTriggerListener implements TriggerListener { @Override public String getName() { return "MyTriggerListener"; } @Override public void triggerFired(Trigger trigger, JobExecutionContext context) { System.out.println("Trigger fired: " + trigger.getKey()); } @Override public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { // 返回 true 表示不执行 Job return false; } @Override public void triggerMisfired(Trigger trigger) { System.out.println("Trigger misfired: " + trigger.getKey()); } @Override public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) { System.out.println("Trigger completed: " + trigger.getKey()); } } ``` 注册 TriggerListener: ```java scheduler.getListenerManager().addTriggerListener(new MyTriggerListener()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值