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

当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
我化作了雨
其实不合格的都是假货