基於Redis在定時任務裡判斷其他定時任務是否已經正常執行完的方案
阿新 • • 發佈:2020-06-27
執行的定時任務是基於其他定時任務計算得到的結果基礎上做操作的,那麼如何來確定其他存在資料依賴的定時任務已經執行完成呢?
在分散式環境裡,可通過叢集的redis來解決這個問題:
即,在跑批任務開始時,將任務key+當日凌晨時間組成的key值進行加1,例如:
1 redisOperator.getJedis().incr(key+ startDateStr); 2 redisOperator.setKeyExpireTime(key+ startDateStr, 60*60*24);跑批完成後,再將任務key+當日凌晨時間組成的key值減1,例如:
1 //跑批結束後自減 2 redisOperator.getJedis().decr(key+ startDateStr);正常任務執行完,redis裡對應的應該狀態是0。
1 //阻塞迴圈,一直等到另外的定時任務跑成功了,才繼續。 2 while (!checkCanRun(reportTime)) {3 int interval = 7200000; 4 long sleepTime = System.currentTimeMillis(); 5 //休眠 6 logger.info("sendOperationDailyReportHandler sleep time = " + TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()-sleepTime) + " seconds"); 7 Thread.sleep(interval); 8 } 9 10 11 private booleancheckCanRun (DateTime reportTime) { 12 13 String runningFinishKey = redisOperator.getValueByKey(Constants.RedisKey.OPERATION_RUNNING_FINISH_KEY + dateStr); 14 15 if ("0".equals(runningFinishKey )) { 16 return true; 17 } 18 return false; 19 }