await - Java8 CompletableFuture recoverWith equivalent? por ejemplo, excepcionalmente, pero devuelve CompletableFuture<U>
java 8 promise (2)
No veo una forma obvia de manejar una excepción con un resultado asincrónico. Por ejemplo, si quiero volver a intentar una operación asíncrona. Esperaría algo como esto, sin embargo, handleAsync no hace lo que crees que hace: ejecuta las devoluciones de llamada en otro subproceso de forma asincrónica. Devolver un CompletionStage aquí no es correcto. Pregunta de peligro del día: entonces Aplicar es excepcionalmente como entonces. Componer es a qué.
CompletionStage<String> cf = askPong("cause error").handleAsync((x, t) -> {
if (t != null) {
return askPong("Ping");
} else {
return x;
}
});
Donde askPong pregunta a un actor:
public CompletionStage<String> askPong(String message){
Future sFuture = ask(actorRef, message, 1000);
final CompletionStage<String> cs = toJava(sFuture);
return cs;
}
¿Es esto lo que estás buscando?
askPong("cause error")
.handle( (pong, ex) -> ex == null
? CompletableFuture.completedFuture(pong)
: askPong("Ping")
).thenCompose(x -> x);
Además, no use los ...Async
métodos ...Async
menos que tenga la intención de que el cuerpo de la función suministrada se ejecute de forma asíncrona. Entonces cuando haces algo como
.handleAsync((x, t) -> {
if (t != null) {
return askPong("Ping");
} else {
return x;
})
Usted está pidiendo que if-then-else
se ejecute en un hilo separado. Como askPong
devuelve un CompletableFuture
, probablemente no haya ninguna razón para ejecutarlo de manera asincrónica.
Después de mucha frustración al tratar de descubrir la forma correcta de hacer la recuperación de Scala con Java 8, terminé escribiendo solo. Todavía no sé si este es el mejor enfoque, pero creé algo así como:
public RecoveryChainAsync<T> recoverWith(Function<Throwable,
CompletableFuture<T>> fn);
Con llamadas repetidas a recoverWith, pongo en cola las funciones dentro de la cadena de recuperación e implemento el flujo de recuperación yo mismo con "handle". RecoveryChainAsync.getCompletableFuture () luego devuelve un representante CompletableFuture para toda la cadena. Espero que esto ayude.