3.3.2、TriggerListener
TriggerListener
,与触发器Trigger
相关的事件都会被监听,它既可以全局监听,也可以实现局部监听。
所谓局部监听,就是对某个Trigger
的名称或者组进行监听,简单示例如下:
public class SimpleTriggerListener implements TriggerListener { /** * Trigger监听器的名称 * @return */ @Override public String getName() { return "mySimpleTriggerListener"; } /** * Trigger被激发 它关联的job即将被运行 * @param trigger * @param context */ @Override public void triggerFired(Trigger trigger, JobExecutionContext context) { System.out.println("myTriggerListener.triggerFired()"); } /** * Trigger被激发 它关联的job即将被运行, TriggerListener 给了一个选择去否决 Job 的执行,如果返回TRUE 那么任务job会被终止 * @param trigger * @param context * @return */ @Override public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { System.out.println("myTriggerListener.vetoJobExecution()"); return false; } /** * 当Trigger错过被激发时执行,比如当前时间有很多触发器都需要执行,但是线程池中的有效线程都在工作, * 那么有的触发器就有可能超时,错过这一轮的触发。 * @param trigger */ @Override public void triggerMisfired(Trigger trigger) { System.out.println("myTriggerListener.triggerMisfired()"); } /** * 任务完成时触发 * @param trigger * @param context * @param triggerInstructionCode */ @Override public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) { System.out.println("myTriggerListener.triggerComplete()"); } }
与之类似,需要将SimpleTriggerListener
注册到Scheduler
容器中!
// 创建一个Scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 创建并注册一个全局的Trigger Listener scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener(), EverythingMatcher.allTriggers()); // 创建并注册一个局部的Trigger Listener //scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("myTrigger", "myJobTrigger"))); // 创建并注册一个特定组的Trigger Listener //scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener(), GroupMatcher.groupEquals("myTrigger")); // 启动Scheduler scheduler.start();
3.3.3、JobListener
JobListener
,与任务执行Job
相关的事件都会被监听,和Trigger
一样,既可以全局监听,也可以实现局部监听。
简单示例如下:
public class SimpleJobListener implements JobListener { /** * job监听器名称 * @return */ @Override public String getName() { return "mySimpleJobListener"; } /** * 任务被调度前 * @param context */ @Override public void jobToBeExecuted(JobExecutionContext context) { System.out.println("simpleJobListener监听器,准备执行:"+context.getJobDetail().getKey()); } /** * 任务调度被拒了 * @param context */ @Override public void jobExecutionVetoed(JobExecutionContext context) { System.out.println("simpleJobListener监听器,取消执行:"+context.getJobDetail().getKey()); } /** * 任务被调度后 * @param context * @param jobException */ @Override public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { System.out.println("simpleJobListener监听器,执行结束:"+context.getJobDetail().getKey()); } }
同样的,将SimpleJobListener
注册到Scheduler
容器中,即可实现监听!
// 创建一个Scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 创建并注册一个全局的Job Listener scheduler.getListenerManager().addJobListener(new SimpleJobListener(), EverythingMatcher.allJobs()); // 创建并注册一个指定任务的Job Listener //scheduler.getListenerManager().addJobListener(new SimpleJobListener(), KeyMatcher.keyEquals(JobKey.jobKey("myJob", "myJobGroup"))); // 将同一任务组的任务注册到监听器中 //scheduler.getListenerManager().addJobListener(new SimpleJobListener(), GroupMatcher.jobGroupEquals("myJobGroup")); // 启动Scheduler scheduler.start();
3.3.4、小结
如果想多个同时监听,将其依次加入即可!
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //添加SchedulerListener监听器 scheduler.getListenerManager().addSchedulerListener(new SimpleSchedulerListener()); // 创建并注册一个全局的Trigger Listener scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener(), EverythingMatcher.allTriggers()); // 创建并注册一个全局的Job Listener scheduler.getListenerManager().addJobListener(new SimpleJobListener(), EverythingMatcher.allJobs()); // 启动Scheduler scheduler.start();
四、单体应用介绍
下面我们以每5秒执行一次任务为例,采用SpringBoot + Quartz
进行技术实现。流程如下!
4.1、引入 quartz 包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
4.2、编写具体任务
public class TestTask implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("testTask:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } }
4.3、编写任务调度配置服务
与上面的参数基本一致
@Configuration public class TestTaskConfig { @Bean public JobDetail testQuartz() { return JobBuilder.newJob(TestTask.class) .usingJobData("jobData", "test") .withIdentity("myJob", "myJobGroup") .storeDurably() .build(); } @Bean public Trigger testQuartzTrigger() { //5秒执行一次 return TriggerBuilder.newTrigger() .forJob(testQuartz()) .withIdentity("myTrigger", "myTriggerGroup") .startNow() .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); } }
4.4、任务测试
启动应用程序,即可观察到对应的任务运行状况!
如果需要创建多个定时任务,配置流程也类似!
只是这种静态配置方式多了会带来一个问题,比如,现在这个任务是每5秒跑一次,我现在想改成1个小时或者凌晨2点跑一次,这个时候就必须要改代码呢,但是我又不想改代码,基于此需求,利用数据库存储,我们可以将其改成动态配置!