SpringBoot项目中@Async方法没有执行的问题分析

摘要:
现象:1.明显的现象:在日志文件中找不到方法中的日志输出,并且没有错误报告(即,未执行@Async标记的方法,也没有错误报告)。2.分析现象:日志中某段时间后没有任务xxx线程的日志原因:@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration),其中默认核心线程数为8,默认最大队列数和默认最大线程数
现象: 
    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方法没有执行的问题分析第1张

SpringBoot项目中@Async方法没有执行的问题分析第2张

 SpringBoot项目中@Async方法没有执行的问题分析第3张

免责声明:文章转载自《SpringBoot项目中@Async方法没有执行的问题分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AntDesignVue中关于Table组件的使用OSSEC初探下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

深入理解Flutter多线程

Flutter默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。 事件队列 和iOS应用很像,在Dart的线程中也存在事件循环和消息队列的概念,但在Dart中线程叫做isolate。应用程序启动后,开始执行main函数并运行main isolate。 每个isolate包含一个事件循环以及两个事件队列,event loop事件循环,以及e...

卡顿问题

导致卡顿问题的几种原因: 复杂 UI 、图文混排的绘制量过大; 在主线程上做网络同步请求; 在主线程做大量的 IO 操作; 运算量过大,CPU 持续高占用; 死锁和主子线程抢锁。 FPS 是一秒显示的帧数,也就是一秒内画面变化数量。当FPS达到60,说明界面很流程,当FPS低于24,页面流畅度不是那么流畅。 线程的消息 事件是依赖于 NSRunLoop...

WinDebug使用

File->Symbol File Path-> SRV*C:MyLocalSymbols*http://msdl.microsoft.com/download/symbols     设置环境变量  _NT_DEBUGGER_EXTENSION_PATH 路径是前面lmvf看到的.net路径 C:WindowsMicrosoft.NETFra...

【VC++积累】之五、进程注入技术

注入:就是把我的代码,添加到已经远行的远程进程的方法; 在WinNT以后的系列操作系统中,每个进程都有自己的4GB私有进程地址空间,彼此互不相关。 如 :   进程A中的一个地址,比如:0x12345678,到了进程B中的相同地方,存的东西完全不一样,或者说不可预料。            所以说如果进程A想要看看或者修改进程B地址空间中的内容,就必须深入...

CPU上下文切换分析

一、CPU上下文切换 1、上下文切换,有时也称做进程切换或任务切换,是指CPU从一个进程或线程切换到另一个进程或线程。 2、vmstat是一个常用的系统性能分析工具,主要用来分析系统内存使用情况,也常用来分析CPU上下文切换和中断的次数。 例:vmstat -w 上下文切换需要特别关注的四列内容: cs(context switch)  是每秒上下文切换...

Linux线程属性总结

线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中。 [c] view plaincopy  //线程属性结构如下:   typedef struct   {       int                   etachstate;      //线程的分离状态       int              ...