Java8 CompletableFuture recoverWith等价? 例如exception但返回CompletableFuture
我没有看到使用异步结果处理exception的明显方法。 例如,如果我想重试异步操作。 我希望这样的东西,但handleAsync不会做你认为它做的事情 – 它在异步运行另一个线程上的回调。 在这里返回CompletionStage是不正确的。 当天的危险问题:然后应用就像那时候的组合就是什么。
CompletionStage cf = askPong("cause error").handleAsync((x, t) -> { if (t != null) { return askPong("Ping"); } else { return x; } });
askPong问演员的地方:
public CompletionStage askPong(String message){ Future sFuture = ask(actorRef, message, 1000); final CompletionStage cs = toJava(sFuture); return cs; }
这是你想要的?
askPong("cause error") .handle( (pong, ex) -> ex == null ? CompletableFuture.completedFuture(pong) : askPong("Ping") ).thenCompose(x -> x);
另外,不要使用...Async
方法,除非您打算异步执行所提供函数的主体。 所以,当你做类似的事情
.handleAsync((x, t) -> { if (t != null) { return askPong("Ping"); } else { return x; })
您要求if-then-else
在单独的线程中运行。 由于askPong
返回CompletableFuture
,因此可能没有理由异步运行它。
在尝试找出在Java 8中使用Scala的recoverWith的正确方法时遇到了很多挫折之后,我最终只是编写了自己的。 我仍然不知道这是否是最好的方法,但我创建了类似的东西:
public RecoveryChainAsync recoverWith(Function> fn);
通过重复调用recoverWith,我将恢复链中的函数排队,并使用“handle”自行实现恢复流程。 RecoveryChainAsync.getCompletableFuture()然后返回整个链的代表CompletableFuture。 希望这可以帮助。