背景
現在有一個功能是要實現:統計每天的用例的執行數。需要每天給用例執行表打一個快照,記錄每天的執行數據。
實現方案
基於業務框架,采用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.");
}
}
}