Quartz Job Scheduling Framework[翻译]第七章. 实现 Quartz 监听器 (第四部分)

五. 监听 Scheduler 事件


org.quartz.SchedulerListener 接口包含了一系列的回调方法,它们会在 Scheduler 的生命周期中有关键事件发生时被调用。代码 7.9 列出了包括在 SchedulerListener 接口的方法。

代码 7.9. org.quartz.SchedulerListener 接口中的方法
 1public interface SchedulerListener {
 2    public void jobScheduled(Trigger trigger);
 3    public void jobUnscheduled(String triggerName, String triggerGroup);
 4    public void triggerFinalized(Trigger trigger);
 5    public void triggersPaused(String triggerName, String triggerGroup);
 6    public void triggersResumed(String triggerName,String triggerGroup);
 7    public void jobsPaused(String jobName, String jobGroup);
 8    public void jobsResumed(String jobName, String jobGroup);
 9    public void schedulerError(String msg, SchedulerException cause);
10    public void schedulerShutdown();
11}

正如你从代码 7.9 中列示看到的方法那样,SchedulerListener 是在 Scheduler 级别的事件产生时得到通知,不管是增加还是移除 Scheduler 中的 Job,或者是 Scheduler 遭遇到了严重的错误时。那些事件多是关于对 Scheduler 管理的,而不是专注于 Job 或 Trigger 的。

· jobScheduled() 和 jobUnscheduled() 方法

Scheduler 在有新的 JobDetail 部署或卸载时调用这两个中的相应方法。

· triggerFinalized() 方法

当一个 Trigger 来到了再也不会触发的状态时调用这个方法。除非这个 Job 已设置成了持久性,否则它就会从 Scheduler 中移除。

·triggersPaused() 方法

Scheduler 调用这个方法是发生在一个 Trigger 或 Trigger 组被暂停时。假如是 Trigger 组的话,triggerName 参数将为 null。

·triggersResumed() 方法

Scheduler 调用这个方法是发生成一个 Trigger 或 Trigger 组从暂停中恢复时。假如是 Trigger 组的话,triggerName 参数将为 null。

·jobsPaused() 方法

当一个或一组 JobDetail 暂停时调用这个方法。

·jobsResumed() 方法

当一个或一组 Job 从暂停上恢复时调用这个方法。假如是一个 Job 组,jobName 参数将为 null。

·schedulerError() 方法

在 Scheduler 的正常运行期间产生一个严重错误时调用这个方法。错误的类型会各式的,但是下面列举了一些错误例子:

    ·初始化 Job 类的问题

    ·试图去找到下一 Trigger 的问题

    ·JobStore 中重复的问题

    ·数据存储连接的问题

你可以使用 SchedulerException 的 getErrorCode() 或者 getUnderlyingException() 方法或获取到特定错误的更详尽的信息。

·schedulerShutdown() 方法

Scheduler 调用这个方法用来通知 SchedulerListener Scheduler 将要被关闭。

代码 7.10 展示了一个 SchedulerListener 实现

代码 7.10. 一个简单的 SchedulerListener 实现
 1package org.cavaness.quartzbook.chapter7;
 2
 3import org.apache.commons.logging.Log;
 4import org.apache.commons.logging.LogFactory;
 5import org.quartz.SchedulerException;
 6import org.quartz.SchedulerListener;
 7import org.quartz.Trigger;
 8
 9public class SimpleSchedulerListener implements SchedulerListener {
10     Log logger = LogFactory.getLog(SimpleSchedulerListener.class);
11
12     public void jobScheduled(Trigger trigger) {
13          String jobName = trigger.getJobName();
14          logger.info(jobName + " has been scheduled");
15     }
16
17     public void jobUnscheduled(String triggerName,
18          String triggerGroup) {
19
20          if (triggerName == null) {
21               // triggerGroup is being unscheduled
22               logger.info(triggerGroup + " is being unscheduled");
23          } else {
24               logger.info(triggerName + " is being unscheduled");
25          }
26     }
27
28     public void triggerFinalized(Trigger trigger) {
29          String jobName = trigger.getJobName();
30          logger.info("Trigger is finished for " + jobName);
31     }
32
33     public void triggersPaused(String triggerName,
34          String triggerGroup) {
35
36          if (triggerName == null) {
37               // triggerGroup is being unscheduled
38               logger.info(triggerGroup + " is being paused");
39          } else {
40              logger.info(triggerName + " is being paused");
41          }
42     }
43
44     public void triggersResumed(String triggerName,
45          String triggerGroup) {
46
47          if (triggerName == null) {
48              // triggerGroup is being unscheduled
49              logger.info(triggerGroup + " is now resuming");
50          } else {
51              logger.info(triggerName + " is now resuming");
52          }
53    }
54
55    public void jobsPaused(String jobName, String jobGroup) {
56         if (jobName == null) {
57              // triggerGroup is being unscheduled
58              logger.info(jobGroup + " is pausing");
59         } else {
60              logger.info(jobName + " is pausing");
61         }
62    }
63
64    public void jobsResumed(String jobName, String jobGroup) {
65         if (jobName == null) {
66              // triggerGroup is being unscheduled
67              logger.info(jobGroup + " is now resuming");
68         } else {
69              logger.info(jobName + " is now resuming");
70         }
71    }
72
73    public void schedulerError(String msg, SchedulerException cause) {
74         logger.error(msg, cause.getUnderlyingException());
75    }
76
77    public void schedulerShutdown() {
78         logger.info("Scheduler is being shutdown");
79    }
80}

和前面的例子一样,代码 7.10 中的 SimpleSchedulerListener 只提供了监听方法的简单实现。代码 7.11 使用了 SimpleSchedulerListener 类。

代码 7.11. 使用 SimpleSchedulerListener
 1package org.cavaness.quartzbook.chapter7;
 2
 3import java.util.Date;
 4
 5import org.apache.commons.logging.Log;
 6import org.apache.commons.logging.LogFactory;
 7import org.cavaness.quartzbook.common.PrintInfoJob;
 8import org.quartz.JobDetail;
 9import org.quartz.Scheduler;
10import org.quartz.SchedulerException;
11import org.quartz.SchedulerListener;
12import org.quartz.Trigger;
13import org.quartz.TriggerUtils;
14import org.quartz.impl.StdSchedulerFactory;
15
16public class Listing_7_11 {
17     static Log logger = LogFactory.getLog(Listing_7_11.class);
18
19     public static void main(String[] args) {
20          Listing_7_11 example = new Listing_7_11();
21          try {
22               example.startScheduler();
23          } catch (SchedulerException ex) {
24               logger.error(ex);
25          }
26     }
27
28     public void startScheduler() throws SchedulerException {
29
30         // Create an instance of the factory
31         Scheduler scheduler = null;
32
33         // Create the scheduler and JobDetail
34         scheduler = StdSchedulerFactory.getDefaultScheduler();
35
36         // Create and register the scheduler listener
37         SchedulerListener schedulerListener =
38              new SimpleSchedulerListener();
39
40         scheduler.addSchedulerListener(schedulerListener);
41
42         // Start the scheduler
43         scheduler.start();
44         logger.info("Scheduler was started at " + new Date());
45
46         // Create the JobDetail
47         JobDetail jobDetail = new JobDetail("PrintInfoJob",
48                   Scheduler.DEFAULT_GROUP, PrintInfoJob.class);
49
50         /*
51          * Set up a trigger to start firing now, with no end
52          * date/time, repeat forever and have 5 secs
53          * between each firing.
54          */
55         Trigger trigger = TriggerUtils.makeSecondlyTrigger(5);
56         trigger.setName("SimpleTrigger");
57         trigger.setStartTime(new Date());
58
59         // Register the JobDetail and Trigger
60         scheduler.scheduleJob(jobDetail, trigger);
61     }
62}

相比于前面的例子,我们在代码 7.11 中作了些小许改动,来实际促使更多的 SchedulerListener 方法被调用。在代码 7.11 中,Scheduler 创建后是在 Job 注册之前被启动的。这就使得在 Job 部署时 jobScheduled() 方法能得到调用。我们也改变了 Trigger 只重复两次而不是无限的运行。这样能强制 triggerFinalized() 方法被调用,因为这个 Trigger 不再有机会触发了。除了这些人为的条件外,使用 SchedulerListener 就和使用 Job 或 Trigger 监听器是一样的了。 永久链接 https://yanbin.blog/quartz-job-scheduling-framework-7-4/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。