五. 监听 Scheduler 事件
org.quartz.SchedulerListener 接口包含了一系列的回调方法,它们会在 Scheduler 的生命周期中有关键事件发生时被调用。代码 7.9 列出了包括在 SchedulerListener 接口的方法。
代码 7.9. org.quartz.SchedulerListener 接口中的方法
| 1 2 3 4 5 6 7 8 9 10 11 | public interface SchedulerListener {     public void jobScheduled(Trigger trigger);     public void jobUnscheduled(String triggerName, String triggerGroup);     public void triggerFinalized(Trigger trigger);     public void triggersPaused(String triggerName, String triggerGroup);     public void triggersResumed(String triggerName,String triggerGroup);     public void jobsPaused(String jobName, String jobGroup);     public void jobsResumed(String jobName, String jobGroup);     public void schedulerError(String msg, SchedulerException cause);     public void schedulerShutdown(); } | 
正如你从代码 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 实现
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | package org.cavaness.quartzbook.chapter7; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.SchedulerException; import org.quartz.SchedulerListener; import org.quartz.Trigger; public class SimpleSchedulerListener implements SchedulerListener {      Log logger = LogFactory.getLog(SimpleSchedulerListener.class);      public void jobScheduled(Trigger trigger) {           String jobName = trigger.getJobName();           logger.info(jobName + " has been scheduled");      }      public void jobUnscheduled(String triggerName,           String triggerGroup) {           if (triggerName == null) {                // triggerGroup is being unscheduled                logger.info(triggerGroup + " is being unscheduled");           } else {                logger.info(triggerName + " is being unscheduled");           }      }      public void triggerFinalized(Trigger trigger) {           String jobName = trigger.getJobName();           logger.info("Trigger is finished for " + jobName);      }      public void triggersPaused(String triggerName,           String triggerGroup) {           if (triggerName == null) {                // triggerGroup is being unscheduled                logger.info(triggerGroup + " is being paused");           } else {               logger.info(triggerName + " is being paused");           }      }      public void triggersResumed(String triggerName,           String triggerGroup) {           if (triggerName == null) {               // triggerGroup is being unscheduled               logger.info(triggerGroup + " is now resuming");           } else {               logger.info(triggerName + " is now resuming");           }     }     public void jobsPaused(String jobName, String jobGroup) {          if (jobName == null) {               // triggerGroup is being unscheduled               logger.info(jobGroup + " is pausing");          } else {               logger.info(jobName + " is pausing");          }     }     public void jobsResumed(String jobName, String jobGroup) {          if (jobName == null) {               // triggerGroup is being unscheduled               logger.info(jobGroup + " is now resuming");          } else {               logger.info(jobName + " is now resuming");          }     }     public void schedulerError(String msg, SchedulerException cause) {          logger.error(msg, cause.getUnderlyingException());     }     public void schedulerShutdown() {          logger.info("Scheduler is being shutdown");     } } | 
和前面的例子一样,代码 7.10 中的 SimpleSchedulerListener 只提供了监听方法的简单实现。代码 7.11 使用了 SimpleSchedulerListener 类。
代码 7.11. 使用 SimpleSchedulerListener
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package org.cavaness.quartzbook.chapter7; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.cavaness.quartzbook.common.PrintInfoJob; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerListener; import org.quartz.Trigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class Listing_7_11 {      static Log logger = LogFactory.getLog(Listing_7_11.class);      public static void main(String[] args) {           Listing_7_11 example = new Listing_7_11();           try {                example.startScheduler();           } catch (SchedulerException ex) {                logger.error(ex);           }      }      public void startScheduler() throws SchedulerException {          // Create an instance of the factory          Scheduler scheduler = null;          // Create the scheduler and JobDetail          scheduler = StdSchedulerFactory.getDefaultScheduler();          // Create and register the scheduler listener          SchedulerListener schedulerListener =               new SimpleSchedulerListener();          scheduler.addSchedulerListener(schedulerListener);          // Start the scheduler          scheduler.start();          logger.info("Scheduler was started at " + new Date());          // Create the JobDetail          JobDetail jobDetail = new JobDetail("PrintInfoJob",                    Scheduler.DEFAULT_GROUP, PrintInfoJob.class);          /*           * Set up a trigger to start firing now, with no end           * date/time, repeat forever and have 5 secs           * between each firing.           */          Trigger trigger = TriggerUtils.makeSecondlyTrigger(5);          trigger.setName("SimpleTrigger");          trigger.setStartTime(new Date());          // Register the JobDetail and Trigger          scheduler.scheduleJob(jobDetail, trigger);      } } | 
相比于前面的例子,我们在代码 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 Blog
[版权声明]  本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
"我们也改变了 Trigger 只重复两次而不是无限的运行"
哪里有设置只重复两次啊?