我正在运行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]等待将来的完成时,是否形成某种死锁?
1条答案
按热度按时间3z6pesqy1#
我想是因为发送者没有被消费者通知消息已被处理而被阻止。我建议您检查为的使用者注册的处理程序块的内部
serviceVerticleAddr1
地址并确保正在回复(通知)发件人请求的消息已成功处理(或未成功处理)。消费者可能看起来像这样,发送方的异步处理程序将被通知使用者可以处理请求的消息