在Jersey StreamingOutput上调用flush()没有任何效果

use*_*845 6 jax-rs jersey jersey-2.0

我正在使用一个StreamingOutput工作正常的泽西,直到我们升级到泽西岛2.16.这就是事情.StreamingOuput在某些情况下,我的输出速度非常慢.我经常写数据,但我写的很慢,一次只是一点点.我叫flush()OutputStream传递给StreamingOutput.write()每一个我写任何字节的时间,但冲洗()似乎没有任何效果.在写入8K之前,没有任何东西通过电线发送OutputStream.不幸的是,在某些情况下,到写入8K时,客户端已超时.

我下载了一些球衣源并通过一些调试,我看到OutputStream传递到的write()是一个UnCloseableOutputStream包装CommittingOutputStream.

CommittingOutputStream启用了缓冲,因此在冲洗()本质上是一个无操作直到响应被提交(完成).

所以,我在泡菜中.如何StreamingOutput在整个响应完成之前使用(或以其他方式直接写入输出流)并强制它通过线路发送字节?还有其他方法可以用泽西这样做吗?我找不到任何方法ResponseBuilder来做到这一点.我找不到任何关闭缓冲的方法.

Pau*_*tha 5

Jersey 属性可以ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER设置缓冲区的大小,但更改它会对Content-Length标头产生影响(如果这对您来说很重要)。您应该阅读有关该属性的文档。

一个整数值,定义用于缓冲服务器端响应实体的缓冲区大小,以确定其大小并设置 HTTP“Content-Length”标头的值。

如果实体大小超过配置的缓冲区大小,则缓冲将被取消,并且实体大小将无法确定。小于或等于零的值将完全禁用实体的缓冲。

此属性可在服务器端用于覆盖出站消息缓冲区大小值 - 默认值或使用“jersey.config.contentLength.buffer”全局属性设置的全局自定义值。

默认值为 8192。