将注解定义的定时任务加入到线程池里面
1.在主启动类上添加线程池的配置:
/**
* 自定义线程池
*/
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10); // 核心线程数
executor.setMaxPoolSize(20); // 最大线程数
executor.setQueueCapacity(100); // 队列容量
executor.setThreadNamePrefix("threadPoolTaskExecutor-"); // 线程名称前缀:在日志中,可以根据线程名称前缀来区分不同线程的日志输出
executor.initialize(); // 初始化
return executor;
}
2.在任务当中加入注解确定是哪个线程池:
@Component("Task")
public class Task {
// 这里省略注入的字段
@Async("threadPoolTaskExecutor") // 指定线程池的名称
@Scheduled(fixedDelay = 300000) // 每隔5分钟执行一次轮询
public void pollDatabase() {
// 任务执行的逻辑代码
}
}
3.这时候必须要在启动类中添加:
@EnableScheduling
这个注解:
在启动应用时,Spring 就会自动扫描定时任务类PointsRaffleTask并注册其中被@Scheduled注解标记的方法,然后按照指定的定时策略执行这些方法。
同时,由于pollDatabase()方法使用了@Async("threadPoolTaskExecutor")注解,所以任务的执行会在使用名称为threadPoolTaskExecutor的线程池中执行。
并不冲突!此时线程只是管理作用,防止多个任务会起冲突!