最近在解决产品上的一个需求,就是定期生成报告(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日下午

 

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

  1. Spring 调度工具Quartz cron 表达式的格式

    http://chinaxxren.iteye.com/blog/839630 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别.区别之一就是 Quar ...

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

    原文地址:https://blog.csdn.net/feng27156/article/details/39293403 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但 ...

  3. Quartz Cron表达式 每周、每月执行一次

    原文:https://blog.csdn.net/qq_33432559/article/details/75633767 系统中通常有些需要自动执行的任务,这些任务可能每隔一段时间就要执行一次,也可 ...

  4. Quartz 之Quartz Cron表达式

    说到这个Quartz了,必不可少的就要说到我们的Triggger触发器,相信大家也都知道,我们在之前也说过了,Trigger又有两个子类,也就是两种方式,分别是:SimpleTrigger和CronT ...

  5. Quartz Cron表达式生成器

    格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明   是否必填  允许填写的值 允许的通配符   1  秒  是  0-59    , - * /  2  分  是  0 ...

  6. [quartz] - Cron表达式举例

    Quartz是一个任务调度框架.比如你遇到这样的问题 想每月25号,信用卡自动还款 想每年2月14日自己给当年暗恋女神发一封匿名贺卡 想每隔1小时,备份一下自己的SpringCloud学习笔记到云盘 ...

  7. quartz cron表达式在线生成

    近期使用了quartz定时器,有感于起cron表达式有点复杂.且无法实时推断定时时间是否正确,因此写了个在线表达式及依据表达式获得前10次运行时间. 訪问地址例如以下:http://cron.g2ro ...

  8. quartz Cron表达式生成详解

    简介 Cron作为一个Unix工具,已经存在很长一段时间了,用于实现任务调度的功能.CronTrigger类基于Cron而来. CronTrigger CronTriggers往往比SimpleTri ...

  9. QuartZ Cron表达式

     Cron Expressions cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表.        Seconds        Minutes        Hours     ...

随机推荐

  1. [USACO5.4]奶牛的电信Telecowmunication 最小割

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  2. [Node.jS]shelljs

    shelljs : https://www.npmjs.org/package/shelljs 要给可以替代Unix下shell脚本的库. require('shelljs/global'); if ...

  3. P1445 [Violet]樱花

    传送门 看到题目就要开始愉快地推式子 原式 $\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$ $\rightarrow \frac{x+y}{xy}=\frac{1}{n! ...

  4. p标签text-align:justify以及CSS文字两端对齐

    p标签样式添加text-align:justify; 那么就会左右对齐. 使用前: 使用后: CSS文字两端对齐 使用前: 代码: <style> div{ width:100px; he ...

  5. day30 锁 队列

    1.  守护进程 会随着主进程的结束而结束. 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daem ...

  6. python 基础及if while for语句

    #####变量######一.命名规则   1.正常命名  可以由字母,下划线和数字组成,不能以数字开头,不能和关键字重明   2.驼峰命名法    1)大驼峰:每一个单词的首字母都大写     Fi ...

  7. SpEL

    Spriing boot stater中根据配置文件中的条件 生成相应的bean, 以适应不同场景 @ConditionalOnExpression中使用SpEl,  支持各种条件表达式 String ...

  8. 自动化构建工具maven

    Maven是目前最流行的自动化构建工具,对于生产环境下多框架.多模块整合开发有重要作用.Maven 是一款在大型项目开发过程中不可或缺的重要工具. 一.什么是构建? 构建并不是创建,创建一个工程并不等 ...

  9. 为什么CPU缓存会分为一级缓存L1、L2、L3?有什么意义?

    https://baijiahao.baidu.com/s?id=1598811284058671259&wfr=spider&for=pc 简介:CPU缓存是CPU一个重要的组成部分 ...

  10. jenkins自动打IOS包(转发)

    投稿文章,作者:一缕殇流化隐半边冰霜(@halfrost) 前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段.用户们都是很挑剔的.如果一个公司的推广团队好不容易砸了重金推广了 ...