Java | 集群環境下防止定時任務重復執行DB操作


背景

現在有一個功能是要實現:統計每天的用例的執行數。需要每天給用例執行表打一個快照,記錄每天的執行數據。

實現方案

基於業務框架,采用springboot的schedule,它本身已經集成在spring-boot-starter,不需要添加額外的依賴了。
定時任務每天零點執行,可以百度cron表達式。

但是有個問題,因為我們的應用是集群部署的,所以定時任務會執行多次,也就是每台服務器都會去執行一次。但我們只想要一份備份數據。
這個時候怎么去解決重復執行的問題呢?

解決方案

方案一:

加分布式鎖

方案二:

給數據庫加唯一key,這樣確保只有一台能夠成功執行DB操作。對於后面執行的,捕獲下異常即可。

由於系統比較簡單,我采用的是方案二。

代碼示例

/**

  • 用例執行記錄每日備份

*/

@Slf4j
@Component
public class RecordBackupTask {

@Autowired
ExecRecordService execRecordService;
@Scheduled(cron = "0 0 0 */1 * ?") // 每日凌晨0點執行

// @Scheduled(cron = "0 */1 * * * ?") // 測試使用 1分鍾執行一次
public void copyExecRecords(){
try {
log.info("Start to back up.");
execRecordService.backupRecord();
} catch (DataIntegrityViolationException e) {
// 捕獲預期的異常
} catch (Exception e) {
log.error("Failed to back up.");
}
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM