@async 方法返回 completablefuture 时,任务异常会表现为 future 异常完成。调用方可以用 whencomplete() 观察失败,并在需要等待结果时捕获 join() 抛出的 completionexception。

让异步方法返回可观察的 Future
示例需要现有 Spring Boot 异步配置已启用,并从另一个 Bean 调用此服务。
import java.util.concurrent.CompletableFuture;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
class ExportService {
@Async
public CompletableFuture<String> run(boolean fail) {
if (fail) {
throw new IllegalStateException("export failed");
}
return CompletableFuture.completedFuture("export ready");
}
}
返回值允许调用者分别处理成功和失败。
用回调记录异常并保留失败状态
在调用方的测试或验证方法中执行,service 为容器注入的 ExportService。
var observed = service.run(true).whenComplete((value, error) -> {
if (error != null) {
System.err.println("export failure: " + error);
}
});回调正常结束时,whenComplete 不会把上游失败变成成功。记录日志时按项目约定处理敏感数据。
验证等待结果时的异常类型
只在需要等待结果的边界使用 join。
try {
System.out.println(observed.join());
} catch (java.util.concurrent.CompletionException error) {
System.err.println(error.getCause().getMessage());
}
System.out.println(service.run(false).join());失败分支应打印 export failed,成功分支应打印 export ready。


















