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的主要内容,如果未能解决你的问题,请参考以下文章

获取 std::future 的状态

AU-VERT X UJA | 穿出我的环保态度

Akka HighLevelHttp 从恢复 Future 返回 Route

华为HCIE云计算之FA升级流程

Vert.x - 带有 DataInputStreams 的 GraphQL 订阅

Vert.x系列,Http Router