2017-10-20 89 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時鐘都會被抵消。 –