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

       

  • 相关阅读:
    (二十三)、int与integer的区别
    (二十一)、Java序列化与反序列化
    (二十)、MVC设计思想的优缺点
    (十九)、列出自己常用的JDK包
    (十八)、Session与Cookie区别
    win10 下安装laravel
    冒泡排序
    常用php正则表达式
    AE网站
    AE压缩网站
  • 原文地址:https://www.cnblogs.com/KevinSong/p/4422769.html
Copyright © 2020-2023  润新知