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

时间:2015-08-06 20:12:38

标签: java jersey-2.0 jersey-client

我们最近从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文件......

1 个答案:

答案 0 :(得分:0)

原来问题出在服务器端。

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