From 6e0154bfe95c0fe8f23c5006607b335148a67047 Mon Sep 17 00:00:00 2001 From: xiang Date: Sun, 27 Jul 2025 16:50:36 +0800 Subject: [PATCH] =?UTF-8?q?perf:=E5=8A=A8=E6=80=81=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicSchedulerAutoConfiguration.java | 1 + .../schedule/core/DynamicTaskScheduler.java | 49 +++++++++++++++++++ .../{config => core}/TaskRegistry.java | 2 +- .../schedule/{ => enums}/TaskGroupEnum.java | 2 +- .../schedule/helper/TaskExecutor.java | 8 +++ .../DynamicTaskSchedulerServiceImpl.java | 43 ---------------- .../service/IDynamicTaskSchedulerService.java | 5 -- 7 files changed, 60 insertions(+), 50 deletions(-) create mode 100644 xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java rename xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/{config => core}/TaskRegistry.java (92%) rename xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/{ => enums}/TaskGroupEnum.java (87%) create mode 100644 xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/helper/TaskExecutor.java diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java index e840afa..7e53339 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java @@ -1,5 +1,6 @@ package com.xiang.xservice.schedule.config; +import com.xiang.xservice.schedule.core.TaskRegistry; import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java new file mode 100644 index 0000000..d6951a8 --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java @@ -0,0 +1,49 @@ +package com.xiang.xservice.schedule.core; + +import com.xiang.xservice.schedule.entity.TaskConfig; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; + +@Component +@RequiredArgsConstructor +public class DynamicTaskScheduler { + private final ThreadPoolTaskScheduler taskScheduler; + private final Map> taskMap = new ConcurrentHashMap<>(); + + + public void schedule(TaskConfig config, Runnable task) { + LocalDateTime time = config.getExecutionTime(); + if (time.isBefore(LocalDateTime.now())) return; + + ScheduledFuture future = taskScheduler.schedule(() -> { + try { + task.run(); + } finally { + taskMap.remove(config.getTaskId()); + } + }, Date.from(time.atZone(ZoneId.systemDefault()).toInstant())); + + taskMap.put(config.getTaskId(), future); + } + + public void cancel(Long taskId) { + ScheduledFuture future = taskMap.get(taskId); + if (future != null) { + future.cancel(true); + + taskMap.remove(taskId); + } + } + + public Boolean contains(Long taskId) { + return taskMap.containsKey(taskId); + } +} diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/TaskRegistry.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/TaskRegistry.java similarity index 92% rename from xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/TaskRegistry.java rename to xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/TaskRegistry.java index 9f9c9cf..d679683 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/TaskRegistry.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/TaskRegistry.java @@ -1,4 +1,4 @@ -package com.xiang.xservice.schedule.config; +package com.xiang.xservice.schedule.core; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/TaskGroupEnum.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/enums/TaskGroupEnum.java similarity index 87% rename from xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/TaskGroupEnum.java rename to xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/enums/TaskGroupEnum.java index 417f798..b4cdca6 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/TaskGroupEnum.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/enums/TaskGroupEnum.java @@ -1,4 +1,4 @@ -package com.xiang.xservice.schedule; +package com.xiang.xservice.schedule.enums; import lombok.Getter; diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/helper/TaskExecutor.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/helper/TaskExecutor.java new file mode 100644 index 0000000..0c27f21 --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/helper/TaskExecutor.java @@ -0,0 +1,8 @@ +package com.xiang.xservice.schedule.helper; + + +import com.xiang.xservice.schedule.entity.TaskConfig; + +public interface TaskExecutor { + void execute(TaskConfig taskInfo); +} diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java index 44244b4..6f607a8 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java @@ -1,59 +1,16 @@ package com.xiang.xservice.schedule.service; import com.xiang.xservice.schedule.entity.ScheduledTaskEntity; -import com.xiang.xservice.schedule.entity.TaskConfig; import com.xiang.xservice.schedule.mapper.ScheduledTaskMapper; import lombok.RequiredArgsConstructor; -import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.stereotype.Service; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ScheduledFuture; - @Service @RequiredArgsConstructor public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerService{ - private final ThreadPoolTaskScheduler taskScheduler; private final ScheduledTaskMapper scheduledTaskMapper; - private final Map> taskMap = new ConcurrentHashMap<>(); - - @Override - public void schedule(TaskConfig config, Runnable task) { - LocalDateTime time = config.getExecutionTime(); - if (time.isBefore(LocalDateTime.now())) return; - - ScheduledFuture future = taskScheduler.schedule(() -> { - try { - task.run(); - } finally { - taskMap.remove(config.getTaskId()); - } - }, Date.from(time.atZone(ZoneId.systemDefault()).toInstant())); - - taskMap.put(config.getTaskId(), future); - } - - @Override - public void cancel(String taskId) { - ScheduledFuture future = taskMap.get(taskId); - if (future != null) { - future.cancel(true); - - taskMap.remove(taskId); - } - } - - @Override - public Boolean contains(String taskId) { - return taskMap.containsKey(taskId); - } - @Override public Boolean saveTask(ScheduledTaskEntity entity) { return scheduledTaskMapper.save(entity) > 0; diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java index 6aa776e..1168dfd 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java @@ -1,14 +1,9 @@ package com.xiang.xservice.schedule.service; import com.xiang.xservice.schedule.entity.ScheduledTaskEntity; -import com.xiang.xservice.schedule.entity.TaskConfig; -import java.time.LocalDateTime; public interface IDynamicTaskSchedulerService { - void schedule(TaskConfig config, Runnable task); - void cancel(String taskId); - Boolean contains(String taskId); Boolean saveTask(ScheduledTaskEntity entity); Boolean updateTask(ScheduledTaskEntity entity); ScheduledTaskEntity getTask(String taskId);