我们最近从Jersey 1.x升级到2.x,大部分迁移进展顺利。但有一个障碍。
在1.x中,以下代码可让我们在服务器仍在写入各自的OutputStream时抓取InputStream:
final ClientResponse response = webResource
.accept(acceptHeader)
.get(ClientResponse.class);
final InputStream stream = response.getEntity(InputStream.class);
/* Process the stream, waiting if necessary */
我们将此作为一种服务器发送事件(在我们发现sse之前),但类似且更常见的问题是下载大文件。 Jersey 2.x代码如下:
final Response response = webTarget
.request()
.accept(acceptHeader)
.get(); /* debug shows this call hanging */
final InputStream stream = response.getEntity(InputStream.class);
/* Process the stream, waiting if necessary */
get()方法挂起,因为服务器永远不会关闭连接。幸运的是,在我们的例子中,服务器只是等待“事件”发送到客户端,但如果客户端正在下载说64 GB文件......
答案 0 :(得分:0)
原来问题出在服务器端。
在Jersey 1.x中,服务器没有缓冲响应(或者我们已经覆盖了这种行为并且忘记了)。解决方案是将属性jersey.config.contentLength.buffer
设置为0
。这阻止了服务器缓冲,并且此问题中列出的代码无需修改即可运行。