我正在使用spring-integration,ServerSocketFactory设置为具有合适的接收和写入缓冲区,并且TCPNoDelay设置为false。使用调试器在套接字上正确验证了这一点。
当写入spring-integration串行器中的outputstream时,我看到每个写入调用都是单独发送的,带有TCP PSH(推送)标志 - 即刷新。
为什么会发生这种冲洗?我怎么能避免这个?
答案 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();
}