我有 2 個 Spring boot 應用程式實體,我使用的是 spring JPA。Cron 調度程式每隔一小時運行一次方法,首先檢查記錄是否已更新,如果已更新,則應跳過并且不更新,但無論如何它都會在兩個實體上更新。如何實作諸如同步之類的東西,僅在完成某事時才允許讀取?
@Scheduled(cron = "0 0 * * * ?", zone = "Europe/Paris")
public void updateServers() {
applicationServerRepository.findAll().forEach(this::updateServerInfo);
}
uj5u.com熱心網友回復:
請更詳細和準確地解釋問題。但據我所知,你應該:
或者僅在一個實體中運行 cron 作業。(早在 90 年代,我們是“手動”完成的,但 spring-boot-profiles 在這里提供了很好的機會:用 裝飾“所有@scheduled beans”(重構!?)
@Profile("cronFooBar"),并僅在一個實體上激活/添加它。)或者,如果您還希望 cron 作業“負載平衡”,那么您應該找到一種同步/鎖定的方法。(可能最好在
updateServerInfo或updateServers. (更多細節!?..我相信兩個實體都會找到“一些要鎖定的物件”,至少是資料庫(表,行,..)))
正如Erkan 提出的/在互聯網上找到的那樣,通過“小設定”(并丟棄石英!),您可以為此提供一個方便的注釋,例如:
@SchedulerLock(name = "...",
lockAtLeastForString = "...", lockAtMostForString = "...")
但我想,也可以使用 spring-data-jpa(僅限 & 石英)資源,例如:
添加(悲觀)鎖定:
interface ApplicationServerRepository ... { @Lock(LockModeType.PESSIMISTIC_READ) @Query("select as from ApplicationService ...") findAllForCron(); ... }抓住它:
@Scheduled(cron = "0 0 * * * ?", zone = "Europe/Paris") public void updateServers() { try { applicationServerRepository .findAllForCron() .forEach(this::updateServerInfo); ?} catch? (javax.persistence.PessimisticLockException plex) { logger.info("i get some coffee"); return; } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/358234.html
上一篇:錯誤:更新或洗掉表“courses”違反表“teacher_courses”上的外鍵約束“fk998yb1badftsiklfh13bcw3ol”
