[英]What is the expected behaviour of spring @scheduled cron when jobs would overlap?
[英]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 */
在指定時區時查看結果是否有所不同。
終於想通了。 我沒有ThreadPoolTaskScheduler設置,所以我沒有足夠大的線程池來運行我所有的預定作業。
@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.