Quartz Job Scheduling Framework[翻译]第五章. Cron 触发器及相关内容 (第三部分)

四. 为 CronTrigger 使用起迄日期


Cron 表达式是用来决定一个 Trigger 被触发执行一个 Job 的日期和次数。当你创建一个 CronTrigger 实例,假如没为它指定一个开始时间,这个 Trigger 当然就会假定是在依赖于 Cron 表达式尽早的被触发。例如,如果你用这个表达式

0 * 14-20 * * ?

这个 Trigger 会在每天的从下午 2 点到下午的 7:59 间的每分钟触发一次。一旦你运行了这个表达式的 CronTrigger,假如当前是下午 2 点后(不能超过 7:59 PM--译者注),它将会立即触发。它会在每天无限期的被触发。

另一方面,倘若你希望这个计划直到下一天才开始,并且只执行两天,你就可以用 CronTriggersetStartTime()setEndTime() 方法来形成一个 "定时箱" 来触发。代码 5.2 描述了限定 CronTrigger 仅触发两天的例子。

代码 5.2. 你可以对 CronTrigger 用 startTime 和 endTime
 1public class Listing_5_2 {
 2     static Log logger = LogFactory.getLog(Listing_5_2.class);
 3
 4     public static void main(String[] args) {
 5          Listing_5_2 example = new Listing_5_2();
 6          example.runScheduler();
 7     }
 8
 9     public void runScheduler() {
10          Scheduler scheduler = null;
11
12          try {
13
14              // Create a default instance of the Scheduler
15              scheduler = StdSchedulerFactory.getDefaultScheduler();
16              scheduler.start();
17              logger.info("Scheduler was started at " + new Date());
18
19              // Create the JobDetail
20              JobDetail jobDetail = new JobDetail("PrintInfoJob",
21                        Scheduler.DEFAULT_GROUP,
22                                    PrintInfoJob.class);
23
24              // Create a CronTrigger
25              try {
26                   // cron that fires every min from 2  8pm
27                   CronTrigger trigger =
28                                    new CronTrigger("MyTrigger", null,
29                                                   "0 * 14-20 * * ?");
30
31                   Calendar cal = Calendar.getInstance();
32                   // Set the date to 1 day from now
33                   cal.add(Calendar.DATE, 1);
34                   trigger.setStartTime(cal.getTime());
35
36                   // Move ahead 2 days to set the end time
37                   cal.add(Calendar.DATE, 2);
38                   trigger.setEndTime(cal.getTime());
39
40                   scheduler.scheduleJob(jobDetail, trigger);
41              } catch (ParseException ex) {
42                   logger.error("Couldn't parse cron expr", ex);
43              }
44
45         } catch (SchedulerException ex) {
46              logger.error(ex);
47         }
48    }
49}

代码 5.2 中的例子使用了 java.util.Calendar 来为 Trigger 选择一个开始和结束时间周期。在上面例子中,Trigger 将会在 Scheduler 启动后的下一天开始触发,并只在开始触发后的两天内有效。

使用 CronTrigger 的 startTimeendTime 属性的效果有点像 SimpleTrigger

五. 为 CronTrigger 使用 TriggerUtils

在第四章,"安排 Job" 中介绍了 org.quartz 包中的 TriggerUtils 类,它简化了两种类型的 Trigger 的创建。只要可能的话,你应该尝试用 TriggerUtils 类的方法来创建你的 Trigger。

例如,假如你需要在每天的下午 5:30 执行一个 Job,你可以用下面的代码:
1try {
2
3  // A CronTrigger that fires @ 5:30PM
4  CronTrigger trigger = new CronTrigger("CronTrigger", null, "0 30 17 ? * *");
5} catch (ParseException ex) {
6  logger.error("Couldn't parse cron expression", ex);
7}

或者你能用上 TriggerUtils,如下:
1  // A CronTrigger that fires @ 5:30PM
2Trigger trigger = TriggerUtils.makeDailyTrigger(17, 30);
3trigger.setName("CronTrigger");

TriggerUtils 使得我们更简单方便的使用 Trigger,而又未放弃太多的灵活性。

六. 在 JobInitializationPlugin 中使用 CronTrigger

尽管我们要到第八章,"使用 Quartz 插件" 才会讲到插件,但还是值得提前展现一下 CronTrigger 如何应用于  quartz_jobs.xml 文件中来指定 Job 信息的。JobInitialzationPlugin 可用来从 XML 文件中加载 Job 的信息。

正如 SimpleTrigger 一样,你可在 XML 文件中指定 CronTrigger 的表达式,并且 Quartz 的 Scheduler 将会利用这一信息来安排你的 Job。这对于你想在你的程序代码之外声明你的 Job 信息时特别方便。代码 5.3 显示了 quartz_jobs.xml 文件内容,它被 JobInitializationPlugin  用来加作 Job 信息。

代码 5.3. CronTrigger 可在 XML 文件中指定,并由 JobInitializationPlugin 加载
 1<?xml version='1.0' encoding='utf-8'?>
 2
 3<quartz>
 4  <job>
 5    <job-detail>
 6      <name>PrintInfoJob</name>
 7    <group>DEFAULT</group>
 8    <description>
 9      A job that prints out some basic information.
10    </description>
11    <job-class>
12      org.cavaness.quartzbook.common.PrintInfoJob
13    </job-class>
14   </job-detail>
15
16   <trigger>
17    <cron>
18     <name>printJobInfoTrigger</name>
19     <group>DEFAULT</group>
20     <job-name>PrintInfoJob</job-name>
21     <job-group>DEFAULT</job-group>
22
23      <!-- Fire 7:30am Monday through Friday -->
24     <cron-expression>0 30 7 ? * MON-FRI</cron-expression>
25    </cron>
26   </trigger>
27  </job>
28</quartz>

代码  5.3 中的 Cron 表达式与 代码 5.1 中。当 Quartz 加载这个 XML 后,就会安排 PrintInfoJob (也已在 XML  中列出) 在从星期一到星期五的早上 7:30 执行。关于 JobInitializationPlugin 更多的说明见第八章。 永久链接 https://yanbin.blog/quartz-job-scheduling-framework-5-3/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。