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
来源:https://blog.csdn.net/zongf0504/article/details/89241498