07.Quartz 监听器-TriggerListener

五迷三道 提交于 2019-11-28 18:18:54

TriggerListner 用于监听触发器的相关创建, 用于在触发器触发前后做一些自定义操作. quartz 中TriggerListener的设计思想和JobListener 的设计思想如出一辙. 和JobListener 类似, quartz 2.x 也不再进行持久化操作.

1. TriggerListener 定义

quartz 提供了两种方式自定义自己的TriggerListener, 一种是实现TriggerListener接口, 需要实现所有Listener 自定义的方法; 另一种是继承TriggerListenerSuppoer 类, 只需实现自己关注的方法即可.

1.1 TriggerListener 接口定义

public interface TriggerListener {

    // 返回trigger名称
    String getName();

    // 触发器触发时调用此方法
    void triggerFired(Trigger trigger, JobExecutionContext context);

    boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);

    // 触发器触发,但是定时任务无法执行执行时调用此方法
    void triggerMisfired(Trigger trigger);

    // 触发器关联定时任务完成后调用此方法
    void triggerComplete(Trigger trigger, JobExecutionContext context, CompletedExecutionInstruction triggerInstructionCode);

}

1.2 监听器匹配模式

quartz 提供了Matcher 接口用于指定监听器匹配任务的模式, 可具体匹配的定时任务, 或按组进行屁, 亦或者匹配全部的定时任务

 // 监听具体的一个触发器
KeyMatcher<TriggerKey> keyMatcher = KeyMatcher.keyEquals(TriggerKey.triggerKey("triggerName1", "triggerGroupName"));

// 监听一组触发器
GroupMatcher<TriggerKey> groupMatcher = GroupMatcher.groupEquals("triggerGroupName");

// 监听所有的触发器
GroupMatcher<TriggerKey> allMatcher = GroupMatcher.anyJobGroup();

1.3 TriggerListener


# 1. 创建监听器匹配模式
 KeyMatcher<TriggerKey> keyMatcher = KeyMatcher.keyEquals(TriggerKey.triggerKey("triggerName1", "triggerGroup8"));

# 2. 注册监听器
scheduler.getListenerManager().addTriggerListener(new MyFirstTriggerListener(), keyMatcher);

2. 自定义TriggerListener

由于quartz 2.x 并不会对监听器做持久化操作, 因此笔者使用基于ram 配置的quartz环境.

2.1 实现TriggerListener接口

必须实现TriggerListener 接口的所有方法,

public class MyFirstTriggerListener implements TriggerListener {
    @Override
    public String getName() {
        return "myFirstTriggerListener";
    }

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext context) {
        System.out.println(getName() + "-triggerFired"  );
    }

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        return false;
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
        System.out.println("first - triggerMisfired"+ trigger.getKey());
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
        System.out.println(getName() + "-triggerComplete");
    }
}

2.2 继承TriggerListenerSupport

其实和实现TriggerListener接口无差异, getName()是必须重写的方法.

public class MySecondTriggerListener extends TriggerListenerSupport {

    @Override
    public String getName() {
        return "mySecondTriggerListener";
    }

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext context) {
        System.out.println(getName() + "-triggerFired"  );
    }

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        return false;
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
        System.out.println("first - triggerMisfired"+ trigger.getKey());
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
        System.out.println(getName() + "-triggerComplete");
    }
}

2.3 测试用例

笔者推荐在调度器启动之前添加任务监听器.

public class Test08 extends BaseQuartzRamTest {

    // 测试trigger监听器
    @Test
    public void test_triggerListener() throws SchedulerException {

        // 3. 创建定时任务
        JobDetail job = JobBuilder.newJob(ListenerJob.class)
                .withIdentity("listenerJob", "jobGroup8")
                .requestRecovery(true)
                .build();


        // 4. 创建简单触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("jobListenerTrigger", "triggerGroup8")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withRepeatCount(0))
                .build();

        // 5. 将定时任务添加到调度队列中
        scheduler.scheduleJob(job, trigger);


        // 6. 笔者推荐在调度器启动之前添加监听器
        KeyMatcher<TriggerKey> keyMatcher = KeyMatcher.keyEquals(TriggerKey.triggerKey("jobListenerTrigger","triggerGroup8"));
        scheduler.getListenerManager().addTriggerListener(new MyFirstTriggerListener());
        scheduler.getListenerManager().addTriggerListener(new MySecondTriggerListener());


        // 7. 启动调度器
        scheduler.start();

    }

    // 重新启动之后, 并无监听. 说明quartz并不会持久化监听器
    @Test
    public void start() throws SchedulerException {
        this.scheduler.start();

    }

}

2.4 测试输出

从输出结果来看, 可以发现执行步骤:

  1. 执行监听器1 的triggerFired方法
  2. 执行监听器2 的triggerFired方法
  3. 执行定时任务的方法
  4. 执行监听器2的triggerComplete的方法
  5. 执行监听器1的triggerComplete的方法
myFirstTriggerListener-triggerFired
mySecondTriggerListener-triggerFired
2019-04-10T18:15:40.346-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
myFirstTriggerListener-triggerComplete
mySecondTriggerListener-triggerComplete
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!