Spring TCP Integration仅每30+秒读取一次

问题描述

使用Spring-Integration制作TCP Server时遇到问题。 我已将服务器设置为接受来自黑匣子客户端的TCP连接。客户端将连接到服务器,并开始定期向其发送字符串数据。

我看到的是建立连接后(我从客户端得到确认),直到大约30秒过去,我才在服务器上收到一条打印语句,在那里我一次收到5条消息。

我已经通过Wireshark监视了传入的数据,并且客户端以固定的时间间隔发送数据,但是服务器没有足够频繁地从incomingStream读取数据。有没有一种方法可以配置Tcpserver,使其更频繁地从传入客户端读取数据?

adapterData.stream().forEach(elt -> elt.setSeasId("kf3-4n34-43"));

解决方法

ByteArrayRawSerializer使用套接字关闭来检测消息的结尾。

TCP是一种流协议,如果要通过套接字发送多个消息,则需要以某种方式对数据进行定界,以便服务器可以确定一条消息何时结束而下一条消息开始。参见the documentation

TCP是流协议。这意味着必须为通过TCP传输的数据提供某种结构,以便接收器可以将数据划分为离散的消息。连接工厂配置为使用序列化器和反序列化器在消息有效负载和通过TCP发送的位之间进行转换。这可以通过分别为入站和出站消息提供解串器和串行器来实现。 Spring Integration提供了许多标准的序列化器和反序列化器。

...

ByteArrayRawSerializer将字节数组转换为字节流,并且不添加其他消息分界数据。使用此序列化程序(和反序列化程序),客户端通过有序关闭套接字来指示消息的结尾。使用此序列化程序时,消息接收将挂起,直到客户端关闭套接字或发生超时。

我的猜测是客户端在发送消息后没有关闭连接,并且有30秒的SO超时(在客户端或服务器上-您未显示连接出厂配置)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...