cron4j定时任务执行一段时间后停止执行

cron4j=FirstJob

FirstJob.cron=*/2 * * * *
FirstJob.class=com.demo.server.FirstJob
FirstJob.daemon=true
FirstJob.enable=true

这几天在项目中测试一个定时任务时,发现一个问题,网上找了许久都没有解决。

cron4j的配置文件如上所示,每个小时的每2分钟执行一次。

刚开始本地测试和服务器测试都没啥问题,等第二天看日志的时候发现在00:02:00执行了最后一次之后就没有再执行了,检查日志并没有发现任何异常信息。测试了几天发现当天定时任务执行正常,但是每次都是在凌晨00:02:00后就不执行了,百思不得其解。。

image.png

代码执行的逻辑是调用第三方的Http接口,拿到返回数据后写入ES。ES的代码并没有出错,有考虑过由于网络原因导致调用Http接口超时的原因,但是有设置建立连接、读、写的超时时间。

目前来讲并不知道是哪个环节出了问题。跪求帮助。

评论区

JFinal

2020-08-05 10:56

你的表达式看着是对的,可能有啥其他原因

改成 0-59/2 * * * * 试试

__

2020-09-05 14:42

我也遇到了同样的问题,表达式是这样的:
*/5 * * * *
是线上的系统,每次都是00:00,00:05调了两次就没有调了.出现的频率也不确定,有时候是两三天,有时候是一周左右.jfinal版本是3.5

JFinal

2020-09-05 19:20

@__ 你的表达式是每 5 分钟调度一次,应该是可以的,如果不行,改成下面的试试:
0-59/5 * * * *

也就是说,将第一个 * 号改成指定确切的时间范围


文档中有如下说明:

常见错误:cron4j在表达式中使用除号指定增加幅度时与linux稍有不同。例如在linux中表达式 10/3 * * * * 的含义是从第10分钟开始,每隔三分钟调度一次,而在cron4j中需要使用 10-59/3 * * * * 来表达。避免这个常见错误的技巧是:当需要使用除号指定增加幅度时,始终指定其范围。

基于上面的技巧,每隔2分钟调度一次的表达式为:0-59/2 * * * * 或者 */2 * * * * , 而不能是0/2 * * * *

__

2020-09-17 09:39

@JFinal 改成0-59/5 * * * *,再次复现,这次看到报错了:
INFO | jvm 1 | 2020/09/17 00:06:00 | Exception in thread "cron4j::scheduler[2912e4ef0f3f0d4963730262000001749725696a442237bc]::timer[2912e4ef0f3f0d4963730262000001749725697c3a8abe51]" Exception in thread "cron4j::scheduler[2912e4ef0f3f0d4963730262000001749725697b7a1ad169]::timer[2912e4ef0f3f0d4963730262000001749725697d015b8db9]" java.lang.OutOfMemoryError: unable to create new native thread
INFO | jvm 1 | 2020/09/17 00:06:00 | at java.lang.Thread.start0(Native Method)
INFO | jvm 1 | 2020/09/17 00:06:00 | at java.lang.Thread.start(Thread.java:717)
INFO | jvm 1 | 2020/09/17 00:06:00 | at it.sauronsoftware.cron4j.Scheduler.spawnLauncher(Unknown Source)
INFO | jvm 1 | 2020/09/17 00:06:00 | at it.sauronsoftware.cron4j.TimerThread.run(Unknown Source)
INFO | jvm 1 | 2020/09/17 00:06:00 | java.lang.OutOfMemoryError: unable to create new native thread
INFO | jvm 1 | 2020/09/17 00:06:00 | at java.lang.Thread.start0(Native Method)
INFO | jvm 1 | 2020/09/17 00:06:00 | at java.lang.Thread.start(Thread.java:717)
INFO | jvm 1 | 2020/09/17 00:06:00 | at it.sauronsoftware.cron4j.Scheduler.spawnLauncher(Unknown Source)
INFO | jvm 1 | 2020/09/17 00:06:00 | at it.sauronsoftware.cron4j.TimerThread.run(Unknown Source)

JFinal

2020-09-20 17:05

@__ 问题应该是找到了,并不是 Cron4jPulgin 不执行,而是你的项目出现了 OutOfMemoryError 异常,JVM 已经不能正常工作了,定时任务不执行就再正常不过了

JFinal

2020-09-20 17:06

OutOfMemoryError 这个异常通常是内存泄漏引起的,通过 JVM 自带的 visualvm 检查哪个地方的内存占用是一直上升的

热门反馈

扫码入社