Commit b94b6244 authored by 张森's avatar 张森

定时任务问题处理

parent fe622688
...@@ -194,4 +194,8 @@ public interface PlanTaskMapper extends BaseMapper { ...@@ -194,4 +194,8 @@ public interface PlanTaskMapper extends BaseMapper {
List<Plan> getPlanIdsByDate(@Param("date") Date date); List<Plan> getPlanIdsByDate(@Param("date") Date date);
List<PlanTask> getPlanTaskList(@Param("date") Date date); List<PlanTask> getPlanTaskList(@Param("date") Date date);
PlanTask getById(@Param("planTaskId") Long planTaskId);
void updateStatusById(@Param("planTaskId") Long planTaskId, @Param("status") int status);
} }
...@@ -665,92 +665,38 @@ public class JobService implements IJobService { ...@@ -665,92 +665,38 @@ public class JobService implements IJobService {
@Override @Override
@Transactional @Transactional
public void taskJobPerform(long taskId, String jobType, String jobName) { public void taskJobPerform(long taskId, String jobType, String jobName) {
if (iTaskDao.existsById(taskId)) {
if("cluster".equals(cluster)){ Task task = iTaskDao.findById(taskId).get();
// TODO Auto-generated method stub Toke toke = remoteSecurityService.getServerToken();
//为了便于区分key,增加后缀_redisson if (XJConstant.STATUS_MONITOR_END.equals(jobType)) {
RLock lock = redisson.getLock(jobName); if (TaskStatusEnum.UNDERWAY.getValue() == task.getStatus()) {
try { task.setStatus(TaskStatusEnum.OVERTIME.getValue());
//拿锁失败10停止尝试,20秒后直接释放锁 无论是返回 true 还是 false,都会继续执行之后的代码。 iTaskDao.saveAndFlush(task);
lock.tryLock(10, 20, TimeUnit.SECONDS); TaskFeedback taskFeedback = new TaskFeedback();
//为了防止重复 taskFeedback.setUserId(task.getExecutorId());
if(!redisUtils.hasKey(jobName+"_redisson_key")) { taskFeedback.setMessage("该任务在规定时间内未完成,请核实信息!任务名称: " + task.getTitle() + " 要求完成时间: "
redisUtils.set(jobName + "_redisson_key", "1");//增加标识 + DateUtil.getDateFormat(task.getFinishTime(), "yyyy-MM-dd HH:mm:ss") + " 发起人:"
+ task.getPublisherName() + " 执行人:" + task.getExecutor());
taskFeedback.setCreateDate(new Date());
if (iTaskDao.existsById(taskId)) { taskFeedback.setUserName(task.getExecutor());
Task task = iTaskDao.findById(taskId).get(); taskFeedback.setFeedbackTime(new Date());
Toke toke = remoteSecurityService.getServerToken(); taskFeedback.setOrgCode(task.getOrgCode());
if (XJConstant.STATUS_MONITOR_END.equals(jobType)) { taskFeedback.setTaskId(task.getId());
if (TaskStatusEnum.UNDERWAY.getValue() == task.getStatus()) { taskFeedback.setMessageType(TaskStatusEnum.OVERTIME.getName());
task.setStatus(TaskStatusEnum.OVERTIME.getValue()); taskFeedback = taskFeedbackDao.save(taskFeedback);
iTaskDao.saveAndFlush(task); try {
TaskFeedback taskFeedback = new TaskFeedback(); asyncTask.pushTaskDetailInfoTo3D(toke.getToke(), toke.getProduct(), toke.getAppKey(), taskId); // 超时任务向3D推送
taskFeedback.setUserId(task.getExecutorId()); } catch (InterruptedException e) {
taskFeedback.setMessage("该任务在规定时间内未完成,请核实信息!任务名称: " + task.getTitle() + " 要求完成时间: " // TODO Auto-generated catch block
+ DateUtil.getDateFormat(task.getFinishTime(), "yyyy-MM-dd HH:mm:ss") + " 发起人:" log.error(e.getMessage(), e);
+ task.getPublisherName() + " 执行人:" + task.getExecutor()); e.printStackTrace();
taskFeedback.setCreateDate(new Date());
taskFeedback.setUserName(task.getExecutor());
taskFeedback.setFeedbackTime(new Date());
taskFeedback.setOrgCode(task.getOrgCode());
taskFeedback.setTaskId(task.getId());
taskFeedback.setMessageType(TaskStatusEnum.OVERTIME.getName());
taskFeedback = taskFeedbackDao.save(taskFeedback);
try {
asyncTask.pushTaskDetailInfoTo3D(toke.getToke(), toke.getProduct(), toke.getAppKey(), taskId); // 超时任务向3D推送
} catch (InterruptedException e) {
// TODO Auto-generated catch block
log.error(e.getMessage(), e);
e.printStackTrace();
}
}
} else {
messageService.pushTaskMessage(toke.getToke(), toke.getProduct(), toke.getAppKey(), task);
}
}
removeJob(jobName);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock(); //释放锁
}
}else{
if (iTaskDao.existsById(taskId)) {
Task task = iTaskDao.findById(taskId).get();
Toke toke = remoteSecurityService.getServerToken();
if (XJConstant.STATUS_MONITOR_END.equals(jobType)) {
if (TaskStatusEnum.UNDERWAY.getValue() == task.getStatus()) {
task.setStatus(TaskStatusEnum.OVERTIME.getValue());
iTaskDao.saveAndFlush(task);
TaskFeedback taskFeedback = new TaskFeedback();
taskFeedback.setUserId(task.getExecutorId());
taskFeedback.setMessage("该任务在规定时间内未完成,请核实信息!任务名称: " + task.getTitle() + " 要求完成时间: "
+ DateUtil.getDateFormat(task.getFinishTime(), "yyyy-MM-dd HH:mm:ss") + " 发起人:"
+ task.getPublisherName() + " 执行人:" + task.getExecutor());
taskFeedback.setCreateDate(new Date());
taskFeedback.setUserName(task.getExecutor());
taskFeedback.setFeedbackTime(new Date());
taskFeedback.setOrgCode(task.getOrgCode());
taskFeedback.setTaskId(task.getId());
taskFeedback.setMessageType(TaskStatusEnum.OVERTIME.getName());
taskFeedback = taskFeedbackDao.save(taskFeedback);
try {
asyncTask.pushTaskDetailInfoTo3D(toke.getToke(), toke.getProduct(), toke.getAppKey(), taskId); // 超时任务向3D推送
} catch (InterruptedException e) {
// TODO Auto-generated catch block
log.error(e.getMessage(), e);
e.printStackTrace();
}
} }
} else {
messageService.pushTaskMessage(toke.getToke(), toke.getProduct(), toke.getAppKey(), task);
} }
} else {
messageService.pushTaskMessage(toke.getToke(), toke.getProduct(), toke.getAppKey(), task);
} }
removeJob(jobName);
} }
} }
@Override @Override
...@@ -809,58 +755,28 @@ public class JobService implements IJobService { ...@@ -809,58 +755,28 @@ public class JobService implements IJobService {
@Transactional @Transactional
public void planTaskJobPerform(long planTaskId, String jobType, String jobName) { public void planTaskJobPerform(long planTaskId, String jobType, String jobName) {
if("cluster".equals(cluster)) { if (ObjectUtils.isEmpty(planTaskId)) {
RLock lock = redisson.getLock(jobName); log.info("任务ID为空,退出,任务Id:{}", planTaskId);
try { return;
//拿锁失败10停止尝试,20秒后直接释放锁 无论是返回 true 还是 false,都会继续执行之后的代码。 }
lock.tryLock(10, 20, TimeUnit.SECONDS); PlanTask planTask = planTaskMapper.getById(planTaskId);
System.out.println("获取锁成功============"); log.info("==用任务ID查询任务数据planTask:{},planTaskId:{}", JSON.toJSONString(planTask), planTaskId);
if (!redisUtils.hasKey(jobName + "_redisson_key")) { if (!ObjectUtils.isEmpty(planTask)) {
redisUtils.set(jobName + "_redisson_key", "1");//增加标识 if (XJConstant.STATUS_MONITOR_START.equals(jobType)) {
if (PlanTaskFinishStatusEnum.NOTSTARTED.getValue() == planTask.getFinishStatus()) {
if (iPlanTaskDao.existsById(planTaskId)) { log.debug("未开始改为进行中定时器执行=={}", jobName);
PlanTask planTask = iPlanTaskDao.findById(planTaskId).get(); planTask.setFinishStatus(PlanTaskFinishStatusEnum.UNDERWAY.getValue());
if (XJConstant.STATUS_MONITOR_START.equals(jobType)) { iPlanTaskDao.saveAndFlush(planTask);
if (PlanTaskFinishStatusEnum.NOTSTARTED.getValue() == planTask.getFinishStatus()) {
log.debug("未开始改为进行中定时器执行==" + jobName);
planTask.setFinishStatus(PlanTaskFinishStatusEnum.UNDERWAY.getValue());
iPlanTaskDao.saveAndFlush(planTask);
}
} else if (XJConstant.STATUS_MONITOR_END.equals(jobType)) {
if (PlanTaskFinishStatusEnum.UNDERWAY.getValue() == planTask.getFinishStatus()) {
log.debug("进行中改为结束定时器执行==" + jobName);
updatePlanTaskStatus(planTask, PlanTaskFinishStatusEnum.OVERTIME.getValue());
}
} else {
Toke toke = remoteSecurityService.getServerToken();
messageService.pushPlanTaskMessage(toke.getToke(), toke.getProduct(), toke.getAppKey(), planTask, jobType);
}
}
removeJob(jobName);
} }
} catch (Exception e) { } else if (XJConstant.STATUS_MONITOR_END.equals(jobType)) {
e.printStackTrace(); if (PlanTaskFinishStatusEnum.UNDERWAY.getValue() == planTask.getFinishStatus()) {
} finally { log.info("进行中改为结束定时器执行=={}", jobName);
lock.unlock(); //释放锁 updatePlanTaskStatus(planTask, PlanTaskFinishStatusEnum.OVERTIME.getValue());
}
}else{
if (iPlanTaskDao.existsById(planTaskId)) {
PlanTask planTask = iPlanTaskDao.findById(planTaskId).get();
if (XJConstant.STATUS_MONITOR_START.equals(jobType)) {
if (PlanTaskFinishStatusEnum.NOTSTARTED.getValue() == planTask.getFinishStatus()) {
planTask.setFinishStatus(PlanTaskFinishStatusEnum.UNDERWAY.getValue());
iPlanTaskDao.save(planTask);
}
} else if (XJConstant.STATUS_MONITOR_END.equals(jobType)) {
if (PlanTaskFinishStatusEnum.UNDERWAY.getValue() == planTask.getFinishStatus()) {
updatePlanTaskStatus(planTask, PlanTaskFinishStatusEnum.OVERTIME.getValue());
}
} else {
Toke toke = remoteSecurityService.getServerToken();
messageService.pushPlanTaskMessage(toke.getToke(), toke.getProduct(), toke.getAppKey(), planTask, jobType);
} }
} else {
Toke toke = remoteSecurityService.getServerToken();
messageService.pushPlanTaskMessage(toke.getToke(), toke.getProduct(), toke.getAppKey(), planTask, jobType);
} }
removeJob(jobName);
} }
} }
...@@ -871,34 +787,10 @@ public class JobService implements IJobService { ...@@ -871,34 +787,10 @@ public class JobService implements IJobService {
@Override @Override
public void msgJobPerform(long msgId, String jobType, String jobName) { public void msgJobPerform(long msgId, String jobType, String jobName) {
if("cluster".equals(cluster)) { if (iMsgDao.existsById(msgId)) {
RLock lock = redisson.getLock(jobName); Msg msg = iMsgDao.findById(msgId).get();
try { Toke toke = remoteSecurityService.getServerToken();
//拿锁失败10停止尝试,20秒后直接释放锁 无论是返回 true 还是 false,都会继续执行之后的代码。 messageService.pushMsgAndSave(toke.getToke(), toke.getProduct(), toke.getAppKey(), msg);
lock.tryLock(10, 20, TimeUnit.SECONDS);
//为了防止重复
if (!redisUtils.hasKey(jobName + "_redisson_key")) {
redisUtils.set(jobName + "_redisson_key", "1");//增加标识
if (iMsgDao.existsById(msgId)) {
Msg msg = iMsgDao.findById(msgId).get();
Toke toke = remoteSecurityService.getServerToken();
messageService.pushMsgAndSave(toke.getToke(), toke.getProduct(), toke.getAppKey(), msg);
}
removeJob(jobName);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock(); //释放锁
}
}else{
if (iMsgDao.existsById(msgId)) {
Msg msg = iMsgDao.findById(msgId).get();
Toke toke = remoteSecurityService.getServerToken();
messageService.pushMsgAndSave(toke.getToke(), toke.getProduct(), toke.getAppKey(), msg);
}
removeJob(jobName);
} }
} }
......
...@@ -1140,4 +1140,11 @@ ...@@ -1140,4 +1140,11 @@
(select id from p_plan where is_delete = 0 and status = 0) (select id from p_plan where is_delete = 0 and status = 0)
</select> </select>
<select id="getById" resultType="com.yeejoin.amos.patrol.dao.entity.PlanTask">
select * from p_plan_task where id = #{planTaskId}
</select>
<update id="updateStatusById">
update p_plan_task set finish_status = #{status} where id = #{planTaskId}
</update>
</mapper> </mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment