10.6设备采集规则修改

dev
xiaohuo 9 months ago
parent 62be1abd27
commit c5903d61c7
  1. 27
      ALOps_sys_backend/alops-admin/src/main/java/com/alops/web/controller/equManagement/ScheduleRulesController.java
  2. 30
      ALOps_sys_backend/alops-system/src/main/java/com/alops/system/job/GatherJob.java
  3. 4
      ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/IScheduleRulesService.java
  4. 139
      ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/ScheduleRulesServiceImpl.java

@ -58,28 +58,29 @@ public class ScheduleRulesController extends BaseController
@PreAuthorize("@ss.hasPermi('device:deviceInformation:protoCollect')") @PreAuthorize("@ss.hasPermi('device:deviceInformation:protoCollect')")
@PostMapping("/addRule") @PostMapping("/addRule")
@ApiOperation("立即确定") @ApiOperation("立即确定")
public AjaxResult run(@RequestBody ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException {
if(scheduleRulesService.checkRunningOrWaitingRules()){
return AjaxResult.error("正在采集,请稍后");
}
if (newRule.getRuleType() == 2) { public AjaxResult run(@RequestBody ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException {
// 立即执行
return scheduleRulesService.executeRule(newRule);
} else { // 先检查是否有任务正在执行
// 固定时间/按频率:异步处理异常 if (scheduleRulesService.checkRunningOrWaitingRules()) {
scheduleRulesService.executeRule(newRule); return AjaxResult.error(4001,"正在采集,请稍后,此次采集完成后会站内信通知到你");
}
return AjaxResult.success("任务已调度成功,异常会通过站内信/邮件通知"); // 执行规则(立即或定时/按频率)
} boolean success = scheduleRulesService.executeRule(newRule);
if (success) {
// 返回调度/插入成功
return AjaxResult.success("任务已调度成功,采集结果会通过站内信/邮件通知");
} else {
return AjaxResult.error("任务设置失败,请稍后重试");
}
} }
/** /**
* 查询定时采集规则列表 * 查询定时采集规则列表
*/ */

@ -39,7 +39,23 @@ public class GatherJob implements Job {
try { try {
if (rule == null) return; 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) { if (rule.getRuleType() == 0) {
Date start = rule.getStartTime(); Date start = rule.getStartTime();
Date end = rule.getEndTime(); Date end = rule.getEndTime();
@ -48,7 +64,6 @@ public class GatherJob implements Job {
if ( now.after(end)) { if ( now.after(end)) {
rule.setStatus(2); // 超出范围标记完成 rule.setStatus(2); // 超出范围标记完成
scheduleRulesMapper.updateScheduleRules(rule); scheduleRulesMapper.updateScheduleRules(rule);
return; return;
} }
} }
@ -58,10 +73,17 @@ public class GatherJob implements Job {
iScheduleRulesService.executeImmediately(); iScheduleRulesService.executeImmediately();
// 执行成功 // 执行成功
if (rule.getRuleType() == 0 || rule.getRuleType() == 1) { if (rule.getRuleType() == 1 ) {
rule.setStatus(2); rule.setStatus(2);
String Content=String.format("任务执行完成",
rule.getId(), rule.getRuleName());
iAlertSenderService.sendInternalMessage( Content,"2" );
scheduleRulesMapper.updateScheduleRules(rule);
} }
scheduleRulesMapper.updateScheduleRules(rule);
} catch (Exception e) { } catch (Exception e) {
//执行失败是不会有采集信息和预警信息的 //执行失败是不会有采集信息和预警信息的

@ -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; public int executeImmediately() throws ExecutionException, InterruptedException;
/** /**

@ -5,10 +5,7 @@ import java.sql.SQLOutput;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException; import java.util.concurrent.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.alops.common.core.domain.AjaxResult; import com.alops.common.core.domain.AjaxResult;
@ -25,6 +22,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -57,81 +55,117 @@ public class ScheduleRulesServiceImpl implements IScheduleRulesService {
@Autowired @Autowired
private MemoryToolService memoryToolService; private MemoryToolService memoryToolService;
@Autowired
private IAlertSenderService iAlertSenderService;
private static final Logger log = LoggerFactory.getLogger(ScheduleRulesServiceImpl.class); private static final Logger log = LoggerFactory.getLogger(ScheduleRulesServiceImpl.class);
@Override @Override
public Boolean checkRunningOrWaitingRules() { @Transactional(propagation = Propagation.REQUIRES_NEW)
public Boolean checkRunningOrWaitingRules() throws SchedulerException {
List<ScheduleRules> runningOrWaiting = scheduleRulesMapper.selectListOne();
// 检查列表是否不为空且有数据
if (runningOrWaiting != null && !runningOrWaiting.isEmpty()) {
return true;
}
return false;
}
@Override
public AjaxResult executeRule(ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException {
// 1. 获取所有正在执行(1)和待执行(0)的规则
List<ScheduleRules> runningOrWaiting = scheduleRulesMapper.selectList(); List<ScheduleRules> runningOrWaiting = scheduleRulesMapper.selectList();
if (runningOrWaiting!=null) { if (runningOrWaiting!=null) {
for (ScheduleRules rule : runningOrWaiting) { for (ScheduleRules rule : runningOrWaiting) {
switch (rule.getStatus()) { switch (rule.getStatus()) {
case 1: // 正在执行 case 1: // 正在执行
log.info("规则[{}]:正在执行上一个任务,等待上一个任务完成……", rule.getId()); log.info("规则[{}]:正在执行上一个任务,等待上一个任务完成……", rule.getId());
waitTaskFinish(rule.getId());
log.info("规则[{}]:完成上一个任务任务,开始新的任务…", rule.getId());
if (rule.getRuleType() == 2 || rule.getRuleType() == 1) { if (rule.getRuleType() == 2 || rule.getRuleType() == 1) {
rule.setStatus(2); rule.setStatus(2);
} else if (rule.getRuleType() == 0) { } else if (rule.getRuleType() == 0) {
log.info("改变状态为4");
rule.setStatus(4); rule.setStatus(4);
} }
scheduleRulesMapper.updateScheduleRules(rule); scheduleRulesMapper.updateScheduleRules(rule);
break; return true;
case 0: // 待执行 case 0: // 待执行
if (rule.getRuleType() == 0 || rule.getRuleType() == 1) { if (rule.getRuleType() == 0 || rule.getRuleType() == 1) {
quartzService.deleteJob(rule.getId()); quartzService.deleteJob(rule.getId());
} }
rule.setStatus(4); rule.setStatus(4);
scheduleRulesMapper.updateScheduleRules(rule); scheduleRulesMapper.updateScheduleRules(rule);
break; return false;
default: default:
break; return true;
} }
} }
} }
// 2. 执行新规则 return false;
}
//首先存入规则在执行 @Override
Date now = new Date(); public Boolean executeRule(ScheduleRules newRule) throws SchedulerException, ExecutionException, InterruptedException {
Long userId = SecurityUtils.getLoginUser().getUserId();
newRule.setCreatedBy(userId);
newRule.setCreatedAt(now); // // 1. 获取所有正在执行(1)和待执行(0)的规则
newRule.setStatus(0); // List<ScheduleRules> runningOrWaiting = scheduleRulesMapper.selectList();
scheduleRulesMapper.insertScheduleRules(newRule); // if (runningOrWaiting!=null) {
switch (newRule.getRuleType().toString()) { // for (ScheduleRules rule : runningOrWaiting) {
case "2": // 立即执行 // switch (rule.getStatus()) {
newRule.setStatus(1); // case 1: // 正在执行
scheduleRulesMapper.updateScheduleRules(newRule); // log.info("规则[{}]:正在执行上一个任务,等待上一个任务完成……", rule.getId());
try { // waitTaskFinish(rule.getId());
executeImmediately(); // log.info("规则[{}]:完成上一个任务任务,开始新的任务…", rule.getId());
newRule.setStatus(2); // if (rule.getRuleType() == 2 || rule.getRuleType() == 1) {
scheduleRulesMapper.updateScheduleRules(newRule); // rule.setStatus(2);
return AjaxResult.success("立即执行任务成功:"); // 异常会抛出,前端收到 // } else if (rule.getRuleType() == 0) {
} catch (Exception e) { // rule.setStatus(4);
// }
newRule.setStatus(3); // 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); 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": // 固定时间 case "1": // 固定时间
newRule.setStatus(0); newRule.setStatus(0);
scheduleRulesMapper.updateScheduleRules(newRule); scheduleRulesMapper.updateScheduleRules(newRule);
@ -148,10 +182,14 @@ public class ScheduleRulesServiceImpl implements IScheduleRulesService {
quartzService.createOrUpdateJob(newRule); quartzService.createOrUpdateJob(newRule);
} }
break; break;
default: default:
throw new IllegalArgumentException("Unsupported rule type"); 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(); iAlertLaunchService.executeImmediateAlerts();
log.info("采集完一次!!!");
return result; return result;
} }

Loading…
Cancel
Save