簡體   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