可以在列表中使用Vertx executeBlocking吗?

时间:2017-01-17 12:43:01

标签: vert.x

尝试以vertx方式处理长时间运行的作业列表

人们希望有人可以这样做:

  • 使用executeBlocking以异步方式处理长时间运行的作业
  • 使用复合期货等待期货完成

我知道这种方法不起作用..在代码落入CompositeFuture之前,Futures列表尚未完成。

是否有executeBlocking方法或是否必须使用支持列表的eventbus,vertx utils?

    java.util.ArrayList futureList = new ArrayList()
    for (i = 0; i < 100; i ++){
            vertx.executeBlocking({ future ->
            int id = i
            println "Running " + id
            java.lang.Thread.sleep(1000)
            println "Thread done " + id
            future.complete()
        }, true , { res ->
            if (res.succeeded()) {
                print "."
            } else {
                print "x"
            }
        })
    }

    CompositeFuture.join(futureList).setHandler({ ar ->
            if (ar.succeeded()) {
                System.err.println "all threads should be done.."
            }
    })

结果...&#34;所有线程都应该完成&#34;早期印刷

    Running 84
    Running 87
    Running 87
    Running 95
    all threads should be done..
    done.
    Thread done 3
    Thread done 36
    Thread done 3

线程完成0

1 个答案:

答案 0 :(得分:1)

在您的示例中,futureList为空,因此CompositeFuture.join(futureList)会立即完成。

像这样更改你的例子:

java.util.ArrayList futureList = new ArrayList()
for (i = 0; i < 100; i ++){
  Future jobFuture = Future.future()
  futureList.add(jobFuture)
  vertx.executeBlocking({ future ->
    int id = i
    println "Running " + id
    java.lang.Thread.sleep(1000)
    println "Thread done " + id
    future.complete()
  }, true , { res ->
    if (res.succeeded()) {
      print "."
    } else {
      print "x"
    }
    jobFuture.complete()
  })
}

注意jobFuture创建:

  Future jobFuture = Future.future()
  futureList.add(jobFuture)

以及完成:

    jobFuture.complete()

现在只有在所有作业完成后才会执行CompositeFuture.join(futureList)处理程序。