From 0a4d548b6bf9cfef252400fb6d6612e45cf5b602 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 27 十月 2026 13:21:23 +0800
Subject: [PATCH] fix(scheduler): 修复定时任务调度问题并增强系统稳定性
---
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
index 3aaac94..b8abe83 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.device.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
@@ -11,6 +12,7 @@
import com.ruoyi.inspectiontask.service.impl.TimingTaskServiceImpl;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
+import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -32,9 +34,39 @@
private final TimingTaskServiceImpl timingTaskService;
private final MaintenanceTaskScheduler maintenanceTaskScheduler;
+ /**
+ * 鍚姩鏃舵妸宸插惎鐢ㄤ絾鏈敞鍐屽埌 Quartz 鐨勪繚鍏讳换鍔¤ˉ娉ㄥ唽锛�
+ * 閬垮厤璋冨害璁板綍涓㈠け鍚庡畾鏃朵换鍔¢潤榛樹笉鎵ц
+ */
+ @PostConstruct
+ public void restoreScheduledTasks() {
+ try {
+ List<MaintenanceTask> tasks = maintenanceTaskMapper.selectList(new QueryWrapper<MaintenanceTask>()
+ .eq("is_active", 1)
+ .eq("deleted", 0));
+ for (MaintenanceTask task : tasks) {
+ try {
+ TimingTask timingTask = new TimingTask();
+ timingTask.setFrequencyType(task.getFrequencyType());
+ timingTask.setFrequencyDetail(task.getFrequencyDetail());
+ LocalDateTime nextTime = timingTaskService.calculateFirstExecutionTime(timingTask);
+ if (!Objects.equals(task.getNextExecutionTime(), nextTime)) {
+ task.setNextExecutionTime(nextTime);
+ maintenanceTaskMapper.updateById(task);
+ }
+ maintenanceTaskScheduler.ensureScheduled(task);
+ } catch (Exception e) {
+ log.error("鎭㈠淇濆吇瀹氭椂浠诲姟澶辫触: id={}, name={}", task.getId(), task.getTaskName(), e);
+ }
+ }
+ } catch (Exception e) {
+ log.error("鎭㈠淇濆吇瀹氭椂浠诲姟寮傚父", e);
+ }
+ }
+
@Override
public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
- Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null);
+ Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, new QueryWrapper<MaintenanceTask>().orderByDesc("create_time"));
// 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
if (taskPage.getRecords().isEmpty()) {
return AjaxResult.success(taskPage);
@@ -87,10 +119,23 @@
if (maintenanceTask1 == null) {
return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
}
+ // 棰戠巼鍙樺寲鏃堕噸绠椾笅娆℃墽琛屾椂闂达紝閬垮厤椤甸潰鏄剧ず涓庡疄闄呰皟搴︿笉涓�鑷�
+ boolean frequencyChanged = !Objects.equals(maintenanceTask.getFrequencyType(), maintenanceTask1.getFrequencyType())
+ || !Objects.equals(maintenanceTask.getFrequencyDetail(), maintenanceTask1.getFrequencyDetail());
BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
+ if (frequencyChanged) {
+ TimingTask task = new TimingTask();
+ task.setFrequencyType(maintenanceTask1.getFrequencyType());
+ task.setFrequencyDetail(maintenanceTask1.getFrequencyDetail());
+ maintenanceTask1.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(task));
+ }
int update = maintenanceTaskMapper.updateById(maintenanceTask1);
if (update > 0) {
- maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ if (maintenanceTask1.isActive()) {
+ maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ } else {
+ maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask1.getId());
+ }
}
return AjaxResult.success("鏇存柊鎴愬姛");
}
--
Gitblit v1.9.3