我需要编写一个camel组件,它将通过TCP向遗留系统发送同步请求 - 回复。我试图建立一个netty4组件,但有一些奇怪的事情发生。这是我的路线:
from("direct:foo")
.doTry()
.process(exchange -> {
Message message = (Message) exchange.getIn().getBody();
logger.info("Sending message: {}", message);
})
.toF("netty4:tcp://localhost:%d?sync=true&synchronous=true&requestTimeout=%d&encoders=stubEncoder&decoders=stubEncoder", port, timeout)
.process(exchange -> {
Response response = (Response) exchange.getIn().getBody();
logger.info("[{}] Received reply: {}", exchange, response);
})
.endDoTry()
.doCatch(ReadTimeoutException.class)
.process(exchange -> {
// handle timeout...
})
.end();
远程端口和超时是从属性注入的。此路由的输入/输出将是来自应用程序其余部分的域对象。我已经设置了一个编解码器,可以将这些域对象转换为一个简单的以管道分隔的字符串协议,该协议将被发送到远程服务器。我还有一个存根程序来模拟传统主机,它侦听服务器套接字,并在客户端套接字上发回响应。如果我从测试程序连接它,存根工作正常。
我看到的是路由接收传入消息,调用编解码器对消息进行编码,然后等待直到它达到超时,然后进入catch块中的超时处理器。在我的存根中,我看到正在建立的连接,然后在超时之后收到消息。存根发送响应,但为时已晚 - 路由已经开始处理超时。我认为synchronous = true选项会使netty4立即发送并等待,但这似乎并没有发生。我还缺少一些其他的选择吗?