当我们使用泽西编写REST客户端时,我们应该关闭Response
,如下所示:
Client c = ClientBuilder.newClient();
Response r = null;
try {
r = c.target("http://localhost:8080/testrest/customers/854878").request().get();
Customer cus = r.readEntity(Customer.class);
/* process result */
} catch (Exception e) {
/* log here */
if (r != null) {
r.close();
}
}
当我们直接读取HTTP正文时,我们应该如何访问Response
对象:
Client c = ClientBuilder.newClient();
Customer cus = c.target("http://localhost:8080/testrest/customers/854878").request().get(Customer.class);
/* close Response object and process result */
答案 0 :(得分:2)
假设您使用的是Glassfish的jersey-client
实施版本2.3.1(or check the other versions too),您可以按照get(Class)
进行的调用。在你will find a call to
org.glassfish.jersey.message.internal.InboundMessageContext#readEntity(Class<T>, Type, Annotation[], PropertiesDelegate)
根据一些规则,关闭响应
if (!buffered && !(t instanceof Closeable) && !(t instanceof Source)) {
entityContent.close(); // wrapper to the actual response stream
}
其中t
是基于指定的Class
对象创建的对象。
API本身似乎没有说明这一点,因此实现不必关闭底层响应流。我唯一能找到的是来自Client
javadoc的陈述
客户端实例必须在处理之前正确关闭 避免资源泄漏。
因此,不要依赖于特定的实现,请确保自己关闭所有内容,即使这意味着您必须中断Fluent方法调用并将中间对象引用存储在变量中。
答案 1 :(得分:0)
客户端有一个密切的方法。看看它的来源。如果Client.close没有清理其资源,那么您必须获取对Response的引用并将其关闭。否则你将挂起连接。 如果代码允许你做某事,那并不意味着你应该做。但是从你的问题我收集到你理解它。