0x00 现象
使用@Scheduled注解的一个定时方法,执行了几次之后,就不再执行了,发现最后一次执行只进入了方法,没退出方法(方法开头和结尾都有日志输出)。
方法中包含的操作:
1、http请求
2、redis操作
3、调用带锁的方法
4、调用的方法中有一些会抛出RuntimeException
0x01 定位排查
进入了方法,但是没有退出,说明线程阻塞住了。
jstack 查看一下进程中线程的状态。
jstack 20189 > stack.log

JedisSentinelPool.getResource,redis从连接池获取连接的时候阻塞了,可能是连接池没有连接了 。
0x02 解决
看了一下代码,在获取到redis连接后没有及时释放资源。
在trycatch后加了
finally {
resource.close();
}
0x03 总结
回想一下,方法中包含的http请求、RuntimeException都有可能造成线程阻塞。
比如http请求超时时间过长,RuntimeException异常退出线程。
所以在写定时任务的时候,要尽量对这些操作善后。
网友评论