From 0dc3779c31af4f070d3dfec5cc9910d9caa7687c Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期六, 23 五月 2026 17:17:12 +0800
Subject: [PATCH] fix: 修改定时任务报错、任务可以开启和关闭、删除时移除定时任务
---
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java | 50 +++++++++++++++++++-----
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java | 44 ++++++++++++++++++---
src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java | 4 +-
3 files changed, 78 insertions(+), 20 deletions(-)
diff --git a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
index 350a09d..3fedf2c 100644
--- a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
+++ b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -62,8 +62,8 @@
@Schema(description = "鏈�鍚庢墽琛屾椂闂�")
private LocalDateTime lastExecutionTime;
- @Schema(description = "鏄惁婵�娲�")
- private boolean isActive;
+ @Schema(description = "鏄惁婵�娲�, 1=鍚敤, 0=鍋滅敤")
+ private Integer isActive;
@Schema(description = "澶囨敞")
@Excel(name = "澶囨敞")
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
index ec7a8e3..3913b8b 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -25,13 +25,25 @@
private final Scheduler scheduler;
/**
- * 娣诲姞鏂颁换鍔″埌璋冨害鍣�
+ * 娣诲姞鎴栨洿鏂颁换鍔″埌璋冨害鍣�
*/
public void scheduleMaintenanceTask(MaintenanceTask task){
try {
JobDetail jobDetail = buildJobDetail(task);
Trigger trigger = buildJobTrigger(task, jobDetail);
- scheduler.scheduleJob(jobDetail, trigger);
+
+ // 妫�鏌ヨЕ鍙戝櫒鏄惁宸插瓨鍦�
+ TriggerKey triggerKey = trigger.getKey();
+ Trigger existingTrigger = scheduler.getTrigger(triggerKey);
+
+ if (existingTrigger != null) {
+ // 瑙﹀彂鍣ㄥ凡瀛樺湪锛屾洿鏂板畠
+ scheduler.rescheduleJob(triggerKey, trigger);
+ } else {
+ // 瑙﹀彂鍣ㄤ笉瀛樺湪锛屽厛纭繚 Job 瀛樺湪锛岀劧鍚庤皟搴﹁Е鍙戝櫒
+ scheduler.addJob(jobDetail, true);
+ scheduler.scheduleJob(trigger);
+ }
}catch (SchedulerException e){
log.error("SchedulerException scheduleMaintenanceTask ERROR",e);
throw new RuntimeException(e);
@@ -45,26 +57,41 @@
try{
TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
- // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
+ // 鑾峰彇鐜版湁瑙﹀彂鍣�
Trigger oldTrigger = scheduler.getTrigger(triggerKey);
+
+ // 鏋勫缓鏂扮殑 JobDetail 鍜� Trigger
+ JobDetail jobDetail = buildJobDetail(task);
+ Trigger newTrigger = buildJobTrigger(task, jobDetail);
+
+ if (oldTrigger == null) {
+ // 瑙﹀彂鍣ㄤ笉瀛樺湪锛岃鏄庝换鍔′箣鍓嶈鍒犻櫎杩�
+ // 鍏堢‘淇� Job 瀛樺湪锛岀劧鍚庤皟搴﹁Е鍙戝櫒
+ scheduler.addJob(jobDetail, true);
+ scheduler.scheduleJob(newTrigger);
+ return;
+ }
+
+ // 瑙﹀彂鍣ㄥ瓨鍦紝鐩存帴鏇存柊
if (!(oldTrigger instanceof CronTrigger)) {
throw new SchedulerException("Existing trigger is not a CronTrigger");
}
- // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
- CronTrigger newTrigger = TriggerBuilder.newTrigger()
- .withIdentity(triggerKey) // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
- .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
- .forJob(oldTrigger.getJobKey()) // 鍏宠仈瀵瑰簲鐨凧ob
+ // 鏋勫缓鏂扮殑 CronTrigger
+ CronTrigger cronTrigger = TriggerBuilder.newTrigger()
+ .withIdentity(triggerKey)
+ .withDescription(task.getTaskName() + "_TRIGGER")
+ .forJob(oldTrigger.getJobKey())
.withSchedule(CronScheduleBuilder
- .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+ .cronSchedule(convertToCronExpression(task))
+ .withMisfireHandlingInstructionDoNothing()
)
- // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
.startAt(task.getNextExecutionTime() != null
? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
: new Date())
.build();
- scheduler.rescheduleJob(triggerKey, newTrigger);
+
+ scheduler.rescheduleJob(triggerKey, cronTrigger);
}catch (SchedulerException e){
log.error("SchedulerException rescheduleMaintenanceTask ERROR",e);
throw new RuntimeException(e);
@@ -93,6 +120,7 @@
public void unscheduleMaintenanceTask(Long taskId){
try {
JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
+ // 鍒犻櫎 Job 浼氳嚜鍔ㄥ垹闄ゅ叧鑱旂殑 Trigger
scheduler.deleteJob(jobKey);
}catch (SchedulerException e){
log.error("SchedulerException unscheduleMaintenanceTask ERROR",e);
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..c666f3f 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -67,7 +67,6 @@
@Override
public AjaxResult add(MaintenanceTask maintenanceTask) {
- maintenanceTask.setActive(true);
// 璁$畻棣栨鎵ц鏃堕棿
TimingTask task = new TimingTask();
task.setFrequencyType(maintenanceTask.getFrequencyType());
@@ -76,7 +75,10 @@
maintenanceTask.setNextExecutionTime(firstExecutionTime);
int insert = maintenanceTaskMapper.insert(maintenanceTask);
if (insert > 0) {
- maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+ // 鍙湁褰� isActive 涓� 1 鏃舵墠娣诲姞鍒板畾鏃朵换鍔¤皟搴﹀櫒
+ if (maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) {
+ maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+ }
}
return AjaxResult.success("娣诲姞鎴愬姛");
}
@@ -87,22 +89,50 @@
if (maintenanceTask1 == null) {
return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
}
+
+ // 淇濆瓨鏃х殑 isActive 鐘舵��
+ Integer oldIsActive = maintenanceTask1.getIsActive();
+ Integer newIsActive = maintenanceTask.getIsActive();
+
BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
int update = maintenanceTaskMapper.updateById(maintenanceTask1);
if (update > 0) {
- maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ // 澶勭悊 isActive 鐘舵�佸彉鍖�
+ if (newIsActive != null && newIsActive == 1) {
+ // 鏂扮姸鎬佷负鍚敤锛氭坊鍔犲埌瀹氭椂浠诲姟璋冨害鍣�
+ if (oldIsActive == null || oldIsActive != 1) {
+ // 浠庢湭鍚敤鍙樹负鍚敤锛屾坊鍔犲埌璋冨害鍣�
+ maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask1);
+ } else {
+ // 宸茬粡鍚敤锛屾洿鏂拌皟搴﹀櫒涓殑浠诲姟
+ maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ }
+ } else {
+ // 鏂扮姸鎬佷负鍋滅敤锛氫粠瀹氭椂浠诲姟璋冨害鍣ㄤ腑绉婚櫎
+ if (oldIsActive != null && oldIsActive == 1) {
+ maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask1.getId());
+ }
+ }
}
return AjaxResult.success("鏇存柊鎴愬姛");
}
@Override
public AjaxResult delete(List<Long> ids) {
+ // 鍏堜粠瀹氭椂浠诲姟璋冨害鍣ㄤ腑绉婚櫎鎵�鏈夊緟鍒犻櫎鐨勪换鍔�
+ ids.forEach(id -> {
+ try {
+ maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
+ } catch (Exception e) {
+ log.error("鍒犻櫎瀹氭椂浠诲姟璋冨害澶辫触, id: {}", id, e);
+ }
+ });
+
+ // 鍐嶄粠鏁版嵁搴撲腑鍒犻櫎璁板綍
int delete = maintenanceTaskMapper.deleteBatchIds(ids);
if (delete > 0) {
- ids.forEach(id -> {
- maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
- });
+ return AjaxResult.success("鍒犻櫎鎴愬姛");
}
- return AjaxResult.success("鍒犻櫎鎴愬姛");
+ return AjaxResult.error("鍒犻櫎澶辫触");
}
}
--
Gitblit v1.9.3