【发布时间】:2023-03-08 14:05:01
【问题描述】:
我的 spring-boot 1.3.5.RELEASE 应用程序上有一个 rest API,使用 ThreadPoolExecutor 异步启动一个进程。
我的问题是异步进程碰巧在未处理但堆栈跟踪未进入我的日志的场景中引发运行时异常。我正在使用 log4j。
这是一个大问题,因为调试并查看实际问题是什么需要花费大量时间。
我知道@ControllerAdvice,但我认为它的上下文在新线程启动并且spring不再拦截异常时结束。
如何配置 ThreadPoolExecutor 以将未处理的异常重定向到 spring 上下文,或者我应该如何解决这个问题?
我正在寻找一种通用解决方案来捕获这些类型的异常并将它们的堆栈跟踪添加到 appender,因为我不知道开发人员将在哪里启动一个新线程,该线程将因未捕获的异常而崩溃
假设其余部分如下所示:
@RequestMapping("/api/test")
public void doSomething() {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 10 , TimeUnit.SECONDS, new ArrayBlockingQueue<>(10, true));
threadPoolExecutor.execute(() -> {
throw new RuntimeException("some exception");
});
}
【问题讨论】:
-
不要自己处理线程池,而是尝试使用
@Async注解。带有@Async注释的方法将在单独的线程上运行。然后,如果发生异常,您可以在控制器中使用@ExceptionHandler处理它 -
这是一个遗留应用程序,需要大量重构
标签: java spring multithreading logging exception-handling