08.Quartz 监听器-SchedulerListener

谁说我不能喝 提交于 2019-11-28 18:18:56

SchedulerListener 是用于监控调度器scheduler 中添加,删除定时任务或触发器等操作, 和JobListener, TriggerListener类似, 但由有不同. SchedulerListener 全局唯一, 也就是说一个Scheduler 只能配置一个SchedulerListener 监听器.

1. SchedulerListener 接口

  • 和JobListener/TriggerListener类似, 自定义SchedulerListener 需要实现SchedulerListener接口或继承SchedulerListenerSupport, 并重写关注的方法. 这里笔者推荐使用第二种方式, 因为第一种方式需要实现方法太多.
  • SchedulerListener 定义的接口方法, 每一个方法都是监听对应的Scheduler中定义的方法.
  • SchedulerListener 也不会持久化到数据库, 更不支持分布式. 需要每次启动应用时注册.
public interface SchedulerListener {

    public void jobScheduled(Trigger trigger);

    public void jobUnscheduled(String triggerName, String triggerGroup);

    public void triggerFinalized(Trigger trigger);

    public void triggersPaused(String triggerName, String triggerGroup);

    public void triggersResumed(String triggerName, String triggerGroup);

    public void jobsPaused(String jobName, String jobGroup);

    public void jobsResumed(String jobName, String jobGroup);

    public void schedulerError(String msg, SchedulerException cause);

    public void schedulerStarted();

    public void schedulerInStandbyMode();

    public void schedulerShutdown();

    public void schedulingDataCleared();
}

2. 自定义SchedulerListener

2.1 继承SchedulerListenerSupport

public class MyScheduerListener extends SchedulerListenerSupport {

    @Override
    public void jobAdded(JobDetail jobDetail) {
        System.out.println("add job: " + jobDetail.getKey());
    }

    @Override
    public void jobPaused(JobKey jobKey) {
        System.out.println("pauseJob:" + jobKey);
    }

    @Override
    public void jobResumed(JobKey jobKey) {
        System.out.println("resumeJob:" + jobKey);
    }

    @Override
    public void jobDeleted(JobKey jobKey) {
        System.out.println("deleteJob:" + jobKey);
    }
}

2.2 测试用例

由于quartz 也不会持久化自定义SchedulerListener, 因此为了方便测试, 笔者依然选择RAM存储方式来测试。

public class Test09 extends BaseQuartzRamTest {

    // 测试job监听器
    @Test
    public void test_jobListener() throws SchedulerException, InterruptedException {

        // 需要放在最前面,添加scheduler 监听器
        scheduler.getListenerManager().addSchedulerListener(new MyScheduerListener());

        JobKey jobKey = JobKey.jobKey("listenerJob", "jobGroup7");
        TriggerKey triggerKey = TriggerKey.triggerKey("jobListenerTrigger", "triggerGroup7");

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


        // 4. 创建简单触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(1)
                        .repeatForever())
                .build();

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

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

        Thread.sleep(2000l);
        scheduler.pauseJob(jobKey);

        Thread.sleep(2000l);
        scheduler.resumeJob(jobKey);

        Thread.sleep(2000l);
        scheduler.deleteJob(jobKey);

    }
}

2.3 测试输出

笔者反复测试, 依然发现delete触发了两次, 不知为何. 在实际使用中需要注意.

add job: jobGroup9.listenerJob
[2019-04-01 12:11:59:299]-Scheduler quartz-scheduler-ram_$_NON_CLUSTERED started.
2019-04-01T12:11:59.356-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
2019-04-01T12:12:00.298-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
2019-04-01T12:12:01.297-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
pauseJob:jobGroup9.listenerJob
resumeJob:jobGroup9.listenerJob
2019-04-01T12:12:03.300-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
2019-04-01T12:12:03.301-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
2019-04-01T12:12:04.297-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
2019-04-01T12:12:05.298-org.zongf.learn.quartz.l01.job.ListenerJob- do job...
deleteJob:jobGroup9.listenerJob
deleteJob:jobGroup9.listenerJob
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!