我們域中的一個應用程式有 2 個特定的計劃任務;一個需要每分鐘運行一次,一個大批量操作要在半夜執行。由于同時執行這兩個操作會使外部服務器超載,因此實施了 ShedLock 以防止操作同時運行。
使用以下 ShedLock 配置(注意相同的 ID):
@Scheduled("0 * * * * *")
@SchedulerLock(name = "sameShedLockId", lockAtLeastFor = "PT59S", lockAtMostFor = "PT59S")
public void runEveryMinute() {
// ...
}
@Scheduled(cron = "0 0 1 * * *")
@SchedulerLock(name = "sameShedLockId", lockAtLeastFor = "PT10M", lockAtMostFor = "PT15M")
public void runOnceEveryNight() {
// ...
}
早上 01:00:00 左右會發生什么,當兩種方法都嘗試獲取相同的鎖并且runEveryMinute能夠獲取鎖時?會runOnceEveryNight被放入某種 ShedLock 等待佇列中,直到鎖被釋放,或者任務根本不會被執行?如果確實如此,那么有什么更好的設定來防止任務在晚上 01:00 左右同時進行?
我不介意runEveryMinute每晚被跳過一次,但是如果runOnceEveryNight被跳過,則需要 24 小時才能重新嘗試任務。
uj5u.com熱心網友回復:
在 ShedLock 中跳過沒有獲得鎖的那個。
這兩個同時存在,我想不可能知道哪一個會獲得鎖。
我想簡單的“修復”是更改runEveryMinute為@Scheduled("10 * * * * *")(或其他不為 0 秒的東西)假設在我的示例中運行時間不超過 49 秒。在這些情況下,最好盡可能多地留出余量,以免出現一些賽車情況。即,如果runEveryMinutes只需要 1-2 秒,請將 cron 設定為 30 秒左右,以便雙向都有時間。
請注意,所有內容都runEveryMinute將被跳過,直到runOnceEveryNight完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513235.html
標籤:春天弹簧靴计划任务棚锁
下一篇:條紋-雷達規則
