我正在运行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]?
我想是因为消费者没有通知发送者消息已被处理,所以被阻止了。我建议您检查为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