【问题标题】:Vert.x Future returns false while checking statusVert.x Future 在检查状态时返回 false
【发布时间】: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

任何帮助将不胜感激! 干杯

【问题讨论】:

    标签: java vert.x


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多