如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

TCP 网关

入站 TCP 网关 TcpInboundGateway 和出站 TCP 网关 TcpOutboundGateway 分别使用服务器和客户端连接工厂。 每个连接一次只能处理一个请求或响应。spring-doc.cadn.net.cn

入站网关在根据传入的有效负载构建消息并将其发送到requestChannel后,会等待响应,并通过将响应消息中的有效负载写入连接来发送该有效负载。spring-doc.cadn.net.cn

对于入站网关,您必须保留或填充ip_connectionId头,因为它用于将消息与连接关联起来。 源自网关的消息会自动设置该头。 如果回复是作为新消息构建的,则需要设置该头。 头的值可以从传入的消息中捕获。

与入站适配器一样,入站网关通常使用一个type="server"连接工厂来监听传入的连接请求。 在某些情况下,您可能希望以相反的方式建立连接,即入站网关连接到外部服务器,然后在该连接上等待并响应传入的消息。spring-doc.cadn.net.cn

此拓扑通过在使用入站网关时配置 client-mode="true" 来支持。 在此情况下,连接工厂必须是 client 类型,并且必须将 single-use 设置为 falsespring-doc.cadn.net.cn

两个额外的属性支持此机制。 retry-interval 指定(以毫秒为单位)框架在连接失败后尝试重新连接的频率。 scheduler 提供一个 TaskScheduler 来调度连接尝试并测试连接是否仍然活跃。spring-doc.cadn.net.cn

如果网关已启动,您可以通过发送 <control-bus/> 命令强制网关建立连接:@adapter_id.retryConnection(),并使用 @adapter_id.isClientModeConnected() 检查当前状态。spring-doc.cadn.net.cn

出站网关在通过连接发送消息后,会等待响应、构造响应消息并将其放入回复通道。 连接上的通信是单线程的。 同一时间只能处理一条消息。 如果另一个线程在当前响应接收完成前尝试发送消息,它将阻塞,直到所有先前的请求完成(或超时)。 然而,如果客户端连接工厂配置为使用单次连接,则每个新请求都会获得自己的连接并立即被处理。 以下示例配置了一个入站 TCP 网关:spring-doc.cadn.net.cn

<int-ip:tcp-inbound-gateway id="inGateway"
    request-channel="tcpChannel"
    reply-channel="replyChannel"
    connection-factory="cfServer"
    reply-timeout="10000"/>

如果使用了使用默认序列化器或反序列化器配置的连接工厂,则消息为\r\n分隔的数据,并且网关可以通过简单的客户端(如 telnet)使用。spring-doc.cadn.net.cn

以下示例展示了一个出站 TCP 网关:spring-doc.cadn.net.cn

<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 当前不支持出站网关。spring-doc.cadn.net.cn

从 5.2 版本开始,出站网关可以使用属性 closeStreamAfterSend 进行配置。 如果连接工厂被配置为 single-use(每个请求/回复建立新连接),则网关将关闭输出流;这会向服务器发送 EOF 信号。 这在服务器使用 EOF 来确定消息结束(而不是在流中使用某些分隔符)时非常有用,同时保持连接打开以接收回复。spring-doc.cadn.net.cn

通常情况下,调用线程会在网关处阻塞,等待回复(或超时)。 从 5.3 版本开始,您可以在网关上设置 async 属性,发送线程将被释放以执行其他工作。 回复(或错误)将在接收线程上发送。 这仅在使用 TcpNetClientConnectionFactory 时适用;使用 NIO 时会忽略此设置,因为存在竞态条件:在接收到回复后发生的套接字错误可能会在回复之前被传递给网关。spring-doc.cadn.net.cn

当使用共享连接(singleUse=false)时,如果另一个请求正在处理中,新请求将被阻塞,直到收到当前响应。 如果您希望在长连接池中支持并发请求,请考虑使用 CachingClientConnectionFactory

从 5.4 版本开始,入站通道可以使用 unsolicitedMessageChannel 进行配置。 未请求的入站消息将发送到该通道,包括超时后的延迟回复(即客户端超时的情况)。 为了在服务端支持此功能,您现在可以在连接工厂中注册多个 TcpSender。 网关和通道适配器会自动注册自身。 当从服务端发送未请求的消息时,必须为发送的消息添加适当的 IpHeaders.CONNECTION_IDspring-doc.cadn.net.cn