我有一个带有 @Async 方法的服务类,如果它调用方法抛出任何异常,那么 @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 有异步未捕获异常处理程序界面:
public class YourAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
// Your exception handling logic
}
}
更多信息可以在例外部分找到:https://www.baeldung.com/spring-async https://www.baeldung.com/spring-async
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)