我们正在探索使用Camel和Netty4在使用TCP套接字将XML消息流式传输到服务器的设备之间设置路由。该过程遵循以下路径:
IncomingXML - >转换为POJO - >过程(创建响应) - >转换(对XML的响应) - >返回XML响应。
路由被定义为Blueprint XML文件:
<camelContext id="Lucy" xmlns="http://camel.apache.org/schema/blueprint">
<dataFormats>
<jaxb id="pojos" contextPath="custom.pojo"/>
</dataFormats>
<route streamCache="true">
<from uri="netty4:tcp://0.0.0.0:9000?serverInitializerFactory=#spf&sync=true"/>
<unmarshal ref="pojos"/>
<process ref="pojosProcessor"/>
<marshal ref="pojos"/>
</route>
</camelContext>
我们使用以下ServerInitializerFactory initChannel设置管道。
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(ByteOrder.BIG_ENDIAN, 66560, 0, 4, 0, 4, true));
ch.pipeline().addLast(new XmlFrameDecoder(66560));
ch.pipeline().addLast(new LengthFieldPrepender(4));
ch.pipeline().addLast(new ByteArrayEncoder());
ch.pipeline().addLast(new ServerChannelHandler(consumer));
}
pojoProcessor正在创建响应,并将其作为Out对象的主体添加到Echange中。
在我们发送回复之前,一切正常。因为客户端要求将长度预先附加到消息中,所以我们认为要使用的编码器是
ch.pipeline().addLast(new LengthFieldPrepender(4));
ch.pipeline().addLast(new ByteArrayEncoder());
但是在我们执行元帅后,我们在日志中遇到以下错误:
Caused by: java.lang.UnsupportedOperationException: unsupported message type: InputStreamCache (expected: ByteBuf, FileRegion)
我们不知道正确的编码器链应该是什么。我们是否需要实现自定义编解码器,或者是否有提供的编解码器的解决方案?
非常感谢任何人提供的任何帮助,方向或示例!
答案 0 :(得分:0)
将有效负载转换为byte[]
,这是camel-netty理解的内容。
<route streamCache="true">
<from uri="netty4:tcp://0.0.0.0:9000?serverInitializerFactory=#spf&sync=true"/>
<unmarshal ref="pojos"/>
<process ref="pojosProcessor"/>
<marshal ref="pojos"/>
<convertBodyTo type="byte[]"/>
</route>