第五章. Cron 触发器及相关内容
我们在上章中有承诺过会花更多时间来讲 Quartz 的 CronTrigger,所以不会让你失望的。SimpleTrigger 对于需要在指定的毫秒处及时执行的作业还是不错的,但是假如你的作业需要更复杂的执行计划时,你也就要 CronTrigger 给你提供更强更灵活的功能。
一. Cron 的快速一课
cron 这一观念是来自于 UNIX 世界。在 UNIX 中,cron 是一个运行于后台的守护程序,它负责所有基于时间的事件。尽管 Quartz 除相同的名字和相似的表达式语法外,并未分享到 UNIX cron 别的东西,我们还是值得花几个段落去理解 cron 背后的历史。我们这里的目标不是搞混 UNIX cron 表达式和 Quartz 的 cron 表达式,但是你应该了解 Quartz 表达式的历史,并探索为什么他们运作起来很像。这儿明显有许多有意图的相似性。
有许多不同版本的 UNIX Cron你会发现不同版本的 cron,每一种都有些微地差异。我们仅着眼于与 Quartz CronTrigger 的比较,因此我们只讨论不同版本 UNIX cron 共性的东西。 |
UNIX cron 守护进程每隔一分钟被唤醒一次去检查叫做 crontabs 的配置文件。(Crontab 是 CRON 和 TABLE 的连写,其中配置有 cron 守护进程的作业列表和其他的指令。)守护进程检查存储在 crontabs 中的命令并决定是否有要执行的任务。
·UNIX Cron 的格式
你可以认为 UNIX crontab 是 Trigger 和 Job 的组合,因为它们同时列出来执行计划和要执行的命令(job)。
Cron Expression 的格式
crontab 格式包含六段,前五段为执行计划,第六段为要执行的命令。(Quartz cron 表达式有七段。) 下面这些是执行计划的五个字段:
·分 (00-59)
·时 (00-23)
·日 (1-31)
·月 (1-12)
·周 (0-6 或 sun-sat)
UNIX cron 格式表达式中允许出现一些特殊的字符,例如星号(*),它用来匹配所有值。这作有一个 UNIX crontab 的例子:
0 8 * * * echo "WAKE UP" 2>$1 /dev/console
这一 crontab 条目在每天早上8点打印字符串 "WAKE UP" 到 UNIX 的设置 /dev/console 上。图 5.1 显示了这个动作。
[点击看全图]
2. 使用 Quartz CronTrigger
在现实世界里,作业计划通常比 SimpleTrigger 能支持的复杂得多。CronTrigger 就可用于指定非常复杂的计划,这种计划不错,因为也是我们发现需要这么做的。在我们深入到 CronTrigger 之前,让我们先看一个例子。代码 5.1 所示的是一个使用 CronTrigger (连同一个 Quartz cron 表达式) 来部署前面例子中的 PrintInfoJob。代码中的大部分内容与前面章节的例子相同。唯一不同点是我们使用了 CronTrigger 替代了 SimpleTrigger。正因为如此,我们不得不为它提供了一个 cron 表达式。
代码 5.1. 简单使用 CronTrigger 来部署一个 Job
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 |
public class Listing_5_1 { static Log logger = LogFactory.getLog(Listing_5_1.class); public static void main(String[] args) { Listing_5_1 example = new Listing_5_1(); example.runScheduler(); } public void runScheduler() { Scheduler scheduler = null; try { // Create a default instance of the Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); logger.info("Scheduler was started at " + new Date()); // Create the JobDetail JobDetail jobDetail = new JobDetail("PrintInfoJob", Scheduler.DEFAULT_GROUP, PrintInfoJob.class); // Create a CronTrigger try { // CronTrigger that fires @7:30am Mon - Fri CronTrigger trigger = new CronTrigger("CronTrigger", null, "0 30 7 ? * MON-FRI"); scheduler.scheduleJob(jobDetail, trigger); } catch (ParseException ex) { logger.error("Error parsing cron expr", ex); } } catch (SchedulerException ex) { logger.error(ex); } } } |
代码 5.1 中的例子使用了如下 cron 表达式:
0 30 7 ? * MON-FRI
当被调度器解释后,它会引起 Trigger 在星期一至星期五的早上 7:30 被激发。让我们来看看 Quartz CronTrigger 的 cron 表达式的格式。
本文链接 https://yanbin.blog/quartz-job-scheduling-framework-5-1/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。