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