赞
踩
最近遇到一个线上问题,记录一下
前景:项目中用的很多定时任务,使用的是spring自带的定时任务,项目刚开始上线的时候,定时任务确实可以正常运行,但是某一天发现,项目没有数据了,推测可能是由于定时任务没有执行,于是查看日志,发现两天前所有的定时任务全部停止了
排查思路1:可能是某个任务抛出异常导致的,于是本地测,发现抛异常并不会导致所有定时任务全部停止
排查思路2:spring的定时器是单线程的,能不能给他改成多线程呢。
排查思路3:既然spring自带的定时任务是单线程的,可以使用arthas,查看线程状态
先找到日志中的定时任务线程名称
然后使用arthas找到指定的线程,查看线程状态
于是继续查看这个线程的具体状态
根据自己的推测,继续查看日志
发现在这次之后确实没有响应,说明这个线程就在一直等这个响应
然后查看代码,发现在请求的时候没有设置超时时间,导致我们的线程一直等待第三方的响应,于是加上超时时间的配置
解决!!
一开始有想过,spring的定时任务确实是单线程的,能不能给他改成多线程的,问题解决之后再回顾这个方法, 也存在问题,就算改成多线程的,一个线程等待会重启另外一个线程,要是第三方服务经常不稳定,就会导致很多线程都处于空等状态,就会导致系统性能急剧下降,所以遇到问题应先排查最根本的问题,不能想当然,找到病因,对症下药,才有奇效!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。