性能问答>求助,Springboot @Async异步线程假死,程序不执行。>
12回复
2年前

求助,Springboot @Async异步线程假死,程序不执行。


环境参数
  • 操作系统Linux
  • 操作系统版本centos7
  • JDK版本JDK8
  • 内存16GB
  • CPU核数4
  • 操作系统位数64位
1234.txt11.81KB
查看详情

项目(springboot整合redis)是一个不断从redis读取数据打到kafka的程序:
1、配置了@Async线程池配置线程名为:Redis-Executor
2、项目在启动的时候,就执行了分别带有@Async注解的4个方法,这4个方法都是while(true)的分别从不同的redis key中读取数据,没有数据就sleep1秒,有数据就处理一下打到kafka。
3、昨天在本地压测发现这个程序处理很慢,redis还有很多数据没有处理掉,然后停止压测,让他先消费掉;今天再次处理的时候发现被@Async注解的这4个方法都不执行了,日志也没有打印。
4、jstack dump一份文件
求大佬们帮忙看下

4532 阅读
请先登录,再评论

你说的不执行是不处理redis数据了么?可以看下redis是否还有需要处理的数据,看起来是都在while(true) sleep 执行,可以加个日志打印确定一下

12年前
回复 西湖の风:

线程池中的线程因为异常退出后,线程池会去创建新的线程,这个新的线程在等待任务的提交,所以是waiting on condition

线程池.png

2年前回复
回复 饲养员:

退出循环了,为啥还会 waiting on condition 呢?

2年前回复
查看更多

是 com.alicom.mns.tools.DefaultAlicomMessagePuller$PullMessageTask.run 这个方法吗?

2年前
回复 shihui:

我应该知道问题了 谢谢

2年前回复
回复 饲养员:

方法的主要代码逻辑能否贴出来?

2年前回复
回复 shihui:

是名字叫 "Redis-Executor" 的线程池的 有4个线程 都是waiting on condition

2年前回复