2017-10-20 91 views
1

我有一个使用@Scheduled注释的各种计划程序的Spring Boot应用程序。其中一些时间表使用fixedRate设置,其他时间使用cron。 fixedRate时间表运行良好,但我注意到在过去的一个月中,cron时间表触发的实际时间每天会变化1-2小时。春季计划Cron作业在错误的时间点火

即与

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

的cron设置工作将火上午3:00而不是2:00 AM。它也不是每天都在发生。它会在同一时间连续运行几天,然后会发生一些事情,每次运行时都会关闭一小时,直到重新启动应用程序。

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

编辑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) 

回答

0

终于明白了。我没有安装ThreadPoolTask​​Scheduler,所以我没有足够大的线程池来运行我所有的预定作业。

@Configuration 
public class TaskSchedulerConfig { 

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

} 
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 */ 

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

+0

嘿布莱克。我在上周五添加了一些日志记录,并让它在周末运行以收集一些结果。我将这些结果发布在我原来的问题中。 –

+0

是的,如果这是他们应该做的事情,好像开始时间并没有按照时间表开火。你有什么其他注释?是弹簧组件,控制器还是服务类中的预定方法? – Blake

+1

终于搞明白了。我没有ThreadPoolTask​​Scheduler设置,所以没有足够大的池大小来支持我所有的预定作业。其中一个会被激发,其他人会被阻塞,或者被放入某种内部队列中,但当他们最终被解雇时,无论长时间排队还是被阻塞,cron时钟都会被抵消。 –