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

Vertx事件总线应答处理程序没有被特定调用调用

柳英资
2023-03-14

我正在运行vertx的本地实例。路由器将我的请求重定向到具有以下处理程序的工作顶点:

protected Handler<Message<JsonObject>> handler1() {
    return msg -> {
        final RequestBody req = mapper.readValue(msg.body().encode(), RequestBody.class);
        processRequest(req, msg);
    }
}

processRequest函数接受请求主体,调用两个外部服务,聚合响应,然后返回给客户端。

private processRequest(RequestBody req, Message<JsonObject> msg) {
    CompletableFuture<String> service1Response = getService1ResponseAsync(req); // Make async call to service 1
    String service2Response = getService2ResponseSync(req); // Make sync call to service 2

    ResponseBody response = aggregateResult(service1Response.join(), service2Response);  // Tag1
    msg.reply(mapper.writeValueAsString(response));
}

private CompletableFuture<String> getService1ResponseAsync(RequestBody req) {
    CompletableFuture<String> result = new CompletableFuture();
    // Below handler call makes GET call to service 1 using apache HTTP client and returns the response
    vertx.eventBus().request("serviceVerticleAddr1", mapper.writeValueAsString(req), new DeliveryOptions(), reply -> { // Tag2
        if (reply.succeeded())
            result.complete(reply.result().body().toString());
        else
            result.completeExceptionally(result.cause());
    }
}

当我点击上面的API时,我的请求超时。为执行我的请求而分配的工作线程池中的线程将永远在Tag1被阻止。进一步调试后,我发现Tag2中调用的应答处理程序没有被调用。

ServiceVerticle(ServiceVerticleDDR1)[即Tag2]中的处理程序会为使用它的其他API返回正确的响应,但对我来说,它被阻止了。有人能帮我找出原因吗?当线程调用vertx时是否会形成某种死锁。eventBus()。请求[Tag2]开始在service1Response等待将来的完成。join()[Tag1]?

共有1个答案

胥和悌
2023-03-14

我想是因为消费者没有通知发送者消息已被处理,所以被阻止了。我建议您检查为ServiceVerticleDDR1地址的使用者注册的处理程序块内部,并确保正在回复(通知)发件人请求的消息已成功处理(或未成功处理)。消费者可能看起来像

vertx.eventBus().consumer("serviceVerticleAddr1", message -> {
  try{
     doSomething();
     message.reply("done");
  } catch(){
     message.fail(0, "fails");
  }
});

这样,发送方的异步处理程序将被通知消费者可以处理请求的消息

 类似资料:
  • 我试图通过事件总线发送数据,当从客户端接到呼叫并响应回客户端。 一切正常,直到我在事件总线上添加拦截器... 以下是代码:- 还有一个疑问是,当我从IDE停止应用程序时,不会调用stop方法,但是如果我从另一个正常工作的垂直程序中取消部署这个垂直程序。

  • a.cs文件: 公共活动MyEventHandler Ontagload; 私有void btnLoad_Click(object sender,EventArgs e){if(OnTagLoad!=null){OnTagLoad(sender,e,runTimeData);}} 每当我单击Load按钮时,事件应该只触发一次。我们如何在windows窗体中实现这一点。 感谢你的帮助。

  • 我有这个单声道代码: 当validate方法抛出ValidationException时,将同时调用handleValidation异常和handleException。我只希望调用handleValidationException。为什么会发生这种情况?如何防止handleException被调用?

  • 我正在尝试在javaFx中为特殊需要定制一个快捷方式系统。 这种特殊需求使得不可能使用KeyCombinaison(只限制一个键修饰符是不可接受的)。 我已经做了我适当的KeyCompin联络员系统,现在我想从节点调用一个处理程序(我在控制器之外)。但是我找不到任何优雅的解决方案来执行这个。 有一个按钮声明: 在我想从我的快捷方式代码调用控制器的操作之后。 和标准控制器。 我可以做一些工作,例如使

  • 我正在使用Netty 4.1.0.final,但我面临一个问题,即消息不能通过出站处理程序传递。我发布了一个示例程序,其中有一个入站和一个出站处理程序。入站处理程序在ChannelHandlerContext中使用writeAndFlush,我的理解是它应该将消息转发到管道中可用的第一个出站处理程序。为了简单起见,忽略了内存管理。 引导代码 入站处理程序代码 } 出站处理程序代码 } 输出 信息T