目前项目有个类似拍卖场的场景,拍卖场会在开始一段时间后结束掉。目前的实现方式:用XXL-JOB,一个拍卖场一个定时任务。定时任务里处理拍卖结束的业务逻辑。随着业务量增多,每天会有一批的拍卖场会在同一时间结束拍卖。到点CPU就直接拉满。
直接上结论:XXL-JOB执行器执行定时任务时,一个任务创建一个线程执行。 而且这些线程没有用线程池!到时间点后,有多少定时任务就启动多少线程,所以CPU爆掉了。
最初以为XXL-JOB有什么配置可以配,但是找了半天也没找到。
目前想到的解决方法:
- 定时任务的代码块提到线程池去执行
- 用消息中间件,定时任务里是发消息,由后面的消费者去执行任务。
XXL-JOB执行器逻辑:我就不拾人牙慧了,直接贴链接:分布式调度平台XXL-JOB源码分析-执行器端
我的解决方法:
1、定义线程池(项目有就不需要另建了)
@Configuration
@Slf4j
public class ThreadPoolConfig {
@Bean
public ExecutorService getThreadPool(){
return new ThreadPoolExecutor( 2,
5,
30L,
TimeUnit