解决springboot @Scheduled 定时任务 中途退

2019-10-15  本文已影响0人  背锅填坑交给我

0x00 现象

使用@Scheduled注解的一个定时方法,执行了几次之后,就不再执行了,发现最后一次执行只进入了方法,没退出方法(方法开头和结尾都有日志输出)。

方法中包含的操作:
1、http请求
2、redis操作
3、调用带锁的方法
4、调用的方法中有一些会抛出RuntimeException

0x01 定位排查

进入了方法,但是没有退出,说明线程阻塞住了。
jstack 查看一下进程中线程的状态。

jstack 20189 > stack.log

jstack日志的一部分

JedisSentinelPool.getResource,redis从连接池获取连接的时候阻塞了,可能是连接池没有连接了 。

0x02 解决

看了一下代码,在获取到redis连接后没有及时释放资源。

在trycatch后加了
finally {
resource.close();
}

0x03 总结

回想一下,方法中包含的http请求、RuntimeException都有可能造成线程阻塞。

比如http请求超时时间过长,RuntimeException异常退出线程。

所以在写定时任务的时候,要尽量对这些操作善后。

上一篇 下一篇

猜你喜欢

热点阅读