温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

解决SpringBoot项目@Async方法问题

发布时间:2020-08-03 09:29:41 来源:亿速云 阅读:191 作者:小猪 栏目:编程语言

小编这次要给大家分享的是解决SpringBoot项目@Async方法问题,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

现象:

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

解决SpringBoot项目@Async方法问题

2. SpringMonitor的配置属性

解决SpringBoot项目@Async方法问题

3. SpringMonitor的Threads

解决SpringBoot项目@Async方法问题

看完这篇关于解决SpringBoot项目@Async方法问题的文章,如果觉得文章内容写得不错的话,可以把它分享出去给更多人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI