Java 17 & Spring Boot 3.1.2: 捕获自定义线程池异常并返回前端
Java 17 & Spring Boot 3.1.2: 捕获自定义线程池异常并返回前端
在 Spring Boot 项目中,我们经常使用自定义线程池来处理异步任务。然而,如果线程池中的任务抛出异常,默认情况下不会被 Spring 的异常处理机制捕获。本文将介绍如何使用 @ControllerAdvice 和 @ExceptionHandler 注解捕获自定义线程池中的异常,并将错误信息返回给前端。
1. 创建全局异常处理类
首先,创建一个全局异常处理类,并使用 @ControllerAdvice 注解标记该类:java@ControllerAdvicepublic class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 处理异常并返回给前端 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage()); }}
@ExceptionHandler(Exception.class) 注解表明该方法将处理所有类型的异常。
2. 在自定义线程池中抛出异常
在自定义线程池中,我们需要捕获任务执行过程中抛出的异常,并将其包装成 RuntimeException 抛出,以便全局异常处理器可以捕获到它:javapublic class CustomThreadPoolExecutor extends ThreadPoolExecutor {
public CustomThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); }
@Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if (t != null) { throw new RuntimeException(t); // 抛出异常 } }}
3. 配置自定义线程池
最后,在 Spring Boot 的配置类中配置自定义线程池:java@Configurationpublic class ThreadPoolConfig {
@Bean public ExecutorService executorService() { return new CustomThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); }}
总结
通过以上配置,当自定义线程池中的任务发生异常时:
afterExecute方法会捕获异常并包装成RuntimeException抛出。2. 全局异常处理类中的handleException方法会捕获RuntimeException。3.handleException方法将处理异常并将错误信息返回给前端。
这样,我们就实现了捕获自定义线程池中的异常并将错误信息返回给前端的功能,提高了应用程序的健壮性和用户体验。
原文地址: https://www.cveoy.top/t/topic/fQeJ 著作权归作者所有。请勿转载和采集!