執行的定時任務是基於其他定時任務計算得到的結果基礎上做操作的,那么如何來確定其他存在數據依賴的定時任務已經執行完成呢?
在分布式環境里,可通過集群的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 boolean checkCanRun (DateTime reportTime) { 12 13 String runningFinishKey = redisOperator.getValueByKey(key + dateStr); 14 15 if ("0".equals(runningFinishKey )) { 16 return true; 17 } 18 return false; 19 }