es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener resultado de CompositeFuture Vertx

Recientemente he aprendido sobre Composite Futures. Entiendo que puedo tener una lista de Futures y cuando todos estén completados, se llamará al manejador del CompositeFuture:

CompositeFuture.all(futures).onComplete(compositeAsync -> {
    if (compositeAsync.succeeded()){
        Future<compositefuture> cf = compositeAsync.result();
    } else {
        // al menos 1 futuro falló
    }
});

Mi pregunta es acerca de esta línea: Future<compositefuture> cf = compositeAsync.result();

Los futures que pasé al compositeFuture son de tipo List<><buffer>>, sin embargo, result() retorna un Future<compositefuture>. ¿Cómo puedo obtener el Future<buffer> de un Future<compositefuture>?

Usé el siguiente ejemplo para pasar futuros parametrizados a compositeFuture.all(futures);

interface MyCompositeFuture extends CompositeFuture {

    // Esto es lo que hace el método regular, solo como ejemplo
    /*
    static CompositeFuture all(List<future> futures) {
        return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()]));
    }
    */

    static <t> CompositeFuture all(List<><t>> futures) {
        return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()]));
    }
}

Fuente: https://stackoverflow.com/questions/41467014/vert-x-java-listfutures-parameterization

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para extraer el Future<buffer> de un Future<compositefuture> devuelto por el método result(), es necesario utilizar el método composite() de la clase CompositeFuture. Este método devuelve una lista de futuros que se completaron cuando el futuro compuesto se completó.

    Puede iterar sobre la lista de futuros devueltos por el método composite() y extraer el resultado de cada futuro. Aquí tienes un ejemplo:

    CompositeFuture.all(futures).onComplete(compositeAsync -> {
        if (compositeAsync.succeeded()){
            CompositeFuture cf = compositeAsync.result();
            List<buffer> results = new ArrayList<>();
            for (int i = 0; i < cf.size(); i++) {
                Future<buffer> future = cf.<><buffer>>composite().get(i);
                results.add(future.result());
            }
        } else {
            // al menos 1 futuro falló
        }
    });
    

    En este ejemplo, primero obtenemos el objeto CompositeFuture del método result() de compositeAsync. Luego, creamos un nuevo ArrayList para almacenar los resultados.

    Iteramos sobre los futuros devueltos por el método composite() y obtenemos el resultado de cada futuro utilizando el método result(). Luego, el resultado se agrega a la lista results.

    Ten en cuenta que utilizamos la llamada al método .<><buffer>>composite() para hacer un casting del futuro compuesto a List<><buffer>>, ya que el método composite() devuelve un List<><?>>.

Comments are closed.