2017-10-05 179 views
0

我有一個tcp客戶端 - 服務器應用程序,其中客戶端打開一個用於一次性連接並在配置時間後斷開連接的連接。我如何配置它始終保持連接的活動狀態,在關閉的連接上重新連接並確保多個客戶端連接對服務器開放。配置保持活動狀態始終保持連接狀態

客戶端配置:

<int-ip:tcp-connection-factory id="client" 
    type="client" 
    host="${server.TCP.host}" 
    port="${server.TCP.port}" 
    single-use="true" 
    so-timeout="${client.TCP.socketTimeOut}" /> 

<int-ip:tcp-outbound-gateway id="outGateway" 
    request-channel="bytesOut" 
    reply-channel="bytesIn" 
    connection-factory="client" 
    request-timeout="${client.TCP.requestTimeOut}" 
    reply-timeout="${client.TCP.replyTimeout}" /> 

服務器配置:

<int-ip:tcp-connection-factory id="tcpServerConnFactory" 
    type="server" 
    port="${service.tcp.port}" 
    using-nio="true" 
    single-use="false" 
    so-timeout="${service.tcp.socketTimeout}" 
    task-executor="taskExecutor"/> 

<int-ip:tcp-inbound-gateway 
    id="tcpInboundGateway" 
    connection-factory="tcpServerConnFactory" 
    request-channel="bytesInChannel" 
    reply-channel="bytesOutChannel" 
    error-channel="errorChannel" /> 

回答

1

在客戶端一次性使用裝置,正是 - 每個插座用於一個請求/回覆然後關閉。

single-use="false"時,一個共享連接用於所有請求/回覆 - 並且每個呼叫者都等待該套接字。

您可以使用「CachingClientConnectionFactory」來維護永久連接池 - 請參閱the documentation

如上所述,TCP套接字可以是單次使用(一個請求/響應)或共享的。由於套接字一次只能處理一個請求/響應,所以在高容量環境中,共享套接字在出站網關中表現不佳。

爲了提高性能,用戶可以使用協作通道適配器而不是網關,但這需要應用程序級別的消息關聯。有關更多信息,請參見第31.8節「TCP消息關聯」。

Spring Integration 2.2引入了一個高速緩存客戶端連接工廠,其中使用了一個共享套接字池,允許網關使用共享連接池處理多個併發請求。

即將發佈5.0版本 - 目前處於里程碑7(5.0.0.M7)。有一個Thread Affinity Connection Factory保持一個連接打開每個調用線程。

+0

在客戶端和服務器上刪除超時以及在客戶端設置single-use = false達到了我所期望的。但是,如果服務器重新啓動,我如何保證客戶端會自動連接? – xjava

+0

如果當前連接已關閉,則在發送下一條消息時將自動創建新連接。 –

+0

感謝@加里寶貴的建議。 – xjava