我正在使用Jersey Client v2.16(Dropwizard 0.8.0的传递依赖,我也在使用它)。
当实体被读作InputStream
时,我对某个响应的结束机制感到困惑。 documentation州:
此外,如果实体被读入InputStream(通过response.readEntity(InputStream.class)),则连接将保持打开状态,直到您完成从InputStream读取为止。在这种情况下,应在从InputStream读取结束时手动关闭InputStream或Response。
然而,当我使用Response.readEntity(InputStream.class)
获取响应实体时,我最终得到的是org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream
的一个实例,顾名思义,当{{1}时,它不会释放任何内容正在调用方法(打破close()
合同,我可能会说)。这是InputStream
方法:
close()
因此,我最终在池中的HTTP连接未发布并慢慢填满池。
鉴于可能不容易获得对响应的引用,并且官方文档声明@Override
public void close() throws IOException {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.log(Level.FINE, LocalizationMessages.MBR_TRYING_TO_CLOSE_STREAM(reader.getClass()));
}
}
,我如何设法实际释放物理资源?
答案 0 :(得分:3)
看起来这是Jersey客户端的一个已知错误,根据https://java.net/jira/browse/JERSEY-2878和https://github.com/jersey/jersey/releases/tag/2.21
,它似乎已在2.21中修复