Java @@ControllerAdvice不会为全局异常调用Async
我有一个带有@Async method的服务类,如果它调用的方法引发任何异常,@ControllerAdvice将不会调用全局异常处理。但对于其他的课程和服务,它会打电话咨询并正确地发送电子邮件Java @@ControllerAdvice不会为全局异常调用Async,java,spring,Java,Spring,我有一个带有@Async method的服务类,如果它调用的方法引发任何异常,@ControllerAdvice将不会调用全局异常处理。但对于其他的课程和服务,它会打电话咨询并正确地发送电子邮件 @Service public class FileScanServiceImpl implements FileScanService { @Override @Async public void scanFileScheduler() throws MQException {
@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
}
}
更多信息可在例外部分中找到: