Java Spring集成TCP刷新控制

时间:2014-08-28 14:25:14

标签: java tcp spring-integration

我正在使用spring-integration,ServerSocketFactory设置为具有合适的接收和写入缓冲区,并且TCPNoDelay设置为false。使用调试器在套接字上正确验证了这一点。

当写入spring-integration串行器中的outputstream时,我看到每个写入调用都是单独发送的,带有TCP PSH(推送)标志 - 即刷新。

为什么会发生这种冲洗?我怎么能避免这个?

1 个答案:

答案 0 :(得分:1)

您需要自定义序列化程序 - 它们通常在写入所有部分后刷新(例如长度标题+有效负载;有效负载+ CRLF; STX +有效负载+ ETX等等)。

只需将您选择的序列化程序子类化,并覆盖serialize()方法即可删除flush()。将其注入连接工厂。

编辑:

哦,我明白了--Nagle的算法仅适用于后续写入(注意有效载荷和ETX在单个数据包中)。我们需要将流包装在缓冲的输出流中。请打开JIRA issue

与此同时,你可以用这样的东西解决它......

/**
 * Writes the byte[] to the stream, prefixed by an ASCII STX character and
 * terminated with an ASCII ETX character.
 */
@Override
public void serialize(byte[] bytes, OutputStream outputStream) throws IOException {
    BufferedOutputStream bos = new BufferedOutputStream(outputStream);
    bos.write(STX);
    bos.write(bytes);
    bos.write(ETX);
    bos.flush();
}