【问题标题】:Spring Scheduled Cron jobs firing at wrong timeSpring Scheduled Cron 作业在错误的时间触发
【发布时间】:2018-04-01 17:13:30
【问题描述】:

我有一个带有各种使用 @Scheduled 注解的调度程序的 Spring Boot 应用程序。一些时间表是使用 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)

【问题讨论】:

    标签: java spring spring-boot cron spring-scheduled


    【解决方案1】:

    终于明白了。我没有设置 ThreadPoolTask​​Scheduler,所以我没有足够大的线程池来运行我所有的计划作业。

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

    【讨论】:

    • 我有同样的问题(工作安排在上午 1.30,触发 ± 9 点,之前是长时间运行的工作,尽管有一些单线程的反证)但这对我没有帮助( Spring Boot 1.5,Spring 4.3)。我尝试将 ThreadPoolTaskSchedulerTaskScheduler 作为返回类型。我发现文档很难理解:(
    • @Brian Smaith 上面的代码就足够了。或者我们是否需要将其设置为 ScheduledTaskRegistrar。我们是否需要对我们的调度方法使用任何其他注释从 ThreadPoolTask​​Scheduler 获取线程。
    • @raj_kumar_junior 这是在较旧的应用程序和 Spring/Java 版本上运行的。在它运行时,我们不必配置 ScheduledTaskRegistrar。较新的版本可能就是这种情况。
    【解决方案2】:

    它是每次恰好停火 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 */
    

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

    【讨论】:

    • 嘿布莱克。我上周五添加了一些日志记录,让它在周末运行以收集一些结果。我在原始问题中发布了这些结果。
    • 是的,如果这是他们应该做的,那么开始时间似乎没有按计划进行。您还有哪些其他注释?是 spring 组件、控制器或服务类中的预定方法吗?
    • 终于想通了。我没有设置 ThreadPoolTask​​Scheduler,因此没有足够大的池大小来支持我所有的计划作业。一个会触发,其他的要么被阻塞,要么被放入某种内部队列,但是当它们最终被触发时,cron 时钟会偏移它们排队/阻塞的时间。
    猜你喜欢
    • 2021-02-27
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 2014-11-26
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多