|
|
@ -546,7 +546,7 @@ public class PatrolTaskExecController extends BaseController { |
|
|
|
|
|
|
|
|
task.setFixedStartTime(DateUtils.parse(DateUtils.yyyyMMddHHmmss2, (DateUtils.format(DateUtils.yyyyMMdd2, new Date()) + " " + cycleTimes[i]))); |
|
|
task.setFixedStartTime(DateUtils.parse(DateUtils.yyyyMMddHHmmss2, (DateUtils.format(DateUtils.yyyyMMdd2, new Date()) + " " + cycleTimes[i]))); |
|
|
final String taskType = "CYCLE-BY-WEEK"; |
|
|
final String taskType = "CYCLE-BY-WEEK"; |
|
|
parseTaskToRedis(taskType, task, null); |
|
|
|
|
|
|
|
|
parseTaskToRedis(taskType, task); |
|
|
} |
|
|
} |
|
|
} else if (isCycleTaskByMonth(task)) { |
|
|
} else if (isCycleTaskByMonth(task)) { |
|
|
String[] monthList = task.getCycleMonth().split(StringUtils.COMMA); |
|
|
String[] monthList = task.getCycleMonth().split(StringUtils.COMMA); |
|
|
@ -559,7 +559,7 @@ public class PatrolTaskExecController extends BaseController { |
|
|
|
|
|
|
|
|
task.setFixedStartTime(DateUtils.parse(DateUtils.yyyyMMddHHmmss2, (DateUtils.format(DateUtils.yyyyMMdd2, new Date()) + " " + cycleTimes[i]))); |
|
|
task.setFixedStartTime(DateUtils.parse(DateUtils.yyyyMMddHHmmss2, (DateUtils.format(DateUtils.yyyyMMdd2, new Date()) + " " + cycleTimes[i]))); |
|
|
final String taskType = "CYCLE-BY-MONTH"; |
|
|
final String taskType = "CYCLE-BY-MONTH"; |
|
|
parseTaskToRedis(taskType, task, null); |
|
|
|
|
|
|
|
|
parseTaskToRedis(taskType, task); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} else if (isInterTask(task)) { |
|
|
} else if (isInterTask(task)) { |
|
|
@ -571,11 +571,13 @@ public class PatrolTaskExecController extends BaseController { |
|
|
if (intervalNumber > 0) { |
|
|
if (intervalNumber > 0) { |
|
|
List<Date> exeTimes = getExecTimes(task.getIntervalExecuteTime(), DateUtils.format(DateUtils.yyyyMMddHHmmss2, task.getIntervalStartTime()), DateUtils.format(DateUtils.yyyyMMddHHmmss2, task.getIntervalEndTime()), intervalNumber); |
|
|
List<Date> exeTimes = getExecTimes(task.getIntervalExecuteTime(), DateUtils.format(DateUtils.yyyyMMddHHmmss2, task.getIntervalStartTime()), DateUtils.format(DateUtils.yyyyMMddHHmmss2, task.getIntervalEndTime()), intervalNumber); |
|
|
// List<Date> exeTimes = getExecTimesOld(task.getIntervalExecuteTime(), intervalNumber); |
|
|
// List<Date> exeTimes = getExecTimesOld(task.getIntervalExecuteTime(), intervalNumber); |
|
|
|
|
|
// 每个任务的策略 key 只清理一次(原实现在每个执行时刻都做一次 KEYS 全库扫描) |
|
|
|
|
|
cleanTaskKeysAfter(task, task.getIntervalEndTime()); |
|
|
for (Date exeTime : exeTimes) { |
|
|
for (Date exeTime : exeTimes) { |
|
|
logger.debug("[TASK] {}, isInterTaskByHour exeTime: {}", task.getTaskCode(), DateUtils.format(DateUtils.yyyyMMddHHmmss2, exeTime)); |
|
|
logger.debug("[TASK] {}, isInterTaskByHour exeTime: {}", task.getTaskCode(), DateUtils.format(DateUtils.yyyyMMddHHmmss2, exeTime)); |
|
|
task.setFixedStartTime(exeTime); |
|
|
task.setFixedStartTime(exeTime); |
|
|
final String taskType = "INTER-BY-HOUR"; |
|
|
final String taskType = "INTER-BY-HOUR"; |
|
|
parseTaskToRedis(taskType, task, task.getIntervalEndTime()); |
|
|
|
|
|
|
|
|
parseTaskToRedis(taskType, task); |
|
|
} |
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
log.info("[TASK] isInterTaskByHour intervalNumber error: {}", intervalNumber); |
|
|
log.info("[TASK] isInterTaskByHour intervalNumber error: {}", intervalNumber); |
|
|
@ -589,10 +591,11 @@ public class PatrolTaskExecController extends BaseController { |
|
|
List<Date> exeTimes = getExecTimesByMinute(task.getIntervalExecuteTime(), DateUtils.format(DateUtils.yyyyMMddHHmmss2, task.getIntervalStartTime()), endTime, intervalNumber); |
|
|
List<Date> exeTimes = getExecTimesByMinute(task.getIntervalExecuteTime(), DateUtils.format(DateUtils.yyyyMMddHHmmss2, task.getIntervalStartTime()), endTime, intervalNumber); |
|
|
if (exeTimes.size() > 0) { |
|
|
if (exeTimes.size() > 0) { |
|
|
// Date date = exeTimes.get(exeTimes.size() - 1); |
|
|
// Date date = exeTimes.get(exeTimes.size() - 1); |
|
|
|
|
|
cleanTaskKeysAfter(task, task.getIntervalEndTime()); |
|
|
for (Date exeTime : exeTimes) { |
|
|
for (Date exeTime : exeTimes) { |
|
|
task.setFixedStartTime(exeTime); |
|
|
task.setFixedStartTime(exeTime); |
|
|
final String taskType = "INTER-BY-MINUTE"; |
|
|
final String taskType = "INTER-BY-MINUTE"; |
|
|
parseTaskToRedis(taskType, task, task.getIntervalEndTime()); |
|
|
|
|
|
|
|
|
parseTaskToRedis(taskType, task); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
@ -607,7 +610,7 @@ public class PatrolTaskExecController extends BaseController { |
|
|
String time = intervalExecuteTime[0] + ":" + DateUtils.getMinuteInt() + ":" + intervalExecuteTime[2]; |
|
|
String time = intervalExecuteTime[0] + ":" + DateUtils.getMinuteInt() + ":" + intervalExecuteTime[2]; |
|
|
task.setFixedStartTime(DateUtils.parse(DateUtils.yyyyMMddHHmmss2, (DateUtils.format(DateUtils.yyyyMMdd2, new Date()) + " " + time))); |
|
|
task.setFixedStartTime(DateUtils.parse(DateUtils.yyyyMMddHHmmss2, (DateUtils.format(DateUtils.yyyyMMdd2, new Date()) + " " + time))); |
|
|
final String taskType = "INTER-BY-DATE"; |
|
|
final String taskType = "INTER-BY-DATE"; |
|
|
parseTaskToRedis(taskType, task, null); |
|
|
|
|
|
|
|
|
parseTaskToRedis(taskType, task); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -619,7 +622,7 @@ public class PatrolTaskExecController extends BaseController { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void parseTaskToRedis(final String taskType, PatrolTask task, Date finalDate) { |
|
|
|
|
|
|
|
|
private void parseTaskToRedis(final String taskType, PatrolTask task) { |
|
|
if (StringUtils.isNotEmpty(task.getDevNo())) { |
|
|
if (StringUtils.isNotEmpty(task.getDevNo())) { |
|
|
String[] devNos = task.getDevNo().split(StringUtils.COMMA); |
|
|
String[] devNos = task.getDevNo().split(StringUtils.COMMA); |
|
|
List<String> devNoList = new ArrayList<>(); |
|
|
List<String> devNoList = new ArrayList<>(); |
|
|
@ -646,18 +649,6 @@ public class PatrolTaskExecController extends BaseController { |
|
|
if (taskExecRecord == null) { |
|
|
if (taskExecRecord == null) { |
|
|
List<PatrolTask> patrolTasks = getPatrolTasks(task); |
|
|
List<PatrolTask> patrolTasks = getPatrolTasks(task); |
|
|
if (!patrolTasks.isEmpty()) { |
|
|
if (!patrolTasks.isEmpty()) { |
|
|
if(finalDate != null) { |
|
|
|
|
|
Collection<String> redisKeys = redisService.keys(RedisConst.TASK_CODE + task.getTaskCode() + StringUtils.AT + "*"); |
|
|
|
|
|
for (String redisKey : redisKeys) { |
|
|
|
|
|
String[] keywords = StringUtils.split(redisKey, StringUtils.AT); |
|
|
|
|
|
if (keywords.length == 3) { |
|
|
|
|
|
String fixedStartTime = keywords[2]; |
|
|
|
|
|
if (DateUtils.parse(DateUtils.yyyyMMddHHmmss2, fixedStartTime).after(finalDate)) { |
|
|
|
|
|
redisService.deleteObject(redisKey); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
logger.debug(Color.GREEN + "[TASK] TYPE: {}, CYCLE BY WEEK key: {}, patrolId: {}" + Color.END, taskType, key, taskPatrolledId); |
|
|
logger.debug(Color.GREEN + "[TASK] TYPE: {}, CYCLE BY WEEK key: {}, patrolId: {}" + Color.END, taskType, key, taskPatrolledId); |
|
|
redisService.setCacheObject(key, JSONArray.toJSONString(patrolTasks)); |
|
|
redisService.setCacheObject(key, JSONArray.toJSONString(patrolTasks)); |
|
|
} |
|
|
} |
|
|
@ -667,6 +658,31 @@ public class PatrolTaskExecController extends BaseController { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 清理该任务下"计划执行时间晚于 finalDate"的策略 key。 |
|
|
|
|
|
* |
|
|
|
|
|
* <p>历史实现放在 parseTaskToRedis 里,而 parseTaskToRedis 是按"每个执行时刻"调用的, |
|
|
|
|
|
* 于是一次 makeCurrentDayTask 会对 Redis 发起成百上千次 KEYS 全库扫描(TASK_CODE@taskCode@*), |
|
|
|
|
|
* 单线程 Redis 被阻塞,导致所有业务请求排队、tomcat 线程池被占满、容器健康检查连续超时。 |
|
|
|
|
|
* 现在改为:① 用 SCAN 替代 KEYS(不阻塞其它客户端);② 每个任务只清理一次。 |
|
|
|
|
|
*/ |
|
|
|
|
|
private void cleanTaskKeysAfter(PatrolTask task, Date finalDate) { |
|
|
|
|
|
if (task == null || finalDate == null || StringUtils.isEmpty(task.getTaskCode())) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Collection<String> redisKeys = redisService.scan(RedisConst.TASK_CODE + task.getTaskCode() + StringUtils.AT + "*"); |
|
|
|
|
|
for (String redisKey : redisKeys) { |
|
|
|
|
|
String[] keywords = StringUtils.split(redisKey, StringUtils.AT); |
|
|
|
|
|
if (keywords.length == 3) { |
|
|
|
|
|
Date fixedStartTime = DateUtils.parse(DateUtils.yyyyMMddHHmmss2, keywords[2]); |
|
|
|
|
|
if (fixedStartTime != null && fixedStartTime.after(finalDate)) { |
|
|
|
|
|
redisService.deleteObject(redisKey); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private List<Date> getExecTimesOld(String exeTime, int num) { |
|
|
private List<Date> getExecTimesOld(String exeTime, int num) { |
|
|
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); |
|
|
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); |
|
|
SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|
|
SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|
|
@ -795,7 +811,7 @@ public class PatrolTaskExecController extends BaseController { |
|
|
// this.log.info(" 【当前正在执行的任务:{}, 其它任务不能执行!!!】", taskCodeStr); |
|
|
// this.log.info(" 【当前正在执行的任务:{}, 其它任务不能执行!!!】", taskCodeStr); |
|
|
// } else { |
|
|
// } else { |
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|
|
for (String key : this.redisService.keys(RedisConst.TASK_CODE_EX)) { |
|
|
|
|
|
|
|
|
for (String key : this.redisService.scan(RedisConst.TASK_CODE_EX)) { |
|
|
String fixedStartTime = key.split(StringUtils.AT)[2]; |
|
|
String fixedStartTime = key.split(StringUtils.AT)[2]; |
|
|
long currentMinutes = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis()); |
|
|
long currentMinutes = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis()); |
|
|
long fixedStartMinutes = TimeUnit.MILLISECONDS.toMinutes(sdf.parse(fixedStartTime).getTime()); |
|
|
long fixedStartMinutes = TimeUnit.MILLISECONDS.toMinutes(sdf.parse(fixedStartTime).getTime()); |
|
|
|