Vertx多线程工作器Verticle不会并行处理消息

时间:2015-10-07 15:06:35

标签: java multithreading vert.x

我们使用Vertx 3.0.0。

Situaton:

我们有REST处理程序的主要文件。

REST处理程序通过事件总线调用worker,如下所示:

vertx.eventBus().send(
            "sample.data",
            "hello vert.x",
            r -> {
                System.out.println("[Main] Receiving reply ' " + r.result().body()
                        + "' in " + Thread.currentThread().getName());
            }
    );

我们有工作者Verticle,这就是我们执行这个Verticle的方式:

vertx.deployVerticle("com.example.Worker",
                            new DeploymentOptions().setWorker(true).setMultiThreaded(true));

这是工人实施:

public class Worker extends AbstractVerticle {


@Override
public void start() throws Exception {
    System.out.println("[Worker] Starting in " + Thread.currentThread().getName());

    vertx.eventBus().consumer("sample.data", message -> {
        System.out.println("[Worker] Consuming data in " + Thread.currentThread().getName());
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String body = (String) message.body();
        message.reply(body.toUpperCase());
    });

}
}

如果我多次请求我的REST服务,那么所有消息都会在我们的Worker中按顺序处理。为什么多线程在这里不起作用?工作者的多线程选项的目的是什么(从文档中不清楚它是如何工作的?)

顺便说一句,如果我使用部署选项执行多个Worker实例,那么我会得到我的消息的并行处理。例如,2个Worker实例可以同时处理2条消息。

1 个答案:

答案 0 :(得分:2)

好的,经过对Vert.x团队的简短调查后,看来这个问题在昨天的发布v 3.1.0中得到修复。 以下是对此主题的一些讨论: https://groups.google.com/forum/#!msg/vertx/JEAJbGGQgeI/uTLDtaHBCAAJ