Camel-Netty4不支持的消息类型InputStreamCache错误

时间:2016-12-16 16:29:49

标签: apache-camel netty

我们正在探索使用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&amp;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)

我们不知道正确的编码器链应该是什么。我们是否需要实现自定义编解码器,或者是否有提供的编解码器的解决方案?

非常感谢任何人提供的任何帮助,方向或示例!

1 个答案:

答案 0 :(得分:0)

将有效负载转换为byte[],这是camel-netty理解的内容。

<route streamCache="true">
    <from uri="netty4:tcp://0.0.0.0:9000?serverInitializerFactory=#spf&amp;sync=true"/>
    <unmarshal ref="pojos"/>
    <process ref="pojosProcessor"/>
    <marshal ref="pojos"/>
    <convertBodyTo type="byte[]"/>
</route>