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

时间:2015-12-01 21:53:25

标签: jersey jax-rs jersey-2.0

我正在使用泽西StreamingOutput一直工作得很好,直到我们升级到泽西岛2.16。这就是事情。在某些情况下,我的StreamingOuput产生的输出非常缓慢。我经常写数据,但我写的很慢,一次只是一点点。每次写入任何字节时,我都会在flush()上调用OutputStream传递给StreamingOutput.write(),但flush()似乎没有效果。在将{8}写入OutputStream之前,没有任何内容通过线路发送。不幸的是,在某些情况下,当写入8K时,客户端已超时。

我下载了一些针对泽西源的内容,通过一些调试,我发现传递给OutputStream的{​​{1}}是一个write(),其中包含UnCloseableOutputStream

CommittingOutputStream启用了缓冲,因此在提交响应(完成)之前,flush()基本上是无操作。

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

1 个答案:

答案 0 :(得分:3)

Jersey属性ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER用于设置缓冲区的大小,但更改它会影响Content-Length标题(如果这对您很重要)。您应该阅读该物业的文档。

  

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

     

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

     

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

     

默认值为8192.