[英]Behavior of the single-threaded default scheduler used with Spring @Scheduled/@EnableScheduling registrar when a TaskScheduler is not setup/available
如EnableScheduling的 Spring 文檔中所述,當 TaskScheduler 池未設置/可用/可解析時,“將在注冊器中創建和使用本地單線程默認調度程序”
現在,當這種情況發生時,這個默認調度程序的性質和行為是什么,特別是 w.r.t,它的線程是否可能由於執行期間未捕獲/處理的故障而終止?
這個默認調度程序是ThreadPoolTask Scheduler 的一個實例嗎? 如果是這樣,那么它的默認ErrorHandler策略是什么? 是否只是簡單地記錄了投擲物?
或者這個默認調度程序是一個更簡單的調度程序,只是一個ScheduledExecutorService的實例,它是通過調用Executors.html#newSingleThreadScheduledExecutor()構造的,如那里所述,“如果這個單線程由於在關閉之前的執行期間發生故障而終止,一個新的如果需要執行后續任務,將取而代之。”
謝謝
自己看了Spring任務調度源碼后找到了答案。 在這里分享給其他人。
對於這個,
現在,當這種情況發生時,這個默認調度程序的性質和行為是什么,特別是 w.r.t,它的線程是否可能由於執行期間未捕獲/處理的故障而終止?
答案如預期,不會。 用戶提交的任務被裝飾為org.springframework.scheduling.support.DelegatingErrorHandlingRunnable
包裝用戶 Runnable,捕獲從它拋出的任何異常或錯誤,並允許org.springframework.util.ErrorHandler
處理它。 這里是來源。
對於這個,
這個默認調度程序是 ThreadPoolTaskScheduler 的一個實例嗎? 如果是這樣,那么它的默認 ErrorHandler 策略是什么? 是否只是簡單地記錄了投擲物?
或者這個默認調度程序是一個更簡單的調度程序,只是通過調用 Executors.html#newSingleThreadScheduledExecutor() 構造的 ScheduledExecutorService 的一個實例...
答案是它的一個org.springframework.scheduling.concurrentConcurrentTaskScheduler
實例,它包裝了一個通過調用Executors.html#newSingleThreadScheduledExecutor()構造的 ScheduledExecutorService。
ErrorHandler策略是在錯誤級別記錄用戶 Throwables。 此外,重復任務也將抑制用戶 Throwable 並且不傳播(因此不會阻止任務的后續執行),而對於一次性任務,它將按預期傳播(重新拋出)。 這里是來源。
以上兩者都是我所期待的,但我想確認一下,因為這個默認值的性質和行為沒有明確記錄。 也許更多的文檔可能會有所幫助。
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.