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

单线程Vert.x事件循环

习海
2023-03-14

我正在使用vert。x 2.1.5版本。我试图在我的项目中使用事件循环。下面给出了示例代码

JsonObject result = null;
//loop starting
for (int i=0;i<length;i++)
{

 final JsonObject jsonObject1 = jsonObject.getArray("result").get(i);                                                           
 int x = jsonObject1.getInteger("X");
 String Data = "X="+x+"&Y="+y;  
 //calling another event 
vertx.eventBus().send("event1", Data,new Handler<Message<String>() {public void   handle(Message<String>response) 
{
JsonObject jsonObject = new JsonObject(response.body());
result_arry.addArray(jsonObject.getArray("details"));
                                            }
});
} // loop end
result = resultJson("Ok",result_arry ); 
//it will create one json object with proper format 
message.reply(result.toString());

在此代码中,我的事件总线在执行事件循环之前返回值。我需要根据事件循环输出填充我的输出 如何实现

共有1个答案

傅明知
2023-03-14

基本上,问题在于你没有等待消息的到来。为了让我的例子更加清晰,我删除了大部分Json逻辑。

Vertx vertx = Vertx.vertx();
int messages = 10;

// First register your consumer
MessageConsumer<JsonObject> consumer = vertx.eventBus().consumer("event1");
consumer.handler(o -> {
    System.out.println("Got message" + o.body());

    // Consumer replies to sender with the same message
    o.reply(o.body());
});

// Now send your messages
for (int i=0;i<messages;i++) {
    JsonObject data = new JsonObject();
    data.put("value", i);

    vertx.eventBus().send("event1", data, response -> {
        if (response.succeeded()) {
            // Each time consumer replies, print it
            System.out.println("Consumer replied: " + response.result().body());
        }
    });
}

请注意,回复在处理程序体中,发送方在访问它之前必须检查响应是否成功。

 类似资料:
  • 问题内容: 首先,我开始尝试了解什么是Node.Js。我有两个问题。 第一个问题 从文章费利克斯的,它说:“只能有一个回调在同一时间发射。在此之前,回调完成执行,所有其他的回调都在排队等候”。 然后,考虑以下代码(从nodejs官方网站复制) 如果同时收到两个客户端请求,则意味着以下工作流程: 收到第一个http请求事件,收到第二个请求事件。 收到第一个事件后,将立即执行第一个事件的回调函数。 同

  • 根据我的理解,每个Vert.x实例都将被分配一个事件循环。事件循环处理该特定实例的所有请求和其他任务。事件循环是一个线程,我认为。当部署了多个Vert.x实例时,每个实例都有自己的事件循环,对吗?这意味着存在多个线程(multi-threading)。我就是这么理解的。这个单线程概念让我非常头疼。任何帮助都将不胜感激。

  • 我尝试使用Vert。x反应式Oracle客户端版本4.2.6,以避免在事件循环中阻塞线程。我决定测试一个非常长的查询: 但不幸的是,我在控制台上收到了这样的警告: [vertx-阻塞-线程检查器]WARNNIOPacket.java:199-线程[vert. x-事件循环-线程-1,5, main]已被阻塞6866毫秒,时间限制为2000毫秒//oracle.net.ns.NIOPacket.re

  • 顶点似乎只由单个线程执行,并且总是由同一个线程执行。但是Vert. x能够通过每个CPU创建一个线程来使用机器中的所有CPU。每个线程可以向多个顶点发送消息。 但在性能测试期间,在标准verticle上评测Vertex http服务器时,我只能看到一个线程处理所有处理(vert.x-eventloop-thread-0)。 我该怎么做才能让我的8个事件循环线程都处理到verticle的消息?

  • 我是Vert.x.中活动巴士的新手https://vertx.io/docs/vertx-core/java/,描述如下: 尽最大努力交付 Vert.x尽最大努力传递消息,并且不会有意识地丢弃它们。这称为尽力而为的交付。 如果您的应用程序关心丢失的消息,您应该将您的处理程序编码为等幂,并将您的发送程序编码为在恢复后重试。 我的系统不希望丢失任何消息,所以我必须了解事件总线并决定是否使用Vert.

  • 请说明当netty server和netty client连接成代理时,请求、线程、eventloop、服务器通道和客户端通道之间的关系。在开始之前,我认为对于每个请求,netty服务器都会从获取一个工作线程,以及一个(绑定到工作线程,使用线程池中有限的对象ID)来处理该入站消息,并将其发送到来自netty客户端的出站。此后,可能的服务器<代码>频道受到限制,而客户端<代码>频道受到限制(因为出站