使用 Jersey 2.x 客户端,当服务器仍在写入其 OutputStream 时,如何从 InputStream 读取?

Using Jersey 2.x client, how can I read from an InputStream while the server is still writing to its OutputStream?

我们最近从 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 之前),但类似且更常见的问题是下载大文件。泽西 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() 方法挂起,因为服务器从未关闭连接。幸运的是,在我们的例子中,服务器只是在等待 "events" 发送给客户端,但是如果客户端正在下载一个 64 GB 的文件...

原来是服务器端的问题。

在 Jersey 1.x 中,服务器没有缓冲响应(或者我们已经覆盖了该行为并忘记了)。解决方案是将 属性 jersey.config.contentLength.buffer 设置为 0。这阻止了服务器缓冲,并且这个问题中列出的代码无需修改即可工作。