我没有看到使用异步结果处理异常的明显方法。
例如,如果我想重试异步操作。我希望这样的东西,但handleAsync不会做你认为它做的事情 - 它在异步运行另一个线程上的回调。在这里返回CompletionStage是不正确的。关于当天的危险问题:thenApply
是thenCompose
,因为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;
}
答案 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。希望这会有所帮助。