Java @@ControllerAdvice不会为全局异常调用Async

Java @@ControllerAdvice不会为全局异常调用Async,java,spring,Java,Spring,我有一个带有@Async method的服务类,如果它调用的方法引发任何异常,@ControllerAdvice将不会调用全局异常处理。但对于其他的课程和服务,它会打电话咨询并正确地发送电子邮件 @Service public class FileScanServiceImpl implements FileScanService { @Override @Async public void scanFileScheduler() throws MQException {

我有一个带有@Async method的服务类,如果它调用的方法引发任何异常,@ControllerAdvice将不会调用全局异常处理。但对于其他的课程和服务,它会打电话咨询并正确地发送电子邮件

@Service
public class FileScanServiceImpl implements FileScanService {
    @Override
    @Async
    public void scanFileScheduler() throws MQException {
    try{
        messageProducer.putFileNameToMQ(fileName);
        } catch (Exception e) {
            ExceptionUtility.handleException(e, currentFile);
        }
  }
ExceptionUtility用于检查异常上的实例,并在那里执行一些功能和抛出自定义异常

public static void handleException(Exception e throws MQException {
        String errMsg = "";
        if (e instanceof MQException) {
            // some functionality
            throw new MQException(subject, errMsg);
        }
    }
这是我的@ControlleAdvice

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MQException.class)
    @ResponseBody
    public void handleMQException(HttpServletRequest request, MQException ex) {
     // send email
    }
}
如果@Async有任何解决方案可以调用@ControllerAdvice来实现全局异常,那么现有的功能也不会中断。

@ExceptionHandler创建的目的是捕获仅“同步异常”。如果它能够捕获异步线程的异常,那么当几个线程启动并且其中任何一个线程失败时,对服务器的请求将被完全中断,系统可能会保持不一致的状态(由于此请求生成了许多其他活动线程)

为了处理异步异常,Spring具有AsyncUncaughtExceptionHandler接口:

public class YourAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
        
       // Your exception handling logic
    
    }
}
更多信息可以在这里的异常部分找到:

@ExceptionHandler创建的目的是只捕获“同步异常”。如果它能够捕获异步线程的异常,那么当几个线程启动并且其中任何一个线程失败时,对服务器的请求将被完全中断,系统可能会保持不一致的状态(由于此请求生成了许多其他活动线程)

为了处理异步异常,Spring具有AsyncUncaughtExceptionHandler接口:

public class YourAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
        
       // Your exception handling logic
    
    }
}
更多信息可在例外部分中找到: