【问题标题】:Java Spring-integration TCP flush controlJava Spring 集成 TCP 刷新控制
【发布时间】:2014-08-28 14:25:14
【问题描述】:

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

在 spring-integration 序列化程序中写入输出流时,我看到每个写入调用都使用 TCP PSH(推送)标志单独发送 - 即刷新。

为什么会发生这种刷新?我怎样才能避免这种情况?

【问题讨论】:

  • 如果您不想过度冲洗,为什么要禁用 Nagle 算法?

标签: java tcp spring-integration


【解决方案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();
}

【讨论】:

猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2021-05-14
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多