Spring Integration中TCP入站网关自定义Serializer未触发问题
问题分析与解决
核心原因
你的自定义TestDeserializer中手动调用了inputStream.close();,这会直接关闭TCP连接的输入流,进而导致整个socket连接被终止。Spring Integration的TCP入站网关需要通过同一个连接发送响应,连接提前断开后,响应无法发送,因此配置的TestSerializer完全没有被触发的机会。
另外,TestDeserializer还存在逻辑bug:初始化时先执行了一次characterReceived = inputStream.read();,但未将该字符加入parsedMessage,会导致消息的第一个字符丢失。
解决方案
移除手动关闭输入流的代码
删除TestDeserializer中的inputStream.close();语句,Spring Integration会自行管理TCP连接和流的生命周期,手动关闭会破坏连接的正常交互流程。修正Deserializer的字符读取逻辑
调整代码避免丢失第一个字符,并处理流意外结束的情况:public class TestDeserializer implements Deserializer<String>{ private static final char END_OF_BLOCK = '\u001c'; @Override public String deserialize(InputStream inputStream) throws IOException { boolean end_of_message = false; int characterReceived; StringBuffer parsedMessage = new StringBuffer(); while (!end_of_message) { characterReceived = inputStream.read(); if (characterReceived == -1) { // 处理流提前结束的异常情况 end_of_message = true; break; } if (characterReceived == END_OF_BLOCK) { end_of_message = true; } else { parsedMessage.append((char) characterReceived); } } return parsedMessage.toString(); } }确认handle方法的返回值
检查outboundService.processAndSendMessage方法,确保它返回非null的String类型数据。如果方法返回null,TCP入站网关不会发送响应,TestSerializer同样不会被调用。
验证
完成修改后重启服务测试:
- 发送包含
\u001c结束符的消息,确认Deserializer能正确解析完整内容 - 查看控制台输出,
TestSerializer中的打印语句应正常输出,说明序列化逻辑已被触发
内容的提问来源于stack exchange,提问作者Piratheepan
相关产品推荐
相关产品推荐

