Spring Boot异步框架的详细使用(2)

电脑杂谈  发布时间:2020-06-08 14:23:24  来源:网络整理

注意:

Spring还提供了一个AsyncConfigurerSupport类,该类还实现了AsyncConfigurer接口,该方法的返回值为nulljava异步调用框架,旨在提供一种方便的实现.

java异步调用框架_java 异步接口_ajax异步提交 java

当getAsyncExecutor()方法返回null时,Spring将使用默认处理器(强烈不推荐).

当getAsyncUncaughtExceptionHandler()返回null时,Spring将使用SimpleAsyncUncaughtExceptionHandler处理异常,并且此类将打印出异常信息.

因此,使用此类的最佳实践是继承它并覆盖getAsyncExecutor()方法.

4.2异常处理

Spring异步框架的异常处理如下:

// 所在类:AsyncExecutionAspectSupport
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.handleUncaughtException(ex, method, params);
    }
    catch (Throwable ex2) {
      logger.error("Exception handler for async method '" + method.toGenericString() +
          "' threw unexpected exception itself", ex2);
    }
  }
}

从代码角度来看,如果返回值的类型为Future,则直接引发异常. 如果返回值不是Future类型(基本上包含所有返回值都为void的方法,因为如果该方法具有返回值,则必须使用Future进行包装),则将调用handleUncaughtException方法来处理该异常.

注意: handleUncaughtException()方法中引发的任何异常都将被Spring Catch捕获,因此无法再次抛出void方法并将其传播给上级调用者! ! !

我对Spring的设计的理解是: 由于该方法的返回值是空的,这意味着调用方不在乎该方法是否成功执行java异步调用框架,因此不需要处理该方法引发的异常. . 如果您需要关心异步方法的成功,则可以将返回值更改为布尔值.

4.4最佳做法建议

@Async可以为方法执行指定执行程序,用法: @Async(“ MyTaskExecutor”). 建议指定执行程序,以避免由于执行程序配置无效而导致Spring使用默认执行程序的问题. 在实现接口AsyncConfigurer时,方法getAsyncExecutor()必须使用@Bean并指定Bean的名称. 如果不使用@Bean,则此方法返回的Executor将不受Spring的管理. 使用java doc api的原始词是: 不是完全托管的Spring bean. (具体含义不太了解,但是如果没有此注释,则不能正常使用pro test. )因为它仍然基于代理的实现,所以如果一个类有两个异步方法A和B,并且有一个调用到A中的B,则在调用方法A时,方法B将不会异步执行. 在异步方法上注释@Transactional无效. 对于future.get(),最好使用get(long timeout,TimeUnit unit)方法,以避免长期阻塞. 还建议使用ListenableFuture和CompletableFuture. 与Future相比,它们提供了介入异步调用的各个阶段或过程的功能.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-238381-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...