我们在上章中有承诺过会花更多时间来讲 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 显示了这个动作。

UNIX Cron 执行 0 8 * * * echo "WAKE UP" 2>$1 /dev/console  表达式

2. 使用 Quartz CronTrigger

在现实世界里,作业计划通常比 SimpleTrigger 能支持的复杂得多。CronTrigger 就可用于指定非常复杂的计划,这种计划不错,因为也是我们发现需要这么做的。在我们深入到 CronTrigger 之前,让我们先看一个例子。代码 5.1 所示的是一个使用 CronTrigger (连同一个 Quartz cron 表达式) 来部署前面例子中的 PrintInfoJob。代码中的大部分内容与前面章节的例子相同。唯一不同点是我们使用了 CronTrigger 替代了 SimpleTrigger。正因为如此,我们不得不为它提供了一个 cron 表达式。
代码 5.1. 简单使用 CronTrigger 来部署一个 Job

  1. public class Listing_5_1 {
  2. static Log logger = LogFactory.getLog(Listing_5_1.class);
  3. public static void main(String[] args) {
  4. Listing_5_1 example = new Listing_5_1();
  5. example.runScheduler();
  6. }
  7. public void runScheduler() {
  8. Scheduler scheduler = null;
  9. try {
  10. // Create a default instance of the Scheduler
  11. scheduler = StdSchedulerFactory.getDefaultScheduler();
  12. scheduler.start();
  13. logger.info("Scheduler was started at " + new Date());
  14. // Create the JobDetail
  15. JobDetail jobDetail =
  16. new JobDetail("PrintInfoJob",
  17. Scheduler.DEFAULT_GROUP,
  18. PrintInfoJob.class);
  19. // Create a CronTrigger
  20. try {
  21. // CronTrigger that fires @7:30am Mon - Fri
  22. CronTrigger trigger = new
  23. CronTrigger("CronTrigger", null,
  24. "0 30 7 ? * MON-FRI");
  25. scheduler.scheduleJob(jobDetail, trigger);
  26. } catch (ParseException ex) {
  27. logger.error("Error parsing cron expr", ex);
  28. }
  29. } catch (SchedulerException ex) {
  30. logger.error(ex);
  31. }
  32. }
  33. }

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 表达式的格式。

Cron 触发器及相关内容 (第一部分)相关推荐

  1. Cron 触发器及相关内容 (第四部分)

    七. Cron 表达式 Cookbook 此处的 Cron 表达式 cookbook 旨在为常用的执行需求提供方案.尽管不可能列举出所有的表达式,但下面的应该为满足你的业务需求提供了足够的例子. ·分 ...

  2. Cron 触发器及相关内容 (第三部分)

    四. 为 CronTrigger 使用起迄日期 Cron 表达式是用来决定一个 Trigger 被触发执行一个 Job 的日期和次数.当你创建一个 CronTrigger 实例,假如没为它指定一个开始 ...

  3. Cron 触发器及相关内容 (第二部分)

    三. cron 表达式的格式 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别.区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX ...

  4. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  5. GIS讲堂第一课-开源GIS环境搭建相关内容

    概述: 昨日下午2点,"GIS讲堂-第一课"-<开源GIS环境搭建相关内容>在众目期待中结束了,下面就本节课的内容给大家做一个汇报,同时也希望没有能够参与到直播的童鞋们 ...

  6. android Wifi开发相关内容

    今天,简单讲讲android里如何使用WifiManager. 之前,我看代码时,看到了wifi相关的代码,发现自己对于这个内容的使用还很不熟悉,所以在网上查找资料,最终解决了问题.这里记录一下. 移 ...

  7. Django模板语言相关内容

    Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言 ...

  8. B站回应视频监控被破解上传:下架相关内容 封禁账号

    1月18日消息,昨日晚间,哔哩哔哩(B站)官方微博发布公告称,"今日接到用户举报,称疑似有人使用非法手段破解摄像头,上传视频监控画面至B站.我们第一时间组织排查,下架了相关内容." ...

  9. ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章)

    ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章) 导读:您将了解如何使用机器学习,了解需要管理的各种变更场景,以及基于ml的软件开发的迭代性质.最后,我们提供了MLOps的定 ...

最新文章

  1. 数据库之事务及事务的 ACID 性质
  2. 【LeetCode】图论 graph(共20题)
  3. MFC日志(2011.4.9)
  4. python爬取个人信息_Python爬取个人支付宝朋友信息操作示例
  5. 用户行为分析面面观之二
  6. 首届全国大学生工程训练综合能力竞赛圆满落幕
  7. qt.qpa.xcb: could not connect to display解决
  8. 用C#实现汉字转化为拼音
  9. python数据分析多元 线性回归
  10. (附源码)ssm高校实验室系统 毕业设计 800008
  11. html(h5)页面实现微信js分享
  12. linux编译CH340驱动报错,CH340 Linux驱动使用教程
  13. Unity 物体(Rigibody组件)碰撞穿透、碰撞抖动
  14. Windows7下固态硬盘安装Linux Mint 18双系统
  15. 蓝牙/zigbee/nrr24xx
  16. 解析python爱心代码(码农高天版)
  17. [BUUCTF]达芬奇密码
  18. 一种用于模拟电晕放电的高效半拉格朗日算法(Matlab代码实现)
  19. 华为OD机试题 - 招聘(JavaScript)| 机考必刷
  20. Java开发需要学什么!java软件工程师简历格式模板

热门文章

  1. java堆算法_用Java写算法之七:堆排序
  2. blink usb无线网卡驱动 linux,最新blink随身wifi驱动下载地址电脑版-CC软件
  3. 《代码大全2》高质量子程序的5个关键点
  4. 选择在何处重构(下)
  5. 前端框架 Bootstrap 5.0 alpha 发布
  6. 谈判失败:Oracle 杀死 Java EE
  7. 加速ASP.NET Core WEB API应用程序——第2部分
  8. 使用.NET Core 2.1,RabbitMQ,SignalR,EF Core 2.1和Angular 6开发微服务
  9. 四川专科学校排名四川计算机,四川省现代计算机职业学院2020年排名
  10. coreldraw凹槽_CorelDRAW教程 打造逼真静物写生油画