springboot-@schedule任务阻塞问题解决方案

/**
 * 解决@Schedule任务单线程阻塞问题
 * 线程池不允许使用Executors创建,要通过ThreadPoolExecutor的方式
 * 说明:Executors返回的线程池对象的弊端如下:
 * 1)FixedThreadPool和SingleThreadPool:
 *   允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
 * 2)CachedThreadPool:
 *   允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
 */

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(10, new BasicThreadFactory.Builder().namingPattern("customized-schedule-pool-%d").daemon(true).build());
        taskRegistrar.setScheduler(executorService);
    }
}

先贴代码

这个问题很容易发生,尤其是当一个项目里的定时任务比较多的时候,会出现"排队"现象,导致本来定义好的触发时间点,任务没有fire执行

如果看schedule的源码可以知道,所有的@Schedule的任务都会加入到一个单线程中去执行,这样的话上一个任务没有执行完的话,后面添加的任务就会排队等待

可以自行sout测试下,上面是解决方案,注册一个线程池给调度的任务用即可

posted @ 2022-03-28 15:33  鼠标的博客  阅读(974)  评论(0编辑  收藏  举报