使用 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
。这阻止了服务器缓冲,并且这个问题中列出的代码无需修改即可工作。
我们最近从 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
。这阻止了服务器缓冲,并且这个问题中列出的代码无需修改即可工作。