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

9udxz4iz  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(434)

我正在运行vertx的本地示例。路由器将我的请求重定向到具有以下处理程序的worker verticle:

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().request[tag2]的线程开始在service1response.join()[tag1]等待将来的完成时,是否形成某种死锁?

3z6pesqy

3z6pesqy1#

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

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

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

相关问题