问题
在《Spring中的异步任务》文中,这里已经知道怎么使用@Async
注解来实现异步。但是一个业务由多个异步任务构成,只有当多个异步任务处理完成了,才能够代表该业务处理完成。所以,这里就涉及到等待多个异步任务进行状态同步。
思路
使用CompletableFuture来处理多异步任务的状态同步,这里主要在Spring的注解@Async
的基础上面使用Java的CompletableFuture类的allOf方法和join方法来完成消息同步。
步骤
Service
@Async
@Override
public CompletableFuture<TodoMessage> pushBusinessMessage(){
// 耗时异步任务
// 最终需要返回CompletableFuture的类
return CompletableFuture.completedFuture.(myData);
}
这里主要利用completedFuture工厂方法来外部传递自定义对象。
Controller
// 待定所有异步任务完成
CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[0])).join();
//
if (completableFutureList.stream()
.map(CompletableFuture::join)
.allMatch(myData -> myData != null && myData.isSuccess())) {
// 顺利完成业务
} else {
// 未顺利完成业务
}
这里的CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[0])).join();
这里的completableFutureList
是一个List,它收集所有异步任务返回,然后在迭代这个List,一个一个检查异步任务结果,通过一个个异步任务结果,来综合判断业务是否处理成功。
总结
CompletableFuture能够做的事情非常的丰富,远不是处理异步任务状态同步事情。
参考
- Creating Asynchronous Methods
- Spring Boot: Creating Asynchronous Methods Using @Async Annotation
- Multi-Threading in Spring Boot Using CompletableFuture
- Java 8 CompletableFuture 教程
- Spring @Async rest controller example – Spring @EnableAsync
- 【译】CompletableFuture 指南
- Java CompletableFuture 详解
- Fantastic CompletableFuture.allOf() and how to handle errors.