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.

El Vert.x Future devuelve false al verificar el estado.

Tengo un método que devuelve un Future de la siguiente manera:

private Future<void> generateChildSerial(RoutingContext context, Long createJobID)

Después de insertar los datos en la base de datos, devuelvo el future de la siguiente manera:

db
  .preparedQuery(sql)
  .executeBatch(batch, res -> {
    if (res.succeeded()) {

      // Procesar filas
      RowSet<row> rows = res.result();
      LOG.info("rows.rowCount(): " + rows.rowCount());

    } else {
      System.out.println("Error en el batch: " + res.cause());
    }
    promise.complete();
  });

return promise.future();

Luego, en mi método “compose” donde lo estoy encadenando, intento verificar el estado del future de la siguiente manera:

createJob(context)
  .compose(jobID -> 
    {
        LOG.debug("jobID: " + jobID);
        Future<void> generateChildSerial = generateChildSerial(context, jobID);
        LOG.debug("generateChildSerial.succeeded(): " + generateChildSerial.succeeded() +" "+ generateChildSerial.result());
        LOG.debug("generateChildSerial.isComplete(): " + generateChildSerial.isComplete());
        return generateChildSerial;
    });

La operación en la base de datos tiene éxito, pero por alguna razón obtengo “false” en ambos métodos. La consola muestra lo siguiente:

[vert.x-eventloop-thread-1] DEBUG com.job.CreateJobHandler - generateChildSerial.succeeded(): false null
2021-12-06 11:42:41.709+0330 [vert.x-eventloop-thread-1] DEBUG com.job.CreateJobHandler - generateChildSerial.isComplete(): false
2021-12-06 11:42:41.914+0330 [vert.x-eventloop-thread-1] INFO  com.job.CreateJobHandler - rows.rowCount(): 1

¡Cualquier ayuda será apreciada!
Saludos

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución

    Parece que el problema está en cómo se están utilizando las promesas y los futuros en el método generateChildSerial. La línea promise.complete() se llama dentro de la función de devolución de llamada del método db.preparedQuery(...).executeBatch(...), lo que significa que la promesa se completa de forma asíncrona después de que el método executeBatch(...) haya terminado de ejecutarse.

    Para solucionar este problema, puedes mover la línea promise.complete() fuera de la función de devolución de llamada y completarla después de que se haya llamado al método executeBatch(...). De esta manera, la promesa se completará de forma sincrónica después de que se haya completado la operación de la base de datos.

    Aquí tienes una versión modificada del método generateChildSerial:

    private Future<void> generateChildSerial(RoutingContext context, Long createJobID) {
        Promise<void> promise = Promise.promise();
    
        db.preparedQuery(sql).executeBatch(batch, res -> {
            if (res.succeeded()) {
                // Procesar filas
                RowSet<row> rows = res.result();
                LOG.info("rows.rowCount():" + rows.rowCount());
            } else {
                System.out.println("Error en el lote " + res.cause());
            }
            // Mover promise.complete() aquí
        });
    
        promise.complete(); // Completar la promesa después de llamar a executeBatch()
        return promise.future();
    }
    

    Con esta modificación, los métodos generateChildSerial.succeeded() y generateChildSerial.isComplete() deberían devolver true en el método compose.

Comments are closed.