我們正在探索使用Camel和Netty4在使用TCP套接字將XML消息流式傳輸到我們的服務器的設備之間設置路由。該過程遵循以下路徑:Camel-Netty4不支持的消息類型InputStreamCache錯誤
IncomingXML - >轉換爲POJO - >進程(創建響應) - >轉換(對XML的響應) - >返回XML響應。
的路由進行定義的一個藍圖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)
我們不知道什麼是合適的編碼器鏈應該是什麼。我們是否需要實現自定義的編解碼器,或者是否有解決方案與提供的編解碼器?
任何人的幫助,方向或例子將不勝感激!
如果設置streamCache =「假」 –