2017-10-05 172 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