Quartz Cron表达式的二三事

最近在解决产品上的一个需求,就是定期生成报告(Report),我们叫做Scheduled Report。

原理:UI获取用户输入的时间信息,后台使用Spring框架设置定时任务,这里定时任务用的就是 Quartz Cron表达式。

下面介绍下我学习的Quartz Cron表达式。

1. Quartz Cron表达式和Linux Cron表达式(Cron job)有何区别?

  其实语法非常像。一个大的区别时,Quartz Cron表达式提供最后一个可选参数"年",而Linux Cron表达式没有。

2. Quartz Cron表达式语法

  这里就附上一张官方的介绍表格。很多博文都有用到过。

  

只不过我觉得有几件事需要注意:

   A. "*" 和 "?"的区别

   "*"意为该域所有的值,"?"为不为该域指定值。具体用得时候,"?"只有Day of Month和Day of week用到,而且我们在用的时候这两个域有且只有一个"?",因为同时指定值是会有歧义的,你会不确定到底哪天来执行。

   B. "L"的用法

     这也是我们产品遇到的一个问题。最初我们在UI前台给用户的选项中如果是月度报告,提供了1-31天,31个选项来让用户选择。但是我们知道,有些月份,是没有31天得,最少的二月份可能只有28天。所以这样硬设定生成的Cron表达式会有问题,导致某些月份没有Report生成。所以这里我做了一下改进,利用Quartz表达式的"L"特性,"L"是指定为本月或本周的最后一天执行

   所以这里在UI上,我们显示的月天数选项是"1-28,last day"三个选项,理由如下:

     a. 1-28,每个月至少有28天,用户选择后一定会在那天成功执行。

   b. 用户选择"last day",我们就在每月最后一天执行,也能保证用户的报告每月生成。

     当然我们在UI上还提供了一个时区的选项,时间要先根据时区做下转换,再用于生成Cron表达式。

3. 下面列出"每天","每月","每周"执行的Quartz Cron表达式的写法

   A. 每天

    秒  分  时  *  *  ?

   B. 每月

   秒  分  时  每月的哪天(1-31,或"L")  *  ?

   C. 每周

     秒  分  时  ?  *  每周的哪天(1-7,注意1代表周日Sunday,而非周一Monday)

4. 参考

   A. http://www.blogjava.net/fancydeepin/archive/2012/06/12/quartz-cron.html

Kevin Song

2015年4月13日下午

 

时间: 2024-10-17 06:06:29

Quartz Cron表达式的二三事的相关文章

Quartz cron 表达式(linux 定时器,java 定时任务,spring task定时任务)

Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别.区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级.许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异. 在 UNIX cron 里,要执行的作业(或者说命令)是存放在 cron 表达式中的,在第六个域位置上.Quartz 用 cron 表达式存放执行计划.引用了 cron 表达式的 CronTrigger 在计划的时间里

JAVA quartz cron 表达式详解 日期表达式

quartz cron 表达式详解 字段         允许值               允许的特殊字符   秒           0-59                 , - * /   分           0-59                 , - * /   小时         0-23                 , - * /   日期         1-31                 , - * ? / L W C   月份         1-12

quartz cron表达式在线生成

最近使用了quartz定时器,有感于起cron表达式有点复杂,且无法实时判断定时时间是否正确,因此写了个在线表达式及根据表达式获得前10次执行时间. 访问地址如下:http://cron.g2room.com/ 使用如下: 打开主页如下: 点击cron配置或点击菜单栏,则进入到cron表达式配置界面: 界面分为5个部分:1.菜单栏.2.设置内容区.3.设置结果展示区.4.生成表达式展示区.5.表达式触发时间展示区. ?  菜单栏:展示cron表达式需要设置的字段项: ?  设置内容区:此区域为设

Quartz Cron表达式 在线生成器

Cron Expressions——Cron 表达式 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数)月(0~11) 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 7.年份(1970-2099) 其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符.由于"月份中的日期"和"星期中

quartz Cron表达式解读

CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronTrigger,你可以指定触发的时间表如"每星期五中午",或"每个工作日9:30时",甚至"每5分钟一班9:00和10:00逢星期一上午,星期三星期五".即便如此,SimpleTrigger一样,CronTrigger拥有的startTime指定的时间

QuartZ Cron表达式

 Cron Expressions cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表.        Seconds        Minutes        Hours        Day-of-Month        Month        Day-of-Week       Year (可选字段) 1)Cron表达式的格式:秒 分 时 日 月 周 年(可选). 字段名                 允许的值                        允许的

Cron表达式【二】

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month DayofWeek 每一个域可出现的字符如下: Seconds:可出现", - * /"四个字符,有效范围为0-59的整数 Minutes:可出现", - * /&quo

[转载]QuartZ Cron表达式

CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTrigger,你可以指定触发的时间表如"每星期五中午",或"每个工作日9:30时",甚至"每5分钟一班9:00和10:00逢星期一上午,星期三星期五".即便如此,SimpleTrigger一样,CronTrigger拥有的startTime指定的时间表

Quartz Cron表达式详解

Cron Expressions cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表. <cron-expression>0 0 0 15 * ?</cron-expression>:每个月的15号执行一次 秒 分 时 日 月 年 0:表示凌晨,*表示任意时间 0 0/10 0 15 * ?:每个月的15号每10分钟执行一次.        Seconds        Minutes        Hours        Day-of-Month