此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
TCP 网关
入站 TCP 网关TcpInboundGateway
和出站 TCP 网关TcpOutboundGateway
分别使用服务器和客户端连接工厂。
每个连接一次可以处理一个请求或响应。
入站网关在构造包含传入有效负载的消息并将其发送到requestChannel
,等待响应并通过将响应消息写入连接来发送响应消息中的有效负载。
对于入站网关,您必须保留或填充ip_connectionId 标头,因为它用于将消息与连接相关联。
源自网关的邮件会自动设置标头。
如果回复构造为新消息,则需要设置标头。
可以从传入消息中捕获标头值。 |
与入站适配器一样,入站网关通常使用type="server"
连接工厂,它监听传入的连接请求。
在某些情况下,您可能希望反向建立连接,以便入站网关连接到外部服务器,然后等待并回复该连接上的入站消息。
此拓扑通过使用client-mode="true"
在入站网关上。
在这种情况下,连接工厂的类型必须是client
并且必须有single-use
设置为false
.
另外两个属性支持此机制。
这retry-interval
指定(以毫秒为单位)框架在连接失败后尝试重新连接的频率。
这scheduler
供应TaskScheduler
以安排连接尝试并测试连接是否仍然处于活动状态。
如果网关已启动,您可以通过发送<control-bus/>
命令:@adapter_id.retryConnection()
并检查当前状态@adapter_id.isClientModeConnected()
.
出站网关通过连接发送消息后,等待响应,构造响应消息,并将其放在回复通道上。 通过连接进行的通信是单线程的。 一次只能处理一条消息。 如果另一个线程在收到当前响应之前尝试发送消息,它会阻塞,直到任何以前的请求完成(或超时)。 但是,如果将客户机连接工厂配置为一次性连接,则每个新请求都会获得自己的连接并立即处理。 以下示例配置入站 TCP 网关:
<int-ip:tcp-inbound-gateway id="inGateway"
request-channel="tcpChannel"
reply-channel="replyChannel"
connection-factory="cfServer"
reply-timeout="10000"/>
如果使用配置了缺省序列化程序或反序列化程序的连接工厂,则消息为\r\n
分隔数据和网关可以由简单的客户端(如 telnet)使用。
以下示例显示了出站 TCP 网关:
<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="tcpChannel"
reply-channel="replyChannel"
connection-factory="cfClient"
request-timeout="10000"
remote-timeout="10000"/> <!-- or e.g. remote-timeout-expression="headers['timeout']" -->
这client-mode
当前不适用于出站网关。
从版本 5.2 开始,可以使用属性closeStreamAfterSend
.
如果连接工厂配置为single-use
(每个请求/回复的新连接)网关将关闭输出流;这会向服务器发出 EOF 信号。
如果服务器使用 EOF 来确定消息的结尾,而不是流中的某个分隔符,但保持连接打开以接收回复,这将很有用。
通常,调用线程会阻塞在网关中,等待回复(或超时)。
从 5.3 版开始,您可以将async
网关上的属性,并且释放发送线程以执行其他工作。
回复(或错误)将在接收线程上发送。
这仅适用于使用TcpNetClientConnectionFactory
,在使用 NIO 时将其忽略,因为存在竞争条件,即在回复之前,接收回复后发生的套接字错误可能会传递给网关。
使用共享连接时 (singleUse=false ),当另一个请求正在处理时,将阻止一个新请求,直到收到当前回复。
考虑使用CachingClientConnectionFactory 如果您希望支持长期连接池上的并发请求。 |
从版本 5.4 开始,可以配置入站unsolicitedMessageChannel
.
未经请求的入站消息将发送到此通道,以及延迟回复(客户端超时)。
为了在服务器端支持这一点,您现在可以注册多个TcpSender
s 与连接工厂。
网关和通道适配器会自动注册。
从服务器发送未经请求的消息时,必须添加适当的IpHeaders.CONNECTION_ID
发送的消息。