将注解定义的定时任务加入到线程池里面

发布时间 2023-12-01 13:38:31作者: xiaobaibao

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的线程池中执行。

并不冲突!此时线程只是管理作用,防止多个任务会起冲突!