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测试下,上面是解决方案,注册一个线程池给调度的任务用即可