用之前分享栏目中的cron4j做定时任务的代码,有疑问

整合cron4j在项目跑定时任务(处理业务数据以及发有邮件等),本地环境正常,处理数据也正确;但是放到服务器上之后,处理数据的记录重复了一遍或者三遍,邮件也重复一遍或者三遍,请问@jfinal波总,是否我代码中cron4j没有配置好?怎么解决呢

评论区

JFinal

2016-09-12 12:34

除了 cron4j 配置可能有错误以外,还要检查一下是不是 tomcat 配置的坑,请看这里:http://my.oschina.net/jfinal/blog/353062

JFinal

2016-09-12 12:44

把 cron4j 的配置表达式贴出来看看

九爷同学

2016-09-12 14:06

@JFinal
cron4j=task1,task2,task3
##########################
#每30分钟执行一次
##########################
task1.cron=30 * * * *
task1.class=com.lcbp.tools.timer.SysDoCartItemOrderJob
task1.enable=true
##########################
#每30分钟执行一次
##########################
task2.cron=30 * * * *
task2.class=com.lcbp.tools.timer.ParseVideoJob
task2.enable=true
##########################
#每周三执行一次
##########################
task3.cron=* * * * 3
task3.class=com.lcbp.tools.timer.DeleteFileJob
task3.enable=true

JFinal

2016-09-12 15:00

@九爷同学 最后一个不对,最后一个是周三的每分钟都执行一次

JFinal

2016-09-12 15:02

@九爷同学 Cron4j 这个方案是我给的代码吧,跟我以前给出去的用法完全一样

九爷同学

2016-09-12 15:07

@JFinal 我在分享栏目找到的,是之前您给那位朋友,然后他分享出来的,所以是一样的,原地址http://www.jfinal.com/share/37

JFinal

2016-09-12 15:28

jfinal 社区正是用的这个代码,非常之爽

九爷同学

2016-09-12 16:21

@JFinal 恩恩 比quartz简单好用,波总还想问一个问题,这个定时任务在集群每台服务器都运行可以吗?

JFinal

2016-09-12 16:33

@九爷同学 cron4j 不支持集群,需要自己写点代码处理好集群部署时的协作。给个方案:
1:将 task 创建与 task 调度分开
2:创建 task 时,向一个集中的数据库表写入记录,假定就叫 task 表
3:task 表中放一个 int lock 字段,用来在分布式环境下来上锁
4:集群中的 taks 调度程序在事务中为将要处理的 task 记录的 lock 字段上锁,置为 1,然后开始处理,其它调度程序在调度的时候发现 lock 为 1 时不处理

这里再建议两个小设计:
1:创建一个 status 字段表明处理状态,根据需求值可以是:0初始、1正处理、2成功、3失败
3:基于 Cron4j 的调度程序在最开始一段代码前面,加一句 Thread.sleep(随机数毫秒数); 这个随机的毫秒数可用 new Random().nextInt(2000); 这样的代码来生成。这样做的好处是避免集群环境下多个使用同样 cron 表达式的线程过于竞争

JFinal

2016-09-12 16:33

@九爷同学 其实与其去学习 quartz 的分布式用法,还不如自己建一个 task 表来得简单,而且 task 本身就是需要的,可以记录任务调试的情况,心中有数

九爷同学

2016-09-12 17:07

@JFinal 谢谢波总耐心指导

wujiafu

2017-10-15 14:34

请问corn4j是项目启动执行吗?我发现我的demo是隔了一段时间才开始启动定时的,如果我想项目启动执行要怎么设置呢?我每两个小时执行一次的corn是 (0 */2 * * *),麻烦@JFinal能指点一下吗@JFinal @JFinal

JFinal

2017-10-15 17:42

0 */2 * * * 这个表达式应该每隔两小时的第 0 分钟开始运行 task,关键在于把 cron 表达式弄对,下载一份 jfinal 手册,对照着手册里面的 cron 表达式规则去写这个表达式

热门反馈

扫码入社