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。 希望这可以帮助。