簡體   English   中英

Kotlin 如果失敗則重試計划的 cron 任務

[英]Kotlin retry scheduled cron task if failed

我在下面有一個 Kotlin 調度配置文件。 它有一項重要任務計划在每周一上午 11 點運行。

如果服務在上午 11 點停機,我需要做什么來建立彈性或重試?

這些 Spring Boot 和 Kotlin @Scheduled作業是否可以配置為企業級彈性,或者我是否需要使用 Kube.netes CronJobs 之類的東西來實現這一點?

@Component
class CronConfig {

    private val logger = LoggerFactory.getLogger(CronConfig::class.java)

    // Run Monday morning @ 11am
    @Scheduled(cron = "0 0 11 * * MON")
    fun doSomething(){
        logger.info("Doing something")
    }
}

很好,您正在考慮 go 可能出錯的地方。 (我們開發人員經常假設一切都會 go 正確,並且不考慮和處理我們的代碼可能失敗的所有方式!)

不幸的是,我認為這沒有標准的做法; 正確的方法可能取決於您的具體情況。

也許最簡單的方法就是確保您的 function 不會失敗,方法是進行錯誤處理,並在需要時等待並重試。 如果這樣可以使其更具可讀性,您可以將實際處理拆分為一個單獨的方法,例如:

@Scheduled(cron = "0 0 11 * * MON")
fun doSomethingDriver() {
    while (true) { // Keep trying until successful…
        try {
            doSomething()
            return // It worked!
        } catch (x: Exception) {
            logger.error("Can't doSomething: {}.  Will retry…", x.message)
            TimeUnit.SECONDS.sleep(10L)
        }
    }
}

fun doSomething() {
    logger.info("Doing something")
    // …
}

這很簡單。 一個缺點是它使線程在重試之間保持等待; 由於 Spring 默認使用單線程調度程序(請參閱這些問題),這意味着它可能會延遲任何其他計划的作業。

或者,如果您預定的 function沒有繼續重試,那么您將需要一些其他方式來觸發重試。

您可以“輪詢”:存儲上次成功運行的時間,將計划的 function 更改為更頻繁地運行,並讓它檢查是否需要另一次運行(即自上次星期一上午 11 點以來是否沒有成功運行)。 這將更加復雜——尤其是因為它需要維護 state 並進行日期/時間處理。 (不過,您不必擔心並發性,除非您已經創建了 function @Async或設置了您自己的調度配置。)由於所有額外的預定喚醒,它的效率也有點低。

或者您可以捕獲錯誤(如上面的代碼)但不是等待和重試,而是手動安排將來重試,例如使用您自己的TaskExecutor 這也會更復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM