Vert.x Future 在检查状态时返回 false
Posted
技术标签:
【中文标题】Vert.x Future 在检查状态时返回 false【英文标题】:Vert.x Future returns false while checking status 【发布时间】:2022-01-11 11:51:22 【问题描述】:我有一个像这样返回 Future 的方法,
private Future<Void> generateChildSerial(RoutingContext context, Long createJobID)
在我将数据插入数据库后,我会像这样返回未来,
db
.preparedQuery(sql)
.executeBatch(batch, res ->
if (res.succeeded())
// Process rows
RowSet<Row> rows = res.result();
LOG.info("rows.rowCount():"+ rows.rowCount());
else
System.out.println("Batch failed " + res.cause());
promise.complete();
);
return promise.future();
然后在我链接它的 compose 方法中,我试图像这样检查未来的状态,
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;
);
数据库操作成功,但由于某种原因,这两种方法都为假,控制台显示如下,
[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】:从日志中可以看出
2021-12-06 11:42:41.709+0330 [vert.x-eventloop-thread-1] 调试 com.job.CreateJobHandler - generateChildSerial.isComplete() false
isComplete() 结果为假。
这意味着您的未来尚未完成,因此,您还不能期望拥有 generateChildSerial.result()(因此为 null)和同样的 generateChildSerial.succeeded()(因此为 false)。
如果你的目标是记录未来的成功或失败状态,你可以有类似的东西
...
LOG.debug("jobID "+jobID);
Future<Void> generateChildSerial = generateChildSerial(context, jobID);
generateChildSerial.onComplete(result ->
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;
....
【讨论】:
【参考方案2】:从您的日志中,您可以看到首先记录您的Future
状态,然后才打印异步方法中的代码。那是因为您实际上并没有等待它完成。所以 Vert.x 在那里是正确的,你的 Future 还没有完成。
您可以改用map
:
LOG.debug("jobID "+jobID);
Future<Void> generateChildSerial = generateChildSerial(context, jobID);
return generateChildSerial.map f ->
// Do something here
;
从您的示例中,您返回的内容不是很清楚,因为您的返回类型是 Void
。
【讨论】:
以上是关于Vert.x Future 在检查状态时返回 false的主要内容,如果未能解决你的问题,请参考以下文章
Akka HighLevelHttp 从恢复 Future 返回 Route