你需要使用spring的AsyncResult类来包装你的结果,然后使用它的方法.completable()返回CompletableFuture对象。
合并未来对象时,使用CompletableFuture.thenCompose() 和CompletableFuture.thenApply() 方法合并数据,如下所示:
CompletableFuture<Integer> result = futureData1.thenCompose(fd1Value ->
futureData2.thenApply(fd2Value ->
merge(fd1Value, fd2Value)));
这是一个基本示例:
用@EnableAsync注解注解Spring boot主类
@SpringBootApplication
@EnableAsync
public class StackOverflowApplication {
public static void main(String[] args) {
SpringApplication.run(StackOverflowApplication.class, args);
}
}
创建一个返回CompletableFuture的示例服务
Aservice.java
@Service
public class Aservice {
@Async
public CompletableFuture<Integer> getData() throws InterruptedException {
Thread.sleep(3000); // sleep for 3 sec
return new AsyncResult<Integer>(2).completable(); // wrap integer 2
}
}
Bservice.java
@Service
public class Bservice {
@Async
public CompletableFuture<Integer> getData() throws InterruptedException {
Thread.sleep(2000); // sleep for 2 sec
return new AsyncResult<Integer>(1).completable(); // wrap integer 1
}
}
创建另一个服务,它将合并其他两个服务数据
ResultService.java
@Service
public class ResultService {
@Autowired
private Aservice aservice;
@Autowired
private Bservice bservice;
public CompletableFuture<Integer> mergeResult() throws InterruptedException, ExecutionException {
CompletableFuture<Integer> futureData1 = aservice.getData();
CompletableFuture<Integer> futureData2 = bservice.getData();
// Merge futures from Aservice and Bservice
return futureData1.thenCompose(
fd1Value -> futureData2.thenApply(fd2Value -> fd1Value + fd2Value));
}
}
创建一个用于测试的示例控制器
ResultController.java
@RestController
public class ResultController {
@Autowired
private ResultService resultService;
@GetMapping("/result")
CompletableFuture<Integer> getResult() throws InterruptedException, ExecutionException {
return resultService.mergeResult();
}
}