我有两个 API,它们返回两个不同的结果类。我们将这两个结果结合起来得到一个 FinalClass。
基本上,如果这些Api同时运行,
-
如果它首先收到具有特定结果(G,H)的A类,则B类是什么并不重要(我们不会等待serviceAPI B),只需返回下表中的Final类。
-
如果 A 类没有确定的结果,我们必须等待合并两个结果(A 和 B)才能得到 Final 类。
我正在尝试使用这些 stackoverflow 文章来处理这个问题。我不喜欢用接口标记类来标记它们(这些是遗留对象),但是将其作为第二个选项开放。
返回在响应的特定条件下首先执行的 future
在java中,我如何处理CompletableFutures并获得第一个完成的期望结果?
public class A {
public String resultA;
}
public class B {
public int resultB;
}
public class Final {
public String resultFinal;
}
CompletableFuture<A> futureA = CompletableFuture.supplyAsync(() -> serviceA.getAPI());
CompletableFuture<B> futureB = CompletableFuture.supplyAsync(() -> serviceB.getAPI());
CompletableFuture.allOf(futureA,futureB).join();
![enter image description here](https://i.stack.imgur.com/LzyB9.png)
愿意将这两个类都设为标记接口
public class A implements MarkerResponse {
public class B implements MarkerResponse {
public interface MarkerResponse {}
标记接口
目前使用 Spring Boot 和 Java 8。上下文:真正的服务双 API 可能会变化 1-5 分钟,因此如果可能的话尝试提高性能。
由于在任何一种情况下都需要 A 的结果,为了确定是否需要 B 的结果,您可以简单地将决策链接为 A 上的依赖操作:
CompletableFuture<Final> result = futureA.thenCompose(a ->
a.resultA.equals("G") || a.resultA.equals("H")?
CompletableFuture.completedFuture(new Final("success")):
futureB.thenApply(b -> new Final(b.resultB == 1? "fail": "error")));
请注意,当成功的可能性很大并且并行运行 A 和 B 的收益相当低时,您甚至可以决定仅在必要时才开始 B:
CompletableFuture<Final> result = futureA.thenCompose(a ->
a.resultA.equals("G") || a.resultA.equals("H")?
CompletableFuture.completedFuture(new Final("success")):
CompletableFuture.supplyAsync(
() -> new Final(serviceB.getAPI().resultB == 1? "fail": "error")));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)