| src/main/java/com/ruoyi/device/init/MaintenanceTaskRegistrar.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/inspectiontask/init/TimingTaskRegistrar.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ruoyi/device/init/MaintenanceTaskRegistrar.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.ruoyi.device.init; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.device.mapper.MaintenanceTaskMapper; import com.ruoyi.device.pojo.MaintenanceTask; import com.ruoyi.device.service.impl.MaintenanceTaskScheduler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.util.List; /** * å¯å¨æ¶æå·²å¯ç¨çä¿å »å®æ¶ä»»å¡æ³¨åå°è°åº¦å¨ï¼ä¿è¯å岿°æ®ï¼ç´æ¥ååºã仿ªç»è¿ serviceï¼ä¹è½è¢«æ§è¡ */ @Slf4j @Component @RequiredArgsConstructor public class MaintenanceTaskRegistrar implements ApplicationRunner { private final MaintenanceTaskMapper maintenanceTaskMapper; private final MaintenanceTaskScheduler maintenanceTaskScheduler; @Override public void run(ApplicationArguments args) { try { List<MaintenanceTask> tasks = maintenanceTaskMapper.selectList( new QueryWrapper<MaintenanceTask>().eq("deleted", 0).eq("is_active", 1)); int registered = 0; for (MaintenanceTask task : tasks) { try { if (maintenanceTaskScheduler.isRegistered(task.getId())) { continue; } maintenanceTaskScheduler.scheduleMaintenanceTask(task); registered++; } catch (Exception e) { log.warn("ä¿å »å®æ¶ä»»å¡æ³¨å失败 id={} name={}", task.getId(), task.getTaskName(), e); } } log.info("ä¿å »å®æ¶ä»»å¡æ³¨å宿ï¼å¾ 注å {} æ¡ï¼æ¬æ¬¡æ°æ³¨å {} æ¡", tasks.size(), registered); } catch (Exception e) { log.error("ä¿å »å®æ¶ä»»å¡å¯å¨æ³¨å失败", e); } } } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -6,6 +6,7 @@ import org.quartz.*; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeParseException; @@ -31,6 +32,10 @@ try { JobDetail jobDetail = buildJobDetail(task); Trigger trigger = buildJobTrigger(task, jobDetail); if (scheduler.checkExists(jobDetail.getKey())) { // æä¹ åçJobå¯è½è¿å¨ï¼ä¾å¦å岿°æ®ç´æ¥åå ¥ã䏿¬¡æªæ¸ çï¼ï¼å ç§»é¤æ§çJobåå ¶è§¦åå¨ scheduler.deleteJob(jobDetail.getKey()); } scheduler.scheduleJob(jobDetail, trigger); }catch (SchedulerException e){ log.error("SchedulerException scheduleMaintenanceTask ERROR",e); @@ -45,30 +50,49 @@ try{ TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId()); // è·åç°æè§¦åå¨å¹¶è½¬æ¢ä¸º CronTrigger // è·åç°æè§¦åå¨ Trigger oldTrigger = scheduler.getTrigger(triggerKey); if (!(oldTrigger instanceof CronTrigger)) { throw new SchedulerException("Existing trigger is not a CronTrigger"); // 触åå¨ä¸åå¨æç±»åä¸ç¬¦ï¼å¦ä»»å¡ç±ç´æ¥ååºå建ï¼ï¼éæ°æ³¨åè䏿¯æ¥é scheduleMaintenanceTask(task); return; } // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® // æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® CronTrigger newTrigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(oldTrigger.getJobKey()) // å ³è对åºçJob .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()) // 设置å¼å§æ¶é´ï¼è¥ä¸ºnullæå·²è¿æåç«å³çæï¼ .startAt(resolveStartTime(task)) .build(); scheduler.rescheduleJob(triggerKey, newTrigger); }catch (SchedulerException e){ log.error("SchedulerException rescheduleMaintenanceTask ERROR",e); throw new RuntimeException(e); } } /** * 夿任塿¯å¦å·²æ³¨åå°è°åº¦å¨ */ public boolean isRegistered(Long taskId) throws SchedulerException { return scheduler.checkExists(new TriggerKey("triggerMaintenanceTask_" + taskId)); } /** * 触åå¨å¼å§æ¶é´ï¼ä¸ºç©ºæå·²è¿ææ¶ä»å½åæ¶é´èµ·ç®ï¼é¿å è¡¥è·åå² */ private Date resolveStartTime(MaintenanceTask task) { LocalDateTime nextExecutionTime = task.getNextExecutionTime(); if (nextExecutionTime == null || !nextExecutionTime.isAfter(LocalDateTime.now())) { return new Date(); } return Date.from(nextExecutionTime.atZone(ZoneId.systemDefault()).toInstant()); } /** @@ -137,10 +161,8 @@ .cronSchedule(cronExpression) .withMisfireHandlingInstructionDoNothing() // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNextExecutionTime() != null ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullæå·²è¿æåç«å³çæï¼ .startAt(resolveStartTime(task)) .build(); } private String convertToCronExpression(MaintenanceTask task) { src/main/java/com/ruoyi/inspectiontask/init/TimingTaskRegistrar.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.ruoyi.inspectiontask.init; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.inspectiontask.mapper.TimingTaskMapper; import com.ruoyi.inspectiontask.pojo.TimingTask; import com.ruoyi.inspectiontask.service.impl.TimingTaskScheduler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.util.List; /** * å¯å¨æ¶æå·²å¯ç¨çå·¡æ£å®æ¶ä»»å¡æ³¨åå°è°åº¦å¨ï¼ä¿è¯å岿°æ®ï¼ç´æ¥ååºã仿ªç»è¿ serviceï¼ä¹è½è¢«æ§è¡ */ @Slf4j @Component @RequiredArgsConstructor public class TimingTaskRegistrar implements ApplicationRunner { private final TimingTaskMapper timingTaskMapper; private final TimingTaskScheduler timingTaskScheduler; @Override public void run(ApplicationArguments args) { try { List<TimingTask> tasks = timingTaskMapper.selectList( new QueryWrapper<TimingTask>().eq("deleted", 0).eq("is_enabled", 1)); int registered = 0; for (TimingTask task : tasks) { try { if (timingTaskScheduler.isRegistered(task.getId())) { continue; } timingTaskScheduler.scheduleTimingTask(task); registered++; } catch (Exception e) { log.warn("å·¡æ£å®æ¶ä»»å¡æ³¨å失败 id={} name={}", task.getId(), task.getTaskName(), e); } } log.info("å·¡æ£å®æ¶ä»»å¡æ³¨å宿ï¼å¾ 注å {} æ¡ï¼æ¬æ¬¡æ°æ³¨å {} æ¡", tasks.size(), registered); } catch (Exception e) { log.error("å·¡æ£å®æ¶ä»»å¡å¯å¨æ³¨å失败", e); } } } src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -5,6 +5,7 @@ import org.quartz.*; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeParseException; @@ -24,6 +25,10 @@ public void scheduleTimingTask(TimingTask task) throws SchedulerException { JobDetail jobDetail = buildJobDetail(task); Trigger trigger = buildJobTrigger(task, jobDetail); if (scheduler.checkExists(jobDetail.getKey())) { // æä¹ åçJobå¯è½è¿å¨ï¼ä¾å¦å岿°æ®ç´æ¥åå ¥ã䏿¬¡æªæ¸ çï¼ï¼å ç§»é¤æ§çJobåå ¶è§¦åå¨ scheduler.deleteJob(jobDetail.getKey()); } scheduler.scheduleJob(jobDetail, trigger); } @@ -33,36 +38,46 @@ public void rescheduleTimingTask(TimingTask task) throws SchedulerException { TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId()); // è·åç°æè§¦åå¨å¹¶è½¬æ¢ä¸º CronTrigger // è·åç°æè§¦åå¨ Trigger oldTrigger = scheduler.getTrigger(triggerKey); if (!(oldTrigger instanceof CronTrigger)) { throw new SchedulerException("Existing trigger is not a CronTrigger"); // 触åå¨ä¸åå¨æç±»åä¸ç¬¦ï¼å¦ä»»å¡ç±ç´æ¥ååºå建ï¼ï¼éæ°æ³¨åè䏿¯æ¥é scheduleTimingTask(task); return; } // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® // æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® CronTrigger newTrigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(oldTrigger.getJobKey()) // å ³è对åºçJob .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()) // 设置å¼å§æ¶é´ï¼è¥ä¸ºnullæå·²è¿æåç«å³çæï¼ .startAt(resolveStartTime(task)) .build(); // æå»ºæ°è§¦åå¨ // Trigger newTrigger = TriggerBuilder.newTrigger() // .withIdentity(triggerKey) // .withDescription(task.getTaskName()) // .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task))) // .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())) // .forJob(oldTrigger.getJobKey()) // .build(); scheduler.rescheduleJob(triggerKey, newTrigger); } /** * 夿任塿¯å¦å·²æ³¨åå°è°åº¦å¨ */ public boolean isRegistered(Long taskId) throws SchedulerException { return scheduler.checkExists(new TriggerKey("trigger_" + taskId)); } /** * 触åå¨å¼å§æ¶é´ï¼ä¸ºç©ºæå·²è¿ææ¶ä»å½åæ¶é´èµ·ç®ï¼é¿å è¡¥è·åå² */ private Date resolveStartTime(TimingTask task) { LocalDateTime nextExecutionTime = task.getNextExecutionTime(); if (nextExecutionTime == null || !nextExecutionTime.isAfter(LocalDateTime.now())) { return new Date(); } return Date.from(nextExecutionTime.atZone(ZoneId.systemDefault()).toInstant()); } /** @@ -130,10 +145,8 @@ .cronSchedule(cronExpression) .withMisfireHandlingInstructionDoNothing() // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNextExecutionTime() != null ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullæå·²è¿æåç«å³çæï¼ .startAt(resolveStartTime(task)) .build(); } private String convertToCronExpression(TimingTask task) {