package com.gk.hotwork.doublePrevention.scheduls;
|
|
|
import com.gk.hotwork.Domain.Enum.ResultCodes;
|
import com.gk.hotwork.Domain.Exception.BusinessException;
|
import com.gk.hotwork.doublePrevention.entity.PreventDangerCheckTask;
|
import com.gk.hotwork.doublePrevention.entity.PreventDangerCheckWork;
|
import com.gk.hotwork.doublePrevention.enums.WorkStatusEnum;
|
import com.gk.hotwork.doublePrevention.mq.msg.PreventCreateTaskMsg;
|
import com.gk.hotwork.doublePrevention.repository.param.CheckWorkAutoUpdateParams;
|
import com.gk.hotwork.doublePrevention.service.baseService.PreventDangerCheckTaskService;
|
import com.gk.hotwork.doublePrevention.service.baseService.PreventDangerCheckWorkService;
|
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.rocketmq.client.producer.SendResult;
|
import org.apache.rocketmq.client.producer.SendStatus;
|
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
|
@Component
|
public class PreventDangerCheckWorkSchedule {
|
|
private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(PreventDangerCheckWorkSchedule.class);
|
|
@Autowired
|
private PreventDangerCheckWorkService preventDangerCheckWorkService;
|
@Autowired
|
private PreventDangerCheckTaskService preventDangerCheckTaskService;
|
|
@Value("${rocketmq.topic.preventCreateTaskTopic}")
|
private String preventCreateTaskTopic;
|
|
@Autowired
|
private RocketMQTemplate rocketMQTemplate;
|
|
public PreventDangerCheckWorkSchedule() {
|
}
|
|
@Transactional
|
@Scheduled(cron = "0 0/10 * * * ?")
|
public void createNewWorkTask() throws Exception {
|
logger.info("【双重预防-排查任务检索】开始执行......");
|
//System.out.println("【11】定时任务开始执行......");
|
|
List<PreventDangerCheckWork> checkWorkLists = preventDangerCheckWorkService.listScheduleCheckWork();
|
|
//当前存在开启状态的作业
|
if (checkWorkLists != null && checkWorkLists.size() > 0 ) {
|
//遍历work集合
|
for (PreventDangerCheckWork checkWork : checkWorkLists) {
|
Date date = new Date();
|
Date nextCheckTime = null;
|
Date noticeTime = null;
|
Byte ExecTaskTag;
|
//TODO 排班改为在此处判断 暂无
|
//解析任务通知时间毫秒数
|
if (ObjectUtils.isNotEmpty(checkWork.getNextCheckTime())){
|
if (checkWork.getNoticeTimeUnit() == 1) {
|
//如果时间单位是分钟
|
noticeTime = new Date(checkWork.getNextCheckTime().getTime() - checkWork.getNoticeTime() * 60 * 1000);
|
}else if (checkWork.getNoticeTimeUnit() == 2) {
|
//如果时间单位是小时
|
noticeTime = new Date(checkWork.getNextCheckTime().getTime() - checkWork.getNoticeTime() * 60 * 1000);
|
}else if (checkWork.getNoticeTimeUnit() == 3) {
|
//如果时间单位是日
|
noticeTime = new Date(checkWork.getNextCheckTime().getTime() - checkWork.getNoticeTime() * 24 * 60 * 60 * 1000);
|
}else if (checkWork.getNoticeTimeUnit() == 4) {
|
//如果时间单位是月
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(checkWork.getNextCheckTime());//设置起时间
|
calendar.add(Calendar.MONTH, -checkWork.getNoticeTime());//增加N个月
|
noticeTime = calendar.getTime();
|
}
|
nextCheckTime = checkWork.getNextCheckTime();
|
}else {
|
//如果是第一次调度
|
if (checkWork.getNoticeTimeUnit() == 1) {
|
//如果时间单位是分钟
|
noticeTime = new Date(checkWork.getFirstStartTime().getTime() - checkWork.getNoticeTime() * 60 * 1000);
|
}else if (checkWork.getNoticeTimeUnit() == 2) {
|
//如果时间单位是小时
|
noticeTime = new Date(checkWork.getFirstStartTime().getTime() - checkWork.getNoticeTime() * 60 * 1000);
|
}else if (checkWork.getNoticeTimeUnit() == 3) {
|
//如果时间单位是日
|
noticeTime = new Date(checkWork.getFirstStartTime().getTime() - checkWork.getNoticeTime() * 24 * 60 * 60 * 1000);
|
}else if (checkWork.getNoticeTimeUnit() == 4) {
|
//如果时间单位是月
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(checkWork.getFirstStartTime());//设置起时间
|
calendar.add(Calendar.MONTH, -checkWork.getNoticeTime());//增加N个月
|
noticeTime = calendar.getTime();
|
}
|
nextCheckTime = checkWork.getFirstStartTime();
|
}
|
|
//检查当前作业产生的任务列表,如果存在待执行,执行中的任务,不生成下一条任务
|
List<PreventDangerCheckTask> taskByCheckWorkId = preventDangerCheckTaskService.getTaskByCheckWorkId(checkWork.getId());
|
//判断作业配置的开始时间,是否处于发送成任务消息的时间区间--在通知前20分钟,把创建任务消息,发送给mq
|
//添加判断,下次执行时间大于当前时间,作业状态为开启中
|
//TODO 根据任务判断,现在已经临时删除
|
if (checkWork.getCheckWorkStatus() == WorkStatusEnum.WORK_OPEN.getCode() && nextCheckTime.getTime() > date.getTime() - 10 * 60 * 1000L
|
&& date.getTime() > noticeTime.getTime() - 30 * 60 * 1000 ) {
|
//设置任务创建时间,在通知之前30分钟,创建任务
|
Date createTime = date;
|
// //如果 当前时间 - 通知时间 < 5分钟,任务立即创建。否则在通知前五分钟创建
|
// if (date.getTime() - noticeTime.getTime() < 5 * 60 * 1000){
|
// createTime = new Date(noticeTime.getTime() - 5 * 60 * 1000);
|
// }else {
|
// createTime = date;
|
// }
|
//获取mq消息体
|
PreventCreateTaskMsg preventCreateTaskMsg = new PreventCreateTaskMsg();
|
preventCreateTaskMsg.setWorkId(checkWork.getId());
|
preventCreateTaskMsg.setCreateTaskTime(createTime);
|
|
SendResult sendResult = rocketMQTemplate.syncSend(preventCreateTaskTopic, preventCreateTaskMsg);
|
if (sendResult.getSendStatus() != SendStatus.SEND_OK) {
|
throw new BusinessException(ResultCodes.BUSINESS_ERROR);
|
}
|
logger.info("\n【##】创建巡检任务消息 " + " 已发送--->>" + " MSGID: " + sendResult.getMsgId() + " 创建时间: " + createTime);
|
// System.out.println("\n【##】创建巡检任务消息 " + " 已发送--->>" + " MSGID: " + sendResult.getMsgId() + " 创建时间: " + createTime);
|
//将作业状态设置为已调度
|
CheckWorkAutoUpdateParams updateWorkParams = new CheckWorkAutoUpdateParams();
|
updateWorkParams.setCheckWorkStatus((byte) 5);
|
updateWorkParams.setId(checkWork.getId());
|
preventDangerCheckWorkService.updateCheckWorkStatus(updateWorkParams);
|
}else if(nextCheckTime.getTime() - date.getTime() < 0){
|
logger.info("【##】当前存在作业开始时间不合理,此作业无法调度" + checkWork.getCheckWorkName());
|
}else{
|
logger.info("【##】当前存在作业未到调度时间");
|
}
|
}
|
}else {
|
logger.info("\n【##】当前---无可调度作业");
|
}
|
|
System.out.println("【11】定时任务执行结束......");
|
}
|
}
|