CamelとNetty4を使用して、TCPソケットを使用してサーバーにXMLメッセージをストリーミングするデバイス間のルートを設定します。このプロセスは、次のパスに従います。Camel-Netty4サポートされていないメッセージタイプInputStreamCacheエラー
IncomingXML - > POJOに変換 - >プロセス(応答を作成) - >変換(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とのパイプラインを:
ルートは青写真のXMLファイルに定義されています。
@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 –