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);
+}