对Jersey StreamingOutput调用flush()无效
我使用的是一款Jersey对Jersey StreamingOutput调用flush()无效,jersey,jax-rs,jersey-2.0,Jersey,Jax Rs,Jersey 2.0,我使用的是一款JerseyStreamingOutput,它在升级到Jersey 2.16之前一直运行良好。事情是这样的。我的StreamingOut在某些情况下生成输出非常缓慢。我确实定期写数据,但我写得很慢,一次只写一点。每次写入任何字节时,我都会调用传递到StreamingOutput.write()的OutputStream上的flush(),但flush()似乎没有效果。在将8K写入输出流之前,不会通过线路发送任何内容。不幸的是,在某些情况下,在编写8K时,客户端已经超时 我下载了一些
StreamingOutput
,它在升级到Jersey 2.16之前一直运行良好。事情是这样的。我的StreamingOut
在某些情况下生成输出非常缓慢。我确实定期写数据,但我写得很慢,一次只写一点。每次写入任何字节时,我都会调用传递到StreamingOutput.write()
的OutputStream上的flush()
,但flush()似乎没有效果。在将8K写入输出流之前,不会通过线路发送任何内容。不幸的是,在某些情况下,在编写8K时,客户端已经超时
我下载了一些jersey源代码,通过一些调试,我看到传递给write()
的OutputStream
是一个UnCloseableOutputStream
,它封装了一个committeingoutstream
committengoutputstream
启用了缓冲,因此在响应提交(完成)之前,flush()本质上是一个no-op
所以,我陷入了困境。如何使用流输出(或直接写入输出流)并在整个响应完成之前强制它通过线路发送字节?有没有其他的方法来处理球衣?我在ResponseBuilder
上找不到执行此操作的任何方法。我找不到任何方法来关闭缓冲。有Jersey属性来设置缓冲区的大小,但是更改它会影响内容长度
标题(如果这对您很重要的话)。您应该阅读酒店的文档
一个整数值,定义用于缓冲服务器端响应实体的缓冲区大小,以确定其大小并设置HTTP“Content Length”标头的值
如果实体大小超过配置的缓冲区大小,则将取消缓冲,并且不会确定实体大小。值小于或等于零时,将完全禁用实体的缓冲
此属性可在服务器端用于覆盖出站消息缓冲区大小值-默认值或使用“jersey.config.contentLength.buffer”全局属性设置的全局自定义值
默认值为8192