前几天在jfinal项目中测试cron4j,发现一个问题,在社区搜了很久都没有解决
开始我的配置文件是这么写的,注意cron表达式
cron_jobs = job.task1, job.task2 #* cron 表达式由五部分组成:分 时 天 月 周 #* 分 :从 0 到 59 #* 时 :从 0 到 23 #* 天 :从 1 到 31,字母 L 可以表示月的最后一天 #* 月 :从 1 到 12,可以别名:jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov" and "dec" #* 周 :从 0 到 6,0 表示周日,6 表示周六,可以使用别名: "sun", "mon", "tue", "wed", "thu", "fri" and "sat" #* #* 数字 n:表示一个具体的时间点,例如 5 * * * * 表示 5 分这个时间点时执行 #* 逗号 , :表示指定多个数值,例如 3,5 * * * * 表示 3 和 5 分这两个时间点执行 #* 减号 -:表示范围,例如 1-3 * * * * 表示 1 分、2 分再到 3 分这三个时间点执行 #* 星号 *:表示每一个时间点,例如 * * * * * 表示每分钟执行 #* 除号 /:表示指定一个值的增加幅度。例如 n/m表示从 n 开始,每次增加 m 的时间点执行 job.task1.cron = 0/2 * * * * job.task1.class = com.wumugulu.test.crontab.FirstTask job.task1.daemon = false job.task1.enable = true job.task2.cron = 1/2 * * * * job.task2.class = com.wumugulu.test.crontab.SecondTask job.task2.daemon = true job.task2.enable = true
注意看上面代码的最后一行注释:“#* 除号 /:。。。”我的本意是让
FirstTask在每个小时的0,2,4,6,8。。。58分各执行一次
SecondTask在每个小时的1,3,5,7,9。。。59分各执行一次
但是,并没有达成目的,实际情况是每个小时FirstTask和SecondTask分别只在0分和1分执行了一次;而下一次执行就是1小时之后了(想想我浪费了多少时间吧,汗~~~);
估计和这位兄弟的情况类似 http://www.jfinal.com/share/425
网上查了很多帖子,开始一直以为是自己代码写的有问题,折腾了好几天没搞定;
后来实在没办法了,上到cron4j的官网看了下,发现了问题:
官网资料上显示cron表达式中关于除号,
并没有“n/m”的用法(但网上很多资料都是这么写的,汗~~~)
官网介绍的只有“*/m”和“n1-n2/m”两种用法;
于是把我的配置文件改了下:
job.task1.cron = 0-59/2 * * * * job.task2.cron = 1-59/2 * * * *
测试,结果正确。搞定,打完收工~~~
这个问题确实有点不好弄,所以后来我改进了 jfinal 手册中有关的内容,对例子进行了加强,建议下载一份最新版本的 jfinal 手册