我有一个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" />
答案 0 :(得分:1)
在客户端单独使用意味着 - 每个套接字用于一个请求/回复然后关闭。
当single-use="false"
时,一个共享连接用于所有请求/回复 - 并且每个调用者阻塞等待套接字。
您可以使用&#39; CachingClientConnectionFactory`来维护永久连接池 - 请参阅the documentation。
如上所述,TCP套接字可以是单次使用(一个请求/响应)或共享。在高容量环境中,共享套接字与出站网关的性能不佳,因为套接字一次只能处理一个请求/响应。
为了提高性能,用户可以使用协作通道适配器而不是网关,但这需要应用程序级消息关联。有关更多信息,请参见第31.8节“TCP消息关联”。
Spring Integration 2.2引入了一个缓存客户端连接工厂,其中使用了一个共享套接字池,允许网关使用共享连接池处理多个并发请求。
即将推出的5.0版本 - 目前处于里程碑7(5.0.0.M7)。有Thread Affinity Connection Factory可以保持每个调用线程的连接打开。