#java #vert.x
#Ява #верт.х
Вопрос:
У меня есть метод, который возвращает будущее примерно так,
private Futurelt;Voidgt; generateChildSerial(RoutingContext context, Long createJobID)
и после того, как я вставляю данные в базу данных, я возвращаю будущее примерно так,
db .preparedQuery(sql) .executeBatch(batch, res -gt; { if (res.succeeded()) { // Process rows RowSetlt;Rowgt; rows = res.result(); LOG.info("rows.rowCount():" rows.rowCount()); } else { System.out.println("Batch failed " res.cause()); } promise.complete(); }); return promise.future();
Затем в моем методе составления, где я его связываю, я пытаюсь проверить состояние будущего следующим образом,
createJob(context) .compose(jobID -gt; { LOG.debug("jobID " jobID); Futurelt;Voidgt; generateChildSerial = generateChildSerial(context, jobID); LOG.debug("generateChildSerial.succeeded() " generateChildSerial.succeeded() " " generateChildSerial.result()); LOG.debug("generateChildSerial.isComplete() " generateChildSerial.isComplete()); return generateChildSerial; });
Операция с базой данных завершается успешно, но по какой-то причине я получаю false для обоих методов, консоль показывает примерно так,
[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
Любая помощь будет оценена по достоинству!! овации
Ответ №1:
Из ваших журналов вы можете видеть, что сначала вы регистрируете свой Future
статус, и только затем у вас печатается код внутри вашего асинхронного метода. Это потому, что на самом деле вы не ждете, пока он завершится. Итак, Vert.x здесь прав, ваше будущее еще не завершено.
Вы можете использовать map
вместо этого:
LOG.debug("jobID " jobID); Futurelt;Voidgt; generateChildSerial = generateChildSerial(context, jobID); return generateChildSerial.map { f -gt; // Do something here };
Из вашего примера не так ясно, что вы возвращаете, поскольку ваш тип возврата таков Void
.
Ответ №2:
Как вы можете видеть из журналов
2021-12-06 11:42:41.709 0330 [vert.x-eventloop-поток-1] ОТЛАДКА com.job.CreateJobHandler — generateChildSerial.IsComplete() ложь
Результат IsComplete() является ложным.
Это означает, что ваше будущее еще не завершено, и, следовательно, вы пока не можете ожидать, что у вас будет generateChildSerial.result() (следовательно, null), а также generateChildSerial.successed() (следовательно, false).
Если ваша цель состоит в том, чтобы регистрировать статус успеха или неудачи в будущем, у вас может быть что-то вроде
... LOG.debug("jobID " jobID); Futurelt;Voidgt; generateChildSerial = generateChildSerial(context, jobID); generateChildSerial.onComplete(result -gt; { if (result.succeeded()){ LOG.debug("generateChildSerial.succeeded() " generateChildSerial.succeeded() " " generateChildSerial.result()); } else { // log the error message you want } LOG.debug("generateChildSerial.isComplete() " generateChildSerial.isComplete()); }) return generateChildSerial; ....