SpringBoot动态定时任务(完整版)
在Spring Boot中创建动态定时任务,可以使用ThreadPoolTaskScheduler
来实现。以下是一个简化版的示例代码:
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.support.CronExpression;
import java.util.concurrent.ConcurrentHashMap;
@Configuration
public class DynamicScheduleConfig {
private final ThreadPoolTaskScheduler taskScheduler;
private final ConcurrentHashMap<String, Runnable> tasksMap;
public DynamicScheduleConfig(ThreadPoolTaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
this.tasksMap = new ConcurrentHashMap<>();
}
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
return new ThreadPoolTaskScheduler();
}
public void addTask(String taskId, Runnable task, String cronExpression) {
CronTask cronTask = new CronTask(task, CronExpression.parse(cronExpression));
tasksMap.put(taskId, task);
taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());
}
public void removeTask(String taskId) {
Runnable task = tasksMap.remove(taskId);
if (task != null) {
taskScheduler.getScheduledFutures().forEach(future -> {
if (future.getTask() == task) {
future.cancel(true);
}
});
}
}
@Bean
public ScheduledTaskRegistrar scheduledTaskRegistrar() {
ScheduledTaskRegistrar taskRegistrar = new ScheduledTaskRegistrar();
taskRegistrar.setTaskScheduler(taskScheduler);
return taskRegistrar;
}
}
使用方法:
- 调用
addTask
方法添加任务,需要提供任务ID、任务内容和cron表达式。 - 调用
removeTask
方法移除任务,只需要提供任务ID。
这个配置类中定义了一个ThreadPoolTaskScheduler
,用于执行定时任务。同时,使用了一个ConcurrentHashMap
来存储动态添加的任务,以便后续可以移除它们。
注意:
- 这个示例没有处理并发添加或删除任务可能引发的并发问题。在实际应用中,可能需要添加适当的同步机制。
- 任务的ID应该是唯一的,以便正确地移除特定的任务。
- 这个示例没有包含任务的逻辑,你需要根据实际需求实现
Runnable
任务。
评论已关闭