# 触发器监听器和作业监听器

监听器是您创建的对象,用于根据调度程序中发生的事件执行操作。正如您可能猜到的,触发器监听器接收与触发器相关的事件,作业监听器接收作业相关的事件。

触发器相关事件包括:触发器触发、触发器无触发(在本文档的“触发器”部分讨论)和触发器完成(触发器触发的作业完成)。

org.quartz.TriggerListener接口

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接口

public interface JobListener {

    public String getName();

    public void jobToBeExecuted(JobExecutionContext context);

    public void jobExecutionVetoed(JobExecutionContext context);

    public void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException);

}

# 使用自定义监听器

要创建监听器,只需创建一个实现org.quartz.TriggerListener和(或)org.quartz.JobListener接口的对象。然后,监听器在运行时向调度程序注册,并且必须指定名称(或者,必须通过getName()方法公布自己的名称)。

为了方便起见,除了实现这些接口之外,您的类还可以扩展JobListenerSupportTriggerListenerSupport类,并简单地覆盖您感兴趣的事件。

监听器与一个匹配器一起注册到调度器的监听器管理中心中,该匹配器描述了监听器希望接收事件的哪些作业或触发器。

监听器在运行时向调度程序注册,不会与作业和触发器一起存储在JobStore中。这是因为监听器通常是应用程序的集成点。因此,每次运行应用程序时,都需要向调度程序重新注册监听器。

添加对特定作业有效的作业监听器:

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

您可能希望对匹配器和关键类使用静态导入,这将使您的匹配器定义更加清晰:

import static org.quartz.JobKey.*;
import static org.quartz.impl.matchers.KeyMatcher.*;
import static org.quartz.impl.matchers.GroupMatcher.*;
import static org.quartz.impl.matchers.AndMatcher.*;
import static org.quartz.impl.matchers.OrMatcher.*;
import static org.quartz.impl.matchers.EverythingMatcher.*;
...etc.

这将上述示例转化为:

scheduler.getListenerManager().addJobListener(myJobListener, jobKeyEquals(jobKey("myJobName", "myJobGroup")));

添加对特定组的所有作业有效的作业监听器:

scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));

添加对两个特定组的所有作业有效的作业监听器:

scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));

添加对所有作业有效的作业监听器:

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

注册触发器监听器的方式与此(作业监听器)相同。

大多数Quartz用户不使用监听器,但当应用程序需要通知事件时,监听器很方便,而作业本身不必明确通知应用程序。


微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。