diff --git a/pom.xml b/pom.xml index eed4df0..1a31fc0 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ xservice-common xservice-cache xservice-third-part + xservice-schedule-starter diff --git a/xservice-schedule-starter/pom.xml b/xservice-schedule-starter/pom.xml new file mode 100644 index 0000000..8cac886 --- /dev/null +++ b/xservice-schedule-starter/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.xiang + xservice-basic + 1.0-SNAPSHOT + + + xservice-schedule-starter + + + 17 + 17 + UTF-8 + + + \ No newline at end of file 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 new file mode 100644 index 0000000..856b031 --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicTaskSchedulerConfig.java @@ -0,0 +1,17 @@ +package com.xiang.xservice.schedule.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + +@Configuration +public class DynamicTaskSchedulerConfig { + @Bean + public ThreadPoolTaskScheduler globalTaskScheduler() { + ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); + scheduler.setPoolSize(10); + scheduler.setThreadNamePrefix("task-scheduler-"); + scheduler.initialize(); + return scheduler; + } +} 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 new file mode 100644 index 0000000..0c3ec4b --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java @@ -0,0 +1,48 @@ +package com.xiang.xservice.schedule.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.time.LocalDateTime; +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 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("时间已过,无法调度"); + } + + ScheduledFuture future = taskScheduler.schedule( + task, new Date(System.currentTimeMillis() + delay) + ); + taskMap.put(taskId, 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); + } +} 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 new file mode 100644 index 0000000..499247b --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java @@ -0,0 +1,9 @@ +package com.xiang.xservice.schedule.service; + +import java.time.LocalDateTime; + +public interface IDynamicTaskSchedulerService { + void schedule(String taskId, LocalDateTime runTime, Runnable task); + void cancel(String taskId); + Boolean contains(String taskId); +}