解决SpringBoot项目@Async方法问题-创新互联
小编这次要给大家分享的是解决SpringBoot项目@Async方法问题,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
创新互联主要从事成都网站建设、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务平邑,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575现象:
1. 表面现象: 方法中输出的日志, 日志文件中找不到, 也没有任何报错(即@Async标注的方法没有执行, 也没有报错)
2. 分析现象: 日志中某个时刻之后没有了task-xxx线程的日志
原因:
@Async异常方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration),
其中默认核心线程数为8, 默认大队列和默认大线程数都是Integer.MAX_VALUE. 创建新线程的条件是队列填满时, 而这样的配置队列永远不会填满, 如果有@Async注解标注的方法长期占用线程(比如HTTP长连接等待获取结果), 在核心8个线程数占用满了之后, 新的调用就会进入队列, 外部表现为没有执行.
解决:
手动配置相应属性即可. 比如
spring.task.execution.pool.queueCapacity=4
spring.task.execution.pool.coreSize=20
备注:
此处没有配置maxSize, 仍是默认的Integer.MAX_VALUE. 如果配置的话, 请考虑达到大线程数时的处理策略(JUC包查找RejectedExecutionHandler的实现类)
(默认为拒绝执行AbortPolicy, 即抛出异常)
AbortPolicy: 直接抛出java.util.concurrent.RejectedExecutionException异常
CallerRunsPolicy: 主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度
DiscardOldestPolicy: 抛弃旧的任务
DiscardPolicy: 抛弃当前任务
截图:
1. ThreadPoolTaskExecutor
2. SpringMonitor的配置属性
3. SpringMonitor的Threads
看完这篇关于解决SpringBoot项目@Async方法问题的文章,如果觉得文章内容写得不错的话,可以把它分享出去给更多人看到。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:解决SpringBoot项目@Async方法问题-创新互联
文章分享:http://abwzjs.com/article/pdosg.html