ThreadPoolTaskScheduler实现动态定时任务添加、删除、修改
总体设计
在Springboot项目中使用ThreadPoolTaskScheduler添加定时任务,结合Cron表达式来实现
注册 ThreadPoolTaskScheduler
在配置文件中添加如下代码,并开启@EnableAsync 注解启动异步线程池
@Bean
@ConditionalOnMissingBean(ThreadPoolTaskScheduler.class)
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5); // 线程池大小,根据实际需要添加
threadPoolTaskScheduler.setThreadNamePrefix("taskScheduler-"); // 线程名称
threadPoolTaskScheduler.setAwaitTerminationSeconds(600); // 等待时长
// 调度器shutdown被调用时等待当前被调度的任务完成
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(false);
return threadPoolTaskScheduler;
}
创建具体任务的执行对象 BaskTask
/**
* 基础任务接口
*
* @author ryenlii
*/
public interface BaskTask extends Runnable {
/**
* 获取执行频率
*/
String getCron();
/**
* 获取执行对象名称
*/
String getName();
/**
* 执行任务逻辑
*/
void execute();
}
创建定时任务处理中心 ScheduledTaskManager
import XXXX.ScheduledTask;
import XXXX.BaskTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 动态添加任务配置
*
* @author ryenlii
*/
@Slf4j
@Component
public class ScheduledTaskManager {
/**
* 以下都是线程安全的集合类。
*/
private final Map<