我正在使用Jersey Client v2.16(Dropwizard 0.8.0的传递依赖,我也在使用它).
当实体被读作InputStream时,我对某个响应的关闭机制感到困惑. documentation声明:
Also if the entity is read into an InputStream (by response.readEntity(InputStream.class)),the connection stays open until you finish reading from the InputStream. In that case,the InputStream or the Response should be closed manually at the end of reading from InputStream.
但是,当我使用Response.readEntity(InputStream.class)获取响应实体时,我最终得到的是org.glassfish.jersey.message.internal.ReaderInterceptorExecutor $UnCloseableInputStream的实例,顾名思义,它不会释放当调用close()方法时,它下面的任何东西(我可能会说,打破了InputStream契约).这是close()方法:
@Override
public void close() throws IOException {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.log(Level.FINE,LocalizationMessages.MBR_TRYING_TO_CLOSE_STREAM(reader.getClass()));
}
}
因此,我最终在我的池中的HTTP连接未发布并慢慢填充池.
鉴于可能不容易获得对响应的引用,并且官方文档声明InputStream **或**应该手动关闭Response,我如何设法实际释放物理资源?
最佳答案
看起来这是泽西客户端的已知错误,根据https://java.net/jira/browse/JERSEY-2878和https://github.com/jersey/jersey/releases/tag/2.21,它似乎在2.21中修复