2016-11-02 379 views
0

我知道Spring集成有TcpInboundGateway,TcpOutboundGateway和ByteArrayLengthHeaderSerializer來處理通過TCP端口傳來的數據。春季交互集成TCP服務器

如果TCP服務器需要讀取客戶端發送的所有數據並進行處理,則ByteArrayLengthHeaderSerializer的工作效果很好。 (請求和響應模型)

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

我正在尋找一種客戶端可以與服務器進行交互而無需在多個請求中關閉連接的方式。

例如:如果客戶端發送9AAPL,則服務器應發送AAPL價格並等待來自客戶端的另一個請求,而不關閉連接。這種交互可以繼續,直到客戶端在50秒內發送5或者沒有響應。

能否請您提供需要用於此交互行爲的Spring集成類(TCP網關,串行器等)?

我們正在使用spring集成4.2.6.RELEASE版本和java 8.這些版本是否足夠好或者我們是否需要升級到更新版本?

UPDATE: 這裏是我的Spring配置:

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

    <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

請出示您的配置 - 你想要的是默認的行爲。

僅當您將singleUse設置爲true時,網關纔會關閉套接字。

當然,您的客戶端也不能關閉套接字。

設置soTimeout以在該時間沒有收到請求後關閉套接字。

你不需要需要較新的版本,但我們始終推薦使用最新的(4.3.4)。

+0

將singleUse設置爲true對於保持連接暢通無阻。第二個請求是否通過串行器的同一個實例?序列化程序何時將數據傳遞給ServiceActivator? 是否可以定製串行器以將數據發送到ServiceActivator多次?可能是那不是一個乾淨的方式。請建議如何維持請求之間的狀態? 謝謝 – kevin

+0

'false'將套接字打開,而不是'true'。當接收到所有數據時,該消息被釋放。默認的解串器需​​要4字節的二進制長度;您可以通過串化器bean上的'constructor-arg'將它減少到1個字節(最多255個數據字節)。長度必須是二進制的。 '0x04 +'APPL''(或'0x00000004 +'APPL'',默認的4字節長度頭部)。使用'9APPL'和一個1字節的頭文件,解串器期望'0x39'(57)個字節的數據('0x39'是ascii'9'的二進制值)。如果你想要的長度是ascii(而不是二進制),你將需要一個自定義(德)序列化程序。 –

+0

關於國家,你需要準確解釋你說的是什麼樣的狀態。 –