当前位置: 首页 > 知识库问答 >
问题:

Vertx多线程worker verticle不并行处理消息

酆光熙
2023-03-14

我们使用Vertx 3.0.0。

情况:

我们有一个带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());
            }
    );

我们有工人垂直,这就是我们执行垂直的方式:

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实例,那么我就可以并行处理消息。例如,两个工作者实例可以同时处理两条消息。

共有1个答案

顾磊
2023-03-14

好的,经过Vert的短暂调查。x团队似乎在昨天的V3.1.0版本中解决了这个问题。以下是关于这个话题的一些讨论:https://groups.google.com/forum/#!msg/vertx/JEAJbGGQgeI/uTLDtaHBCAAJ

 类似资料:
  • 我正在使用Java VertX框架,并尝试使用VertX WebClient和一个简单的HTTP请求加载多个JSON对象。我想并行地做这件事,这样可以加快进程。 我有一个endpoint对象: 在另一个类中,我有以下应该并行处理的函数(源代码): 我不知道如何继续下去。VertX WebClient强制我使用异步处理程序,这意味着我不能直接返回JsonObject。

  • 启动并行处理最简单的方式就是在 Step 配置中加上一个TaskExecutor , 比如,作为 tasklet 的一个属性: <step id="loading"> <tasklet task-executor="taskExecutor">...</tasklet> </step> 上面的示例中, taskExecutor指向了另一个实现 TaskExecutor 接口的Bean. T

  • 消息传递 稍加考虑,上一节的练习题其实是不完整的,它只是评分系统中的一环,一个评分系统是需要先把信息从数据库或文件中读取出来,然后才是评分,最后还需要把评分结果再保存到数据库或文件中去。如果一步一步串行地做这三个步骤,是完全没有问题的。那么我们是否可以用三个线程来分别做这三个步骤呢?上一节练习题我们已经用了一个线程来实现评分,那么我们是否也可以再用一个线程来读取成绩,再用另个线程来实现保存呢? 如

  • 在Vertx官方文件中,我阅读了以下段落 在关于Reactor的文章中: 据我所知,如果我写错了,请纠正我,Vertx的工作方式如下: 当我们为阻塞代码提供一个处理程序时,vertx将线程池中的一个线程(不是事件循环)放入该代码中,该线程等于内核数,例如我有4个内核,事件循环检查每次迭代后该线程的状态,如果它准备好执行与该阻塞代码相关的处理程序,当所有4个内核都忙时,vertx将任务放入队列,稍后

  • 我是vert的新手。x、 我在尝试垂直。x“NetServer”功能。http://vertx.io/core_manual_java.html#writing-tcp服务器和客户端,它的工作方式很有魅力。 然而,我也读到“verticle实例严格来说是单线程的。 如果您创建一个简单的TCP服务器并部署它的单个实例,那么该服务器的所有处理程序始终在同一个事件循环(线程)上执行。” 目前,对于我的实

  • 想知道Kafka使用者(Java客户端)是否可以并行读取和处理多条消息...我的意思是使用多个线程...我应该使用rxJava吗?? 1)这样做是一个好的方法吗???2)而且根据我的理解,Kafka甚至把每一个线程都当作消费者...如果我错了,请纠正我... 3)并且还想让Java客户端作为守护进程服务在Linux中运行,这样它就可以连续运行,并且轮询Kafka的消息,读取和处理都是一样的...这