Quartz Cron表达式的二三事

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

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

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

 

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

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

 

2. Quartz Cron表达式语法.net

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

  

    只不过我以为有几件事须要注意:blog

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

   "*"意为该域全部的值,"?"为不为该域指定值。具体用得时候,"?"只有Day of Month和Day of week用到,并且咱们在用的时候这两个域有且只有一个"?",由于同时指定值是会有歧义的,你会不肯定到底哪天来执行。ast

   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日下午

相关文章
相关标签/搜索