Spring @ExceptionHandler和multithreading

我有以下控制器建议:

@ControllerAdvice public class ExceptionHandlerAdvice { @ExceptionHandler(NotCachedException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public ModelAndView handleNotCachedException(NotCachedException ex) { LOGGER.warn("NotCachedException: ", ex); return generateModelViewError(ex.getMessage()); } } 

它在大多数情况下工作得很好但是当从使用@Async注释的方法抛出NotCachedException时,exception处理不当。

 @RequestMapping(path = "", method = RequestMethod.PUT) @Async public ResponseEntity store(@Valid @RequestBody FeedbackRequest request, String clientSource) { cachingService.storeFeedback(request, ClientSource.from(clientSource)); return new ResponseEntity(OK); } 

这是Executor的配置:

 @SpringBootApplication @EnableAsync public class Application { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); SettingsConfig settings = context.getBean(SettingsConfig.class); LOGGER.info("{} ({}) started", settings.getArtifact(), settings.getVersion()); createCachingIndex(cachingService); } @Bean(name = "matchingStoreExecutor") public Executor getAsyncExecutor() { int nbThreadPool = 5; ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(nbThreadPool); executor.setMaxPoolSize(nbThreadPool * 2); executor.setQueueCapacity(nbThreadPool * 10); executor.setThreadNamePrefix("matching-store-executor-"); executor.initialize(); return executor; } } 

为了使其与@Async注释方法一起使用,我该怎么办?

在@Async Enabled的情况下,默认的exception处理机制不起作用。 要处理从@Async注释的方法抛出的exception,您需要实现自定义AsyncExceptionHandler。

 public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler{ @Override public void handleUncaughtException(Throwable ex, Method method, Object... params) { // Here goes your exception handling logic. } } 

现在您需要在Application类中将此customExceptionHandler配置为

 @EnableAsync public class Application implements AsyncConfigurer { @Override Executor getAsyncExecutor(){ // your ThreadPoolTaskExecutor configuration goes here. } @Override public AsyncUncaughExceptionHandler getAsyncUncaughtExceptionHandler(){ return new AsyncExceptionHandler(); } 

注意:确保为了使AsyncExceptionHandler工作,您需要在Application类中实现AsyncConfigurer。