2016-11-07 12 views
0

私はバネ統合がTcpInboundGatewayとByteArrayStxEtxSerializerを持っていることを知っています。春の統合で先読みTCPサーバ

ByteArrayStxEtxSerializerは、クライアントから送信されたすべてのデータをTCPサーバーが読み取って処理する必要がある場合に有効です。 (リクエストとレスポンスモデル)私はsingle-use = falseを使用しているので、複数のリクエストを同じ接続で処理することができます。

たとえば、クライアントが0x02AAPL0x03を送信した場合、ServerはAAPL価格を送信できます。

クライアントが0x02AAPL0x030x02GOOG0x03を送信すると、TCPサーバーが動作しています。それはAAPLとGOOGの価格を送信します。

クライアントがETX(0x03)の後にLRC(Longitudinal Redundancy Check)を送信することがあります。クライアントがLRCを送信する場合は、チェックサムを読み込んでチェックしたいと思います。

クライアントのリクエストは、0x02AAPL0x030x1E0x02GOOG0x03となります。注:この場合、LRCは0x1Eです。

ByteArrayStxEtxSerializerデシリアライザは、クライアントから送信されたバイトを読み取るようにカスタマイズできます。 LRCを探すために先読みする方法はありますか? LRCが存在しない場合は、通常の方法でデシリアライザでデータを処理できるように、読み取りマーカーを0x02に戻す必要があります。

オプションのLRCの対処方法をお勧めします。

<int-ip:tcp-connection-factory id="crLfServer" 
     type="server" 
     port="${availableServerSocket}" 
     single-use="false" 
     so-timeout="10000" 
     using-nio="false" 
     serializer="connectionSerializeDeserialize" 
     deserializer="connectionSerializeDeserialize" 
     so-linger="2000"/> 

    <bean id="connectionSerializeDeserialize" class="org.springframework.integration.ip.tcp.serializer.ByteArrayStxEtxSerializer"/> 

    <int-ip:tcp-inbound-gateway id="gatewayCrLf" 
     connection-factory="crLfServer" 
     request-channel="serverBytes2StringChannel" 
     error-channel="errorChannel" 
     reply-timeout="10000"/> <!-- reply-timeout works on inbound-gateway --> 

    <int:channel id="toSA" /> 

    <int:service-activator input-channel="toSA" 
     ref="myService" 
     method="prepare"/> 

    <int:object-to-string-transformer id="serverBytes2String" 
     input-channel="serverBytes2StringChannel" 
     output-channel="toSA"/> 

    <int:transformer id="errorHandler" 
     input-channel="errorChannel" 
     expression="payload.failedMessage.payload + ':' + payload.cause.message"/> 

おかげ

答えて

0
あなたは何とか PushbackInputStreamに入力ストリームをラップする必要があります

は、ここに私の春の構成です。

現在、フレームワークにはフックがありません。将来のリリースでこのような拡張性をどのように提供できるか考えてみましょう。

一方で、引数をキーとし、ラッパーであるConcurrentHashMapを維持するステートフルデシリアライザを作成する方法もあります。 ApplicationListener<TcpConnectionCloseEvent>を実装する必要があるため、ソケットが閉じられたときにマップエントリをクリアすることができます。