Vertx多线程worker verticle不并行处理消息
Vertx multithreaded worker verticle doesn't process messages in parallel
我们使用 Vertx 3.0.0。
情况:
我们有带 REST 处理程序的主 Verticle。
REST 处理程序通过事件总线调用 worker,如下所示:
vertx.eventBus().send(
"sample.data",
"hello vert.x",
r -> {
System.out.println("[Main] Receiving reply ' " + r.result().body()
+ "' in " + Thread.currentThread().getName());
}
);
我们有 worker verticle,这就是我们执行这个 verticle 的方式:
vertx.deployVerticle("com.example.Worker",
new DeploymentOptions().setWorker(true).setMultiThreaded(true));
这是 Worker 实现:
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 的多线程选项的目的是什么(从文档中不清楚它是如何工作的)?
顺便说一句,如果我使用部署选项执行多个 Worker 实例,那么我会并行处理我的消息。比如2个Worker实例可以同时处理2条消息
好的,经过与 Vert.x 团队的简短调查,这个问题似乎已在昨天的版本 v 3.1.0 中得到修复。
以下是关于这个话题的一些讨论:
https://groups.google.com/forum/#!msg/vertx/JEAJbGGQgeI/uTLDtaHBCAAJ
我们使用 Vertx 3.0.0。
情况:
我们有带 REST 处理程序的主 Verticle。
REST 处理程序通过事件总线调用 worker,如下所示:
vertx.eventBus().send(
"sample.data",
"hello vert.x",
r -> {
System.out.println("[Main] Receiving reply ' " + r.result().body()
+ "' in " + Thread.currentThread().getName());
}
);
我们有 worker verticle,这就是我们执行这个 verticle 的方式:
vertx.deployVerticle("com.example.Worker",
new DeploymentOptions().setWorker(true).setMultiThreaded(true));
这是 Worker 实现:
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 的多线程选项的目的是什么(从文档中不清楚它是如何工作的)?
顺便说一句,如果我使用部署选项执行多个 Worker 实例,那么我会并行处理我的消息。比如2个Worker实例可以同时处理2条消息
好的,经过与 Vert.x 团队的简短调查,这个问题似乎已在昨天的版本 v 3.1.0 中得到修复。 以下是关于这个话题的一些讨论: https://groups.google.com/forum/#!msg/vertx/JEAJbGGQgeI/uTLDtaHBCAAJ