Quartz Tutorial 6 - TriggerListeners and JobListeners

Quartz Tutorial 6 - TriggerListeners and JobListeners

Quartz Tutorial 6 - TriggerListeners and JobListeners

监听器是在调度器内部基于事件执行动作的对象。顾名思义,TriggerListeners监听与触发器相关的事件,JobListeners监听与作业有关的事件。

触发器相关的时间包括:触发、未触发(misfire)、触发结束(触发的作业执行完成)

  • org.quartz.TriggerListener

    1
    2
    3
    4
    5
    6
    7
    
    public interface TriggerListener {
        public String getName();
        public void triggerFired(Trigger trigger, JobExecutionContext context);
        public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);
        public void triggerMisfired(Trigger trigger);
        public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode);
    }
    

作业相关的事件包括:作业将要执行的通知,作业完成的通知

  • org.quartz.JobListener
1
2
3
4
5
6
public interface JobListener {
    public String getName();
    public void jobToBeExecuted(JobExecutionContext context);
    public void jobExecutionVetoed(JobExecutionContext context);
    public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException);
}

Using Your Own Listeners

要创建一个监听器,需要创建一个实现了org.quartz.TriggerListener或者org.quartz.JobListener接口的类对象。然后在运行时向调度器注册,而且必须要给它一个名字(或者必须能通过getName()方法得知它们的名字)

为了用着方便,除了动手实现接口之外,你也可以通过扩展JobListenerSupportTriggerListenerSupport类,然后只需要重写你用得上的事件处理方法即可。

监听器使用调度器的ListenerManager方法向调度器注册,此外还用到了一个匹配器用于描述该监听器需要监听的作业或触发器。

监听器是运行时向调度器注册的,而且不随着作业或触发器一起存储在JobStore中。这是因为监听器一般作为与应用的集成点。因此,每次程序运行,监听器都要向调度器注册

  • 添加对特定作业监听的JobListener

    1
    
    scheduler.getListenerManager().addJobListener(myJobListener, KeyMatcher.keyEquals(new JobKey("myJobName", "myJobGroup")));
    

    加入关于匹配器等其他类的静态导入,能把代码写得更清晰点:

    1
    2
    3
    4
    5
    6
    7
    
    import static org.quartz.JobKey.*;
    import static org.quartz.KeyMatcher.*;
    import static org.quartz.GroupMatcher.*;
    import static org.quartz.AndMatcher.*;
    import static org.quartz.OrMatcher.*;
    import static org.quartz.EverythingMatcher.*;
    ...
    

    上例就可以写成

    1
    
    scheduler.getListenerManager().addJobListener(myJobListener, keyEquals(jobKey("myJobName", "myJobGroup")));
    
  • 添加对特定组内所有任务进行监听的监听器

    1
    
    scheduler.getListenerManager().addJobListener(myJobListener, groupEquals("myJobGroup"));
    
  • 添加对两个特定组内所有任务进行监听的监听器

    1
    
    scheduler.getListenerManager().addJobListener(myJobListener, or(groupEquals("myJobGroup1"), groupEquals("myJobGroup2")));
    
  • 添加对所有任务进行监听的监听器

    1
    
    scheduler.getListenerManager().addJobListener(myJobListener, allJobs());
    

同样的,注册触发器监听器也是这样子。

大部分Quartz的用户都不会用到监听器,但它还是很有用的,它可以让你的程序监听事件通知而作业本身又不需要显式通知。