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 的triggerFired方法
- 执行监听器2 的triggerFired方法
- 执行定时任务的方法
- 执行监听器2的triggerComplete的方法
- 执行监听器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
来源:https://blog.csdn.net/zongf0504/article/details/89241478