2016-11-05 15 views
0

私はバネの統合に、TCPポート経由のデータを処理するTcpInboundGateway、TcpOutboundGateway、およびByteArrayStxEtxSerializerがあることを知っています。Spring IntegrationのServiceActivatorでの応答を無視するTCPサーバー

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

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

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

ティッカーが無効な場合、TCPサーバーはそれを無視して有効なティッカーの価格を提示する必要があります。

クライアントが0x02AAPL0x030x2INVALIDTICKER0x030x02GOOG0x03を送信すると、私のクライアントはAAPL価格を受信して​​、それまでの時間とタイムアウトを待ちます。

My TCP ServerはServiceActivatorを使用し、INVALIDTICKERにnullを返します。

私はなぜクライアントが有効な価格を受け取っていないのだろうかと思います。 ソケットoutputStreamがブロックされていますか? ServiceActivatorからの応答をスキップできる設定がありますか?

助けてください。私たちはここに春の統合4.2.6.RELEASEバージョンとJava 8

を使用している

は私の春の構成です:

<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"/> 

nullフローを終了を返す

答えて

1
<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 --> 

ありがとうゲートウェイはそれを知りません。応答が別のスレッドで発生する可能性があります。彼はこの要求に対して決して返事を受け取ることはできません。

応答タイムアウトを10秒に設定しているため、ゲートウェイ(ソケット)スレッドはそれ以上の作業を行うことができるまで待機します。

返信がある場合、それはすでにプロセスに利用できるようになります、ので、あなたのフローがシンプルであることを考えると、あなたは安全に0に返信タイムアウトを設定することができます。

+0

返信タイムアウトを変更することはできません。サービスが長くかかることがあり、クライアントが長時間待たされることがないためです。 私のサービスで無効なティッカーを検出できます。私が無効なティッカーを検出した場合、invalidticker_statusでヘッダーを更新し、その状態をシリアライザで使用して応答を送信しないでください。 この方法に問題はありますか? ServiceActivatorのヘッダーを更新するために使用するAPIは何ですか? – kevin

+0

あなたの設定では、あなたのサービスがソケットスレッド上で実行されているので、タイムアウトは関係ありません - あなたはそれを行うために別のスレッドに渡す必要があります。シリアライザのヘッダーにはアクセスできません。カスタムTcpMessageMapperでそれを行う必要があります。あなたのサービスアクティベータが 'Message 'を返す場合は、ヘッダを設定することができます。 'Object'を返すことができ、時にはペイロードと時にはメッセージだけを返すことができます。 –

+0

サービスで別のタイムアウトを設定し、別のスレッドで実行しようとします。私はgatewayCrLfのreply-timeoutを0に設定します。 助けてくれてありがとう、ゲーリー。 – kevin

関連する問題