我必须与使用TCP / IP通信的传统主机集成,并使用单独的请求和响应通道。您在一个通道上向主机发送请求,它是服务器,您需要打开一个服务器通道,以便稍后发送响应。通信是异步的,因此无法保证您收到的下一条消息将是您刚刚发送的请求的响应 - 您必须在响应中使用相关键将其绑定回请求。
我有一个Camel路由,它接收传入请求并将其发送到主机,以及另一个侦听响应的路由。我有第三个路由,它使用聚合器使用相关键将响应绑定回请求。粗略地说,路线看起来像这样:
from("direct:myService")
.process(exchange -> exchange.setProperty("CorrelationKey", exchange.getIn().getBody(MyMessage.class).getCorrelationKey())
.to("netty4:tcp://somehost:555")
.to("direct:aggregate");
from("netty4:tcp://localhost:555")
.process(exchange -> exchange.setProperty("CorrelationKey", exchange.getIn().getBody(MyResponse.class).getCorrelationKey())
.to("direct:aggregate");
from("direct:aggregate")
.aggregate(header("CorrelationKey"), (oldEx, newEx) -> {
if (oldEx == null) {
return newEx;
}
oldEx.getOut().setBody(newEx.getIn().getBody());
oldEx.setProperty(Exchange.AGGREGATION_COMPLETE_CURRENT_GROUP, true)
return oldEx;
}).completionTimeout(5000)
.process(exchange -> logger.log("Received response"));
聚合策略的工作原理是我只在处理完响应后才看到日志消息。问题是请求路由(“direct:myService”)不等待聚合 - 它已经返回给调用者。我想要的是阻塞该路由,直到聚合策略得到响应,以便netty4使用者收到的消息被用作direct:myService路由的out消息。那可能吗?