El Vert.x Future devuelve false al verificar el estado.
Tengo un método que devuelve un Future
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
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íneapromise.complete()
se llama dentro de la función de devolución de llamada del métododb.preparedQuery(...).executeBatch(...)
, lo que significa que la promesa se completa de forma asíncrona después de que el métodoexecuteBatch(...)
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étodoexecuteBatch(...)
. 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
:Con esta modificación, los métodos
generateChildSerial.succeeded()
ygenerateChildSerial.isComplete()
deberían devolvertrue
en el métodocompose
.