我知道春季集成有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"/>
謝謝
我無法更改回復超時時間,因爲有時候我的服務需要很長時間,我不希望客戶端等待很長時間。 我可以在我的服務中檢測到無效的代碼。如果我檢測到無效ticker,我可以使用invalidticker_status更新頭並在串行器中使用該狀態不發送任何響應。 您是否看到這種方法的任何問題? 我應該使用什麼API來更新ServiceActivator中的Header? – kevin
但是對於你的配置,超時並不重要,因爲你的服務在套接字線程上運行 - 你必須交給另一個線程去做。你不能在串行器中訪問頭文件;你必須在自定義的TcpMessageMapper中做到這一點。如果你的服務激活器返回一個'消息>',你可以設置標題。你可以返回Object,允許你有時只返回有效載荷,有時還會返回一條消息。 –
我會嘗試在我的服務上設置單獨的超時並在單獨的線程上運行它。我將在gatewayCrLf中將reply-timeout設置爲0。 謝謝你的幫助,加里。 – kevin