From c5903d61c7b65dc760798786dbfb3b96e3580f4f Mon Sep 17 00:00:00 2001 From: xiaohuo <14141624+dsgfhrh@user.noreply.gitee.com> Date: Fri, 10 Oct 2025 23:55:32 +0800 Subject: [PATCH] =?UTF-8?q?10.6=E8=AE=BE=E5=A4=87=E9=87=87=E9=9B=86?= =?UTF-8?q?=E8=A7=84=E5=88=99=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScheduleRulesController.java | 27 ++-- .../java/com/alops/system/job/GatherJob.java | 30 +++- .../system/service/IScheduleRulesService.java | 4 +- .../impl/ScheduleRulesServiceImpl.java | 139 +++++++++++------- 4 files changed, 131 insertions(+), 69 deletions(-) diff --git a/ALOps_sys_backend/alops-admin/src/main/java/com/alops/web/controller/equManagement/ScheduleRulesController.java b/ALOps_sys_backend/alops-admin/src/main/java/com/alops/web/controller/equManagement/ScheduleRulesController.java index e716b7fd..26f2b35d 100644 --- a/ALOps_sys_backend/alops-admin/src/main/java/com/alops/web/controller/equManagement/ScheduleRulesController.java +++ b/ALOps_sys_backend/alops-admin/src/main/java/com/alops/web/controller/equManagement/ScheduleRulesController.java @@ -58,28 +58,29 @@ public class ScheduleRulesController extends BaseController @PreAuthorize("@ss.hasPermi('device:deviceInformation:protoCollect')") @PostMapping("/addRule") @ApiOperation("立即确定") - public AjaxResult run(@RequestBody ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException { - - if(scheduleRulesService.checkRunningOrWaitingRules()){ - return AjaxResult.error("正在采集,请稍后"); - } - if (newRule.getRuleType() == 2) { - // 立即执行 - return scheduleRulesService.executeRule(newRule); + public AjaxResult run(@RequestBody ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException { - } else { - // 固定时间/按频率:异步处理异常 - scheduleRulesService.executeRule(newRule); + // 先检查是否有任务正在执行 + if (scheduleRulesService.checkRunningOrWaitingRules()) { + return AjaxResult.error(4001,"正在采集,请稍后,此次采集完成后会站内信通知到你"); + } - return AjaxResult.success("任务已调度成功,异常会通过站内信/邮件通知"); - } + // 执行规则(立即或定时/按频率) + boolean success = scheduleRulesService.executeRule(newRule); + if (success) { + // 返回调度/插入成功 + return AjaxResult.success("任务已调度成功,采集结果会通过站内信/邮件通知"); + } else { + return AjaxResult.error("任务设置失败,请稍后重试"); + } } + /** * 查询定时采集规则列表 */ diff --git a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/job/GatherJob.java b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/job/GatherJob.java index c9f27b42..0be7b9bf 100644 --- a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/job/GatherJob.java +++ b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/job/GatherJob.java @@ -39,7 +39,23 @@ public class GatherJob implements Job { try { if (rule == null) return; - // 按频率判断时间范围 + // 1.状态为4时取消调度任务 + if (rule.getStatus() == 4) { + Scheduler scheduler = context.getScheduler(); + JobKey jobKey = context.getJobDetail().getKey(); + scheduler.deleteJob(jobKey); + String Content=String.format("任务执行完此次,已取消后续任务"); + + iAlertSenderService.sendInternalMessage( Content,"2" ); + log.info("规则[{}] 已标记为取消状态(4),对应定时任务已删除: {}", rule.getId(), jobKey); + + return; + } + // 2.设置状态为执行中 + rule.setStatus(1); + scheduleRulesMapper.updateScheduleRules(rule); + + // 3.判断是否执行完成 按频率判断时间范围 if (rule.getRuleType() == 0) { Date start = rule.getStartTime(); Date end = rule.getEndTime(); @@ -48,7 +64,6 @@ public class GatherJob implements Job { if ( now.after(end)) { rule.setStatus(2); // 超出范围标记完成 scheduleRulesMapper.updateScheduleRules(rule); - return; } } @@ -58,10 +73,17 @@ public class GatherJob implements Job { iScheduleRulesService.executeImmediately(); // 执行成功 - if (rule.getRuleType() == 0 || rule.getRuleType() == 1) { + if (rule.getRuleType() == 1 ) { rule.setStatus(2); + + String Content=String.format("任务执行完成", + rule.getId(), rule.getRuleName()); + + iAlertSenderService.sendInternalMessage( Content,"2" ); + scheduleRulesMapper.updateScheduleRules(rule); } - scheduleRulesMapper.updateScheduleRules(rule); + + } catch (Exception e) { //执行失败是不会有采集信息和预警信息的 diff --git a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/IScheduleRulesService.java b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/IScheduleRulesService.java index 931bed97..8843a655 100644 --- a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/IScheduleRulesService.java +++ b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/IScheduleRulesService.java @@ -21,9 +21,9 @@ public interface IScheduleRulesService - public Boolean checkRunningOrWaitingRules(); + public Boolean checkRunningOrWaitingRules() throws SchedulerException; - public AjaxResult executeRule(ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException; + public Boolean executeRule(ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException; public int executeImmediately() throws ExecutionException, InterruptedException; /** diff --git a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/ScheduleRulesServiceImpl.java b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/ScheduleRulesServiceImpl.java index 2f7c2db0..e4b85269 100644 --- a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/ScheduleRulesServiceImpl.java +++ b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/ScheduleRulesServiceImpl.java @@ -5,10 +5,7 @@ import java.sql.SQLOutput; import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; +import java.util.concurrent.*; import java.util.stream.Collectors; import com.alops.common.core.domain.AjaxResult; @@ -25,6 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -57,81 +55,117 @@ public class ScheduleRulesServiceImpl implements IScheduleRulesService { @Autowired private MemoryToolService memoryToolService; + @Autowired + private IAlertSenderService iAlertSenderService; private static final Logger log = LoggerFactory.getLogger(ScheduleRulesServiceImpl.class); @Override - public Boolean checkRunningOrWaitingRules() { - - List runningOrWaiting = scheduleRulesMapper.selectListOne(); - - // 检查列表是否不为空且有数据 - if (runningOrWaiting != null && !runningOrWaiting.isEmpty()) { - return true; - } - return false; - } - - @Override - public AjaxResult executeRule(ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException { - + @Transactional(propagation = Propagation.REQUIRES_NEW) + public Boolean checkRunningOrWaitingRules() throws SchedulerException { - // 1. 获取所有正在执行(1)和待执行(0)的规则 List runningOrWaiting = scheduleRulesMapper.selectList(); if (runningOrWaiting!=null) { for (ScheduleRules rule : runningOrWaiting) { switch (rule.getStatus()) { case 1: // 正在执行 log.info("规则[{}]:正在执行上一个任务,等待上一个任务完成……", rule.getId()); - waitTaskFinish(rule.getId()); - log.info("规则[{}]:完成上一个任务任务,开始新的任务…", rule.getId()); if (rule.getRuleType() == 2 || rule.getRuleType() == 1) { rule.setStatus(2); } else if (rule.getRuleType() == 0) { + log.info("改变状态为4"); rule.setStatus(4); } scheduleRulesMapper.updateScheduleRules(rule); - break; + return true; case 0: // 待执行 if (rule.getRuleType() == 0 || rule.getRuleType() == 1) { quartzService.deleteJob(rule.getId()); } rule.setStatus(4); scheduleRulesMapper.updateScheduleRules(rule); - break; + return false; default: - break; + return true; } } } - // 2. 执行新规则 + return false; + } - //首先存入规则在执行 - Date now = new Date(); - Long userId = SecurityUtils.getLoginUser().getUserId(); - newRule.setCreatedBy(userId); - newRule.setCreatedAt(now); - newRule.setStatus(0); - scheduleRulesMapper.insertScheduleRules(newRule); - switch (newRule.getRuleType().toString()) { - case "2": // 立即执行 - newRule.setStatus(1); - scheduleRulesMapper.updateScheduleRules(newRule); - try { - executeImmediately(); - newRule.setStatus(2); - scheduleRulesMapper.updateScheduleRules(newRule); - return AjaxResult.success("立即执行任务成功:"); // 异常会抛出,前端收到 - } catch (Exception e) { - - newRule.setStatus(3); + @Override + public Boolean executeRule(ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException { + + +// // 1. 获取所有正在执行(1)和待执行(0)的规则 +// List runningOrWaiting = scheduleRulesMapper.selectList(); +// if (runningOrWaiting!=null) { +// for (ScheduleRules rule : runningOrWaiting) { +// switch (rule.getStatus()) { +// case 1: // 正在执行 +// log.info("规则[{}]:正在执行上一个任务,等待上一个任务完成……", rule.getId()); +// waitTaskFinish(rule.getId()); +// log.info("规则[{}]:完成上一个任务任务,开始新的任务…", rule.getId()); +// if (rule.getRuleType() == 2 || rule.getRuleType() == 1) { +// rule.setStatus(2); +// } else if (rule.getRuleType() == 0) { +// rule.setStatus(4); +// } +// scheduleRulesMapper.updateScheduleRules(rule); +// break; +// case 0: // 待执行 +// if (rule.getRuleType() == 0 || rule.getRuleType() == 1) { +// quartzService.deleteJob(rule.getId()); +// } +// rule.setStatus(4); +// scheduleRulesMapper.updateScheduleRules(rule); +// break; +// default: +// break; +// } +// } +// } + // 2. 执行新规则 + try { + Date now = new Date(); + Long userId = SecurityUtils.getLoginUser().getUserId(); + + // 1. 初始化规则 + newRule.setCreatedBy(userId); + newRule.setCreatedAt(now); + newRule.setStatus(0); + scheduleRulesMapper.insertScheduleRules(newRule); // 插入成功与否决定返回值 + + switch (newRule.getRuleType().toString()) { + case "2": // 立即执行 + newRule.setStatus(1); // 执行中 scheduleRulesMapper.updateScheduleRules(newRule); - // 只捕获立即执行异常 - return AjaxResult.error("立即执行任务失败:" + e.getMessage()); - } + // 异步立即执行采集任务 + CompletableFuture.runAsync(() -> { + try { + executeImmediately(); // 实际采集逻辑 + newRule.setStatus(2); // 执行成功 + scheduleRulesMapper.updateScheduleRules(newRule); + + String content = String.format("立即任务 [%s] 执行完成", newRule.getRuleName()); + iAlertSenderService.sendInternalMessage(content, "2"); + + } catch (Exception e) { + newRule.setStatus(3); // 执行失败 + scheduleRulesMapper.updateScheduleRules(newRule); + + String content = String.format("立即任务 [%s] 执行失败:%s", newRule.getRuleName(), e.getMessage()); + try { + iAlertSenderService.sendInternalMessage(content, "2"); + } catch (Exception ne) { + log.error("发送站内信失败: {}", ne.getMessage(), ne); + } + } + }); + break; case "1": // 固定时间 newRule.setStatus(0); scheduleRulesMapper.updateScheduleRules(newRule); @@ -148,10 +182,14 @@ public class ScheduleRulesServiceImpl implements IScheduleRulesService { quartzService.createOrUpdateJob(newRule); } break; - default: - throw new IllegalArgumentException("Unsupported rule type"); + default: + throw new IllegalArgumentException("Unsupported rule type"); + } + return true; // 插入和调度成功 + } catch (Exception e) { + log.error("规则设置失败: {}", e.getMessage(), e); + return false; // 插入或调度失败 } - return null; } /** @@ -255,6 +293,7 @@ public class ScheduleRulesServiceImpl implements IScheduleRulesService { // 执行最新预警 iAlertLaunchService.executeImmediateAlerts(); + log.info("采集完一次!!!"); return result; }