执行的定时任务是基于其他定时任务计算得到的结果基础上做操作的,那么如何来确定其他存在数据依赖的定时任务已经执行完成呢?
在分布式环境里,可通过集群的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(Constants.RedisKey.OPERATION_RUNNING_FINISH_KEY + dateStr);
14
15 if ("0".equals(runningFinishKey )) {
16 return true;
17 }
18 return false;
19 }