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

CompletatbleFuture与Spring的Async一起使用时的异常处理

壤驷睿
2023-03-14

我对这个可完成的未来概念很陌生。我使用Spring的异步注释,为此我为执行器和异常处理程序添加了一个文件配置,如下所示:

@Override
public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(CORE_POOL_SIZE);
    taskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
    taskExecutor.setQueueCapacity(QUEUE_CAPACITY);
    taskExecutor.setThreadNamePrefix("AsyncThread - ");
    taskExecutor.initialize();
    return taskExecutor;
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return asyncExceptionHandler;
}

然后我有一个方法,我想异步运行并返回CompletableFuture:

@Async
public CompletableFuture<Void someMethod() {
     try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return CompletableFuture.completedFuture(null);
}

现在,如果在上述方法调用中发生了一些异常,那么我应该如何处理该异常?

注意:如果我不返回CompletableFuture并返回vo,它将转到异常处理程序AsyncUncaughtExceptionHandler,但根据我的要求,我想返回CompletableFuture Void。

共有1个答案

施琦
2023-03-14

这是预期的行为。查看AsyncExecutionAspectSupport类方法handleError

protected void handleError(Throwable ex, Method method, Object... params) throws Exception {
    if (Future.class.isAssignableFrom(method.getReturnType())) {
        ReflectionUtils.rethrowException(ex);
    }
    else {
        // Could not transmit the exception to the caller with default executor
        try {
            this.exceptionHandler.obtain().handleUncaughtException(ex, method, params);
        }
        catch (Throwable ex2) {
            logger.warn("Exception handler for async method '" + method.toGenericString() +
                    "' threw unexpected exception itself", ex2);
        }
    }
} 

如果方法返回类型是Future的变体,则始终If(Future.class.isAssignableFrom(method.getReturnType()),其计算结果为true,并且异常被重新抛出,由更高级别的调用方处理,因此它不由AsyncUncaughtExceptionHandler处理。

您可以通过CompletableFuture提供的工具来处理异常,例如handle(双功能

 类似资料:
  • 我是Spring Boot的新手。在一个项目中,我想异步发送一封电子邮件。下面,你可以看到我到目前为止有什么。 我遇到的一个问题是:外部系统向控制器发送POST请求。如果在生成或发送邮件时发生异常,则不会调用。因此,控制器总是返回HTTP 201,因此调用者认为一切正常。 我将如何集成我的异常处理程序与在这样的异步方法? 控制器 服务 异常处理程序

  • 我有一个ControllerAdvice类,它处理一组异常。我们还有其他一些例外情况,这些例外情况用注释进行了注释。为了结合这两种方法,我们使用博客文章中描述的技术:http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc,即在ControllerAdvice中,我们以以下方式处理一般异常: 它就像一个符咒,但是,使用此技术

  • 问题很简单:我正在寻找一种优雅的方式,将<code>CompletableFuture#与<code>CompletableFuture#supplySync</code>一起使用。这是不起作用的: 我认为背后的想法正是为了处理抛出的情况。然而,如果我这样做,它会起作用: 我可以这样做,但是这看起来很可怕,而且让事情更难维护。有没有一种不需要将所有< code>Exception转换为< code

  • 我试图将Hibernate与我的spring应用程序上下文联系起来。我正在成功地连接SessionFactory,但当我尝试调用getCurrentSession时,我看到以下错误: 我正在配置数据源会话工厂和事务管理器。我还指定了事务处理将是注释驱动的 下面是我的上下文XML: null 下面是我发现错误的类: 当这被称为sessionFactory时不是null,而是带有上述错误的错误。如果我

  • 处理请求的过程中,Spring MVC可能会抛出一些的异常。SimpleMappingExceptionResolver可以根据需要很方便地将任何异常映射到一个默认的错误视图。但,如果客户端是通过自动检测响应的方式来分发处理异常的,那么后端就需要为响应设置对应的状态码。根据抛出异常的类型不同,可能需要设置不同的状态码来标识是客户端错误(4xx)还是服务器端错误(5xx)。 默认处理器异常解析器De

  • JMockit版本:1.47 Jupiter JUNIT版本:5.3.2 IntelliJ版本:2019.1 Ultimate 有谁能帮忙吗。