Java8 CompletableFuture recoverWith等价?例如异常但返回CompletableFuture <u> </u>

时间:2015-02-21 22:46:38

标签: java java-8 completable-future

我没有看到使用异步结果处理异常的明显方法。 例如,如果我想重试异步操作。我希望这样的东西,但handleAsync不会做你认为它做的事情 - 它在异步运行另一个线程上的回调。在这里返回CompletionStage是不正确的。关于当天的危险问题:thenApplythenCompose,因为exceptionally是什么?

CompletionStage<String> cf = askPong("cause error").handleAsync((x, t) -> {
    if (t != null) {
        return askPong("Ping");
    } else {
        return x;
    }
});

askPong问演员:

public CompletionStage<String> askPong(String message){
    Future sFuture = ask(actorRef, message, 1000);
    final CompletionStage<String> cs = toJava(sFuture);
    return cs;
} 

2 个答案:

答案 0 :(得分:10)

这是你在找什么?

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,因此可能没有理由异步运行它。

答案 1 :(得分:1)

在试图找出在Java 8中使用Scala恢复的正确方法时遇到了很多挫折之后,我最终只是写了自己的。我仍然不知道这是否是最好的方法,但我创造了类似的东西:

public RecoveryChainAsync<T> recoverWith(Function<Throwable,
                                         CompletableFuture<T>> fn);

通过重复调用recoverWith,我将恢复链中的函数排队,并使用&#34; handle&#34;自行实现恢复流程。 RecoveryChainAsync.getCompletableFuture()然后返回整个链的代表CompletableFuture。希望这会有所帮助。