2016-11-05 88 views
0

我知道春季集成有TcpInboundGateway,TcpOutboundGateway和ByteArrayStxEtxSerializer來處理通過TCP端口傳來的數據。忽略春季集成的ServiceActivator中的響應TCP服務器

如果TCP服務器需要讀取客戶端發送的所有數據並進行處理,則ByteArrayStxEtxSerializer的工作效果很好。 (請求和響應模型) 我正在使用single-use = false,以便可以在同一個連接中處理多個請求。

例如,如果客戶端發送0x02AAPL0x03,則服務器可以發送AAPL價格。

如果客戶端發送0x02AAPL0x030x02GOOG0x03,我的TCP服務器正在工作。它發送AAPL和GOOG價格。

如果有無效報價器,TCP服務器應該忽略它並給出有效報價的價格。

當客戶端發送0x02AAPL0x030x2INVALIDTICKER0x030x02GOOG0x03時,我的客戶端收到AAPL的價格並等待永久超時。

我的TCP服務器使用ServiceActivator併爲INVALIDTICKER返回null。

我想知道爲什麼客戶端沒有收到有效的價格。 是套接字outputStream被阻塞了嗎?有什麼設置可以跳過ServiceActivator的一些響應嗎?

請幫忙。

我們使用Spring集成4.2.6.RELEASE版本和Java 8

這裏是我的Spring配置:

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

謝謝

回答

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

返回null流程結束,但網關不知道 - 可能是答覆可能出現在另一個線索上 - 他不能說他永遠不會收到這個請求的回覆。

由於您已將回復超時設置爲10秒,因此網關(套接字)線程將等待那段時間,然後才能執行任何其他工作。

鑑於您的流程很簡單,您可以安全地將回復超時設置爲0,因爲當回覆時,它已經可以處理。

+0

我無法更改回復超時時間,因爲有時候我的服務需要很長時間,我不希望客戶端等待很長時間。 我可以在我的服務中檢測到無效的代碼。如果我檢測到無效ticker,我可以使用invalidticker_status更新頭並在串行器中使用該狀態不發送任何響應。 您是否看到這種方法的任何問題? 我應該使用什麼API來更新ServiceActivator中的Header? – kevin

+0

但是對於你的配置,超時並不重要,因爲你的服務在套接字線程上運行 - 你必須交給另一個線程去做。你不能在串行器中訪問頭文件;你必須在自定義的TcpMessageMapper中做到這一點。如果你的服務激活器返回一個'消息',你可以設置標題。你可以返回Object,允許你有時只返回有效載荷,有時還會返回一條消息。 –

+0

我會嘗試在我的服務上設置單獨的超時並在單獨的線程上運行它。我將在gatewayCrLf中將reply-timeout設置爲0。 謝謝你的幫助,加里。 – kevin