<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[SpringBoot项目定时任务阻塞的问题配置线程池解决]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Thu, 24 Aug 2023 03:09:35 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	首先经过了解查看源码，@Scheduled是单线程的，如果有多个定时任务，势必需要前一个任务执行完才会执行后面的任务<br/><a href="https://www.heckjj.com/attachment.php?fid=253" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=253" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="800"/></a><br/><br/>所以我们有三种方法解决定时任务线程池配置解决多个定时任务阻塞问题<br/>1、重写SchedulingConfigurer#configureTasks()，直接实现SchedulingConfigurer这个接口，设置taskScheduler<br/>2、也可以配置文件配置，Spring Boot quartz 已经提供了一个配置用来配置线程池的大小 spring.task.scheduling.pool.size=10<br/>3、配置线程池，再使用@Async开启异步任务<br/><br/>package com.nine.rivers.apps.core.config;<br/><br/>import org.springframework.context.annotation.Bean;<br/>import org.springframework.context.annotation.Configuration;<br/>import org.springframework.scheduling.TaskScheduler;<br/>import org.springframework.scheduling.annotation.SchedulingConfigurer;<br/>import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;<br/>import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;<br/>import org.springframework.scheduling.config.ScheduledTaskRegistrar;<br/><br/>import java.util.concurrent.ThreadPoolExecutor;<br/><br/>import static com.nine.rivers.apps.core.constants.NumberConstant.*;<br/><br/>/**<br/> * 定时任务线程池配置解决多个定时任务阻塞问题<br/> * 三种方法,任选期一：<br/> * &lt;p&gt;1、重写SchedulingConfigurer#configureTasks()，直接实现SchedulingConfigurer这个接口，设置taskScheduler<br/> * &lt;p&gt;2、也可以配置文件配置，Spring Boot quartz 已经提供了一个配置用来配置线程池的大小 spring.task.scheduling.pool.size=10<br/> * &lt;p&gt;3、配置线程池，再使用@Async开启异步任务<br/> *<br/> * @author heck<br/> * @date 2023/08/24<br/> */<br/>@Configuration<br/>public class ScheduleConfig implements SchedulingConfigurer &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void configureTasks(ScheduledTaskRegistrar taskRegistrar) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskRegistrar.setScheduler(taskScheduler());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 覆盖taskScheduler<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br/>&nbsp;&nbsp;&nbsp;&nbsp;public TaskScheduler taskScheduler() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskScheduler.setPoolSize(SIX);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskScheduler.setThreadNamePrefix(&quot;ndp-apps-scheduler-pool-&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return taskScheduler;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/><br/>方法三<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 配置线程池，再使用@Async开启异步任务<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br/>&nbsp;&nbsp;&nbsp;&nbsp;public ThreadPoolTaskExecutor taskExecutor() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poolTaskExecutor.setCorePoolSize(FOUR);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poolTaskExecutor.setMaxPoolSize(SIX);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 设置线程活跃时间（秒）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poolTaskExecutor.setKeepAliveSeconds(TWO * SIX * TEN);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 设置队列容量<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poolTaskExecutor.setQueueCapacity(FOUR * TEN);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 等待所有任务结束后再关闭线程池<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return poolTaskExecutor;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] SpringBoot项目定时任务阻塞的问题配置线程池解决]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>