前言
最近在线上发现了很诡异的事情,某个服务的线程处理运行很不稳定,经常性不能正常工作,但是也排查不出来问题根源。最终确定了原因是
在使用scheduleAtFixedRate
时,Runnable中发生了未捕获异常,并且未配置uncaughtExceptionHandler
导致异常发生后,日志直接被吞了。
解决办法
方法一
配置uncaughtExceptionHandler
处理类,但是这个的处理逻辑是由线程池决定了,在特定的场景下,我们不清楚线程池的具体实现,需要查看代码
方法二(推荐)
自定义抽象的Runnable,实现异常捕获,当有特定的异常处理逻辑,如果是通用的可以继承AbstractCaughtRunnable
,如果是特例的可以重写exceptionHandler
方法,但这种方式意味着uncaughtExceptionHandler
无法生效,如果想要生效也可以抛出未捕获异常
@Slf4j
public abstract class AbstractCaughtRunnable implements Runnable {
@Override
public void run() {
try{
caughtAndRun();
}catch (Exception e){
exceptionHandler(e);
}