You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Spring Integration实现同步TCP网关调用挂起无响应问题

问题根源

你当前的配置没有将TCP服务端返回的响应消息路由回@MessagingGateway对应的回复通道,网关会一直等待返回结果,所以触发挂起。你目前将接收通道的消息直接做了日志处理,没有关联请求的回复通道,也没有实现请求与响应的绑定逻辑。

修复方案

方案一(推荐):使用TcpOutboundGateway简化配置

Spring Integration 提供的TcpOutboundGateway原生支持TCP请求响应的同步绑定,自动处理请求与响应的关联,无需单独配置发送handler和接收适配器。

  1. 移除原有配置中的TcpSendingMessageHandler、TcpReceivingChannelAdapter、incomingClient、outgoingClient四个Bean
  2. 新增如下集成流配置:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:24:05