diff --git a/xservice-schedule-starter/pom.xml b/xservice-schedule-starter/pom.xml index 8cac886..fe12def 100644 --- a/xservice-schedule-starter/pom.xml +++ b/xservice-schedule-starter/pom.xml @@ -8,6 +8,7 @@ xservice-basic 1.0-SNAPSHOT + 1.1-SNAPSHOT xservice-schedule-starter 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 new file mode 100644 index 0000000..55b7701 --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java @@ -0,0 +1,10 @@ +package com.xiang.xservice.schedule.config; + +import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Import; + +@AutoConfiguration +@Import({DynamicTaskSchedulerConfig.class, IDynamicTaskSchedulerService.class, TaskRegistry.class}) +public class DynamicSchedulerAutoConfiguration { +} diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicTaskSchedulerConfig.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicTaskSchedulerConfig.java index 856b031..1b79893 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicTaskSchedulerConfig.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicTaskSchedulerConfig.java @@ -10,7 +10,9 @@ public class DynamicTaskSchedulerConfig { public ThreadPoolTaskScheduler globalTaskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(10); - scheduler.setThreadNamePrefix("task-scheduler-"); + scheduler.setThreadNamePrefix("dynamic-task-"); + scheduler.setWaitForTasksToCompleteOnShutdown(true); + scheduler.setAwaitTerminationSeconds(30); scheduler.initialize(); return scheduler; } 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/config/TaskRegistry.java new file mode 100644 index 0000000..9f9c9cf --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/TaskRegistry.java @@ -0,0 +1,21 @@ +package com.xiang.xservice.schedule.config; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +public class TaskRegistry { + private final ConcurrentHashMap> handlers = new ConcurrentHashMap<>(); + + public void register(Long taskId, Consumer consumer) { + handlers.put(taskId, consumer); + } + + public void run(Long taskId) { + Consumer consumer = handlers.get(taskId); + if (consumer != null) consumer.accept(taskId); + } + + public void unregister(Long taskId) { + handlers.remove(taskId); + } +} diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/entity/TaskConfig.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/entity/TaskConfig.java new file mode 100644 index 0000000..65ba390 --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/entity/TaskConfig.java @@ -0,0 +1,16 @@ +package com.xiang.xservice.schedule.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TaskConfig { + private Long taskId; + private String taskName; + private LocalDateTime executionTime; +} 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 0c3ec4b..fbd67bc 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,11 +1,12 @@ package com.xiang.xservice.schedule.service; +import com.xiang.xservice.schedule.entity.TaskConfig; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.stereotype.Service; -import java.time.Duration; import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -17,19 +18,22 @@ public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerSer private final ThreadPoolTaskScheduler taskScheduler; - private final Map> taskMap = new ConcurrentHashMap<>(); + private final Map> taskMap = new ConcurrentHashMap<>(); @Override - public void schedule(String taskId, LocalDateTime runTime, Runnable task) { - long delay = Duration.between(LocalDateTime.now(), runTime).toMillis(); - if (delay < 0) { - throw new IllegalArgumentException("时间已过,无法调度"); - } + public void schedule(TaskConfig config, Runnable task) { + LocalDateTime time = config.getExecutionTime(); + if (time.isBefore(LocalDateTime.now())) return; - ScheduledFuture future = taskScheduler.schedule( - task, new Date(System.currentTimeMillis() + delay) - ); - taskMap.put(taskId, future); + 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 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 499247b..5372e9f 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,9 +1,11 @@ package com.xiang.xservice.schedule.service; +import com.xiang.xservice.schedule.entity.TaskConfig; + import java.time.LocalDateTime; public interface IDynamicTaskSchedulerService { - void schedule(String taskId, LocalDateTime runTime, Runnable task); + void schedule(TaskConfig config, Runnable task); void cancel(String taskId); Boolean contains(String taskId); }