繁体   English   中英

Spring计划的Cron工作在错误的时间解雇

[英]Spring Scheduled Cron jobs firing at wrong time

我有一个Spring Boot应用程序,其中包含使用@Scheduled注释的各种调度程序。 一些计划使用fixedRate设置,其他计划使用cron。 fixedRate时间表运行良好,但我注意到在过去的一个月里,cron时间表开火的实际时间每天变化1-2小时。

即一个cron设置的工作

@Scheduled(cron = "0 0 2 * * *")

将在凌晨3:00而不是凌晨2:00开火。 它也不是每天都在发生。 它将连续几天同时运行,然后发生一些事情,并且每次运行它都会关闭另一个小时,直到我重新启动应用程序。

服务器上的系统时间是准确的,我在这里完全没有想法。 有没有人遇到过这个?

编辑1

我进行了一些记录以确定作业是否以相同的间隔错误触发,结果似乎是随机的。 以下是上述cron作业三天的开始/结束时间:

Format: Calendar.getInstance().getTime() (System.currentTimeMillis())

Start: Sat Oct 21 03:14:15 CDT 2017 (1508573655778)
End:   Sat Oct 21 03:22:24 CDT 2017 (1508574144708)

Start: Sun Oct 22 02:26:58 CDT 2017 (1508657218774)
End:   Sun Oct 22 02:35:12 CDT 2017 (1508657712492)

Start: Mon Oct 23 02:00:03 CDT 2017 (1508742003072)
End:   Mon Oct 23 02:08:11 CDT 2017 (1508742491493)

它每次关闭时间恰好是1小时,还是像你提到的那样变化? 你是如何测量它发射的时间 - 使用记录? 你注释的方法需要多长时间才能运行? 在方法的开头和结尾记录消息并比较这些时间戳。 你可以尝试使用

private static final String CRON_SCHEDULE = "0 0 2 * * ?";
private static final String USER_TIMEZONE = "America/New_York";
// ...
@Scheduled(cron = CRON_SCHEDULE, zone = USER_TIMEZONE)
/* your method here */

在指定时区时查看结果是否有所不同。

终于想通了。 我没有ThreadPoolTask​​Scheduler设置,所以我没有足够大的线程池来运行我所有的预定作业。

@Configuration
public class TaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(30);
        return threadPoolTaskScheduler;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM