当前位置: 首页 > 知识库问答 >
问题:

Spring@ExceptionHandler与多线程

贺聪
2023-03-14
@ControllerAdvice
public class ExceptionHandlerAdvice {

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

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

}

共有1个答案

郝修为
2023-03-14

默认的异常处理机制在启用@Async的情况下不起作用。要处理由@Async注释的方法引发的异常,需要将自定义AsyncExceptionHandler实现为。

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

    }
}

现在需要将应用程序类中的customExceptionHandler配置为

@EnableAsync
public class Application implements AsyncConfigurer {
     @Override Executor getAsyncExecutor(){
      // your ThreadPoolTaskExecutor configuration goes here. 
}


@Override
public AsyncUncaughExceptionHandler getAsyncUncaughtExceptionHandler(){
   return new AsyncExceptionHandler();
}

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

 类似资料:
  • 问题内容: 我有以下控制器建议: 它在大多数情况下都有效,但是当从带有@Async注释的方法中抛出NotCachedException时,将无法正确处理该异常。 这是执行器的配置: 为了使其与@Async带注释的方法一起使用,我该怎么办? 问题答案: 如果启用了@Async,则默认的异常处理机制不起作用。要处理使用@Async注释的方法引发的异常,您需要实现一个自定义AsyncExceptionH

  • 我使用的是Spring Boot1.5.7。我有一个ExceptionHandler用于返回ResponseEntity的异常 在返回ResponseEntity/@responseBody(JSON/XML响应)的api调用期间发生异常的情况下,这种方法工作得很好 null

  • 我有一个要求,我想在下面的场景中使用Spring批处理框架。 我有一个在交易日期列上分区的表。我想使用Spring批处理框架的阅读器、处理器和写入器来处理该表的记录。我想做的是根据交易日期创建单独的线程进行读取、写入和处理。假设有4个交易日期,那么我想为单独的交易日期创建4个单独的线程。在每个线程中,阅读器将从该交易日期的表中读取记录,在处理器中丰富记录,然后在写入器中发布/写入。 我是Sprin

  • 在使用标记为“春@ResponseStatus”的轴突@QueryHandler中引发的异常时遇到问题。原始异常被查询处理程序和轴突特定的轴突服务器远程处理异常抛出当Spring响应客户端时实际给出 500 的异常 仍然可以从 Axon 异常中获取一些信息,例如原始的“找不到实体”消息,但不能获取异常类型,也不能从原始异常包含的任何其他信息中获取。 Q1:有没有办法将查询处理程序中抛出的异常提升为

  • 假设我们进入一个方法并在主线程中启动一个事务。在这个方法中,有一些异步方法,所以我们在这个方法中创建了2个以上的线程; 由于线程2获得异常,我想回滚其他线程完成的所有事务。但是,虽然主线程和线程2拥有的事务可以回滚,但我无法回滚线程1工作。我正在使用Spring/Hibernate,所以你有什么想法来管理这个以及如何应用? 谢谢

  • 我正在为Spring Boot应用程序进行异常处理。我已经创建了我自己的异常类witch,一切都很好,我在控制台中得到了异常,但我无法到达我的@ExceptionHandler方法。 引发异常的类: 我的应用程序中没有其他异常处理程序,在抛出后,我得到了我设置的消息

  • 我使用以下代码设置了一个异常处理程序 我正在使用Spring Security 3.1。当我尝试在没有身份验证的情况下执行操作时,应用程序会引发 AccessDeniedException。它永远不会出现这种方法。但与其他例外情况一样工作正常。这是它应该工作的方式吗?还是我的代码有问题? 这看起来像一个解决方案。但是,如果我能在一个点上处理异常,那就更好了。 这是我的配置文件 更新 此处,用户未通

  • 我的Spring Boot服务将执行一项工作,并在成功后退出0(没有restcontroller),但我也希望它在每个异常时退出,因此我在类上添加了并放置了以下方法: 一切正常,但当我抛出一个IllegalArgumentException时,方法不会被调用。首先,我有一个没有参数的void方法,然后我开始尝试使用字符串返回和至少一个参数--这是不需要的。 这怎么行?有没有更好的方法让我的案例对每