spring boot实现定时任务,且支持动态生成cron表达式
在Spring Boot中实现动态定时任务,可以使用@Scheduled
注解结合ThreadPoolTaskScheduler
来动态调整任务的执行计划。以下是一个简单的例子:
- 首先,在Spring Boot的配置类中配置
ThreadPoolTaskScheduler
。
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("scheduled-task-");
scheduler.initialize();
return scheduler;
}
}
- 创建一个动态定时任务的管理类,用于动态添加或更新任务。
@Component
public class DynamicScheduledTaskManager {
private final ThreadPoolTaskScheduler taskScheduler;
private ScheduledFuture<?> futureTask;
public DynamicScheduledTaskManager(ThreadPoolTaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
public void addTask(Runnable task, String cronExpression) {
if (futureTask != null) {
futureTask.cancel(false);
}
futureTask = taskScheduler.schedule(task, new CronTrigger(cronExpression));
}
public void updateTaskCron(String cronExpression) {
if (futureTask != null) {
futureTask.cancel(false);
futureTask = taskScheduler.schedule(futureTask.getTask(), new CronTrigger(cronExpression));
}
}
}
- 创建定时任务的Runnable实现。
public class SampleTask implements Runnable {
private String taskId;
public SampleTask(String taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task " + taskId + " is running...");
}
}
- 使用
DynamicScheduledTaskManager
来添加或更新任务。
@Service
public class ScheduledTaskService {
private final DynamicScheduledTaskManager taskManager;
public ScheduledTaskService(DynamicScheduledTaskManager taskManager) {
this.taskManager = taskManager;
}
public void addDynamicTask(String taskId, String cronExpression) {
Runnable task = new SampleTask(taskId);
taskManager.addTask(task, cronExpression);
}
public void updateTaskCron(String taskId, String newCronExpression) {
// 根据taskId更新对应的任务cron表达式
taskManager.updateTaskCron(newCronExpression);
}
}
- 在需要的地方调用
addDynamicTask
方法来添加新的定时任务,或者updateTaskCron
来更新已有任务的执行计划。
@RestController
public class
评论已关闭