(翻译)Quartz官方教程——第七课:TriggerListeners 和 JobListeners

监听器是用来根据调度器发生的事件做出响应的对象。正如你想的那样,TriggerListeners接收触发器相关的事件,JobListeners接收任务相关的事件。

触发器相关的事件包括:任务触发,任务错过触发(在教程的触发器章节讨论过)以及触发完毕(及由触发器触发的任务执行完毕)。

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);
}

任务相关的事件包括:任务将要被执行的通知和任务执行完毕的通知

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()方法获取到名字)。

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

监听器向ListenerManager注册了一个匹配器,该匹配器描述了监听器想要从哪个任务/触发器接收事件。

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

 添加对特定作业感兴趣的JobListener:

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")));

添加对特定组的所有作业感兴趣的JobListener:

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

添加对两个特定组的所有作业感兴趣的JobListener:

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

添加对所有作业感兴趣的JobListener:

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

...注册TriggerListeners的工作方式相同。

大多数Quartz用户通常不需要使用监听器,但当应用程序需要接收事件通知的时候使用监听器会很方便,因为Job本身不必显式地通知应用程序。

猜你喜欢

转载自my.oschina.net/icebergxty/blog/1798444