基于Spring Integration实现同步TCP网关调用挂起无响应问题
问题根源
你当前的配置没有将TCP服务端返回的响应消息路由回@MessagingGateway对应的回复通道,网关会一直等待返回结果,所以触发挂起。你目前将接收通道的消息直接做了日志处理,没有关联请求的回复通道,也没有实现请求与响应的绑定逻辑。
修复方案
方案一(推荐):使用TcpOutboundGateway简化配置
Spring Integration 提供的TcpOutboundGateway原生支持TCP请求响应的同步绑定,自动处理请求与响应的关联,无需单独配置发送handler和接收适配器。
- 移除原有配置中的
TcpSendingMessageHandler、TcpReceivingChannelAdapter、incomingClient、outgoingClient四个Bean - 新增如下集成流配置:
@Bean public IntegrationFlow tcpClientSyncFlow(AbstractClientConnectionFactory clientConnectionFactory, TcpServerEndpoint tcpServerEndpoint) { return IntegrationFlows.from("outboundChannel") // 用TCP出站网关自动处理请求发送、响应接收和关联 .handle(Tcp.outboundGateway(clientConnectionFactory)) // 保留你原有的响应处理逻辑 .handle(message -> { byte[] payload = (byte[]) message.getPayload(); LOGGER.info("RECEIVING ON CLIENT: {}", tcpServerEndpoint.processMessage(payload)); // 处理后的结果直接返回给网关 return payload; }) .get(); }
方案二:手动配置请求响应关联
如果要保留现有分离的发送、接收配置,需要在请求头中存储关联ID,接收响应后将消息路由到对应请求的回复通道,实现复杂度更高,不推荐。
额外注意事项
- 确认你使用的
Bytearraylengthheaderserializer(2)序列化规则和服务端完全对齐:服务端返回的消息必须同样携带2字节的消息长度头,否则反序列化会失败,无法触发响应回调 - 可以给网关方法添加超时配置,避免无限制挂起:
@Gateway(requestChannel="outboundChannel", replyTimeout = 5000) byte[] sendByClient(byte[] message);
- 你当前配置的
singleUse=false是长连接模式,TcpOutboundGateway原生支持长连接下的请求响应匹配,无需额外处理。
内容的提问来源于stack exchange,提问作者Luca Godano
相关产品推荐
相关产品推荐

