5
我读过Jersey documentation,并说一个实体读取(如response.readEntity(SomeObject.class))后,新泽西自动关闭连接Jersey客户端是否关闭异常连接?
但是,当一个异常被抛出,无论是糟糕的请求或套接字超时,Jersey自动关闭连接,还是应该有一个调用client.close()的finally子句?
我读过Jersey documentation,并说一个实体读取(如response.readEntity(SomeObject.class))后,新泽西自动关闭连接Jersey客户端是否关闭异常连接?
但是,当一个异常被抛出,无论是糟糕的请求或套接字超时,Jersey自动关闭连接,还是应该有一个调用client.close()的finally子句?
不可以。如果发生异常,Jersey也不会呼叫client.close()
,JerseyClient也不会执行AutoCloseable。
你可以很容易地测试这个。客户端抛出一个IllegalStateException异常,如果你关闭之后调用一个方法:
Client client = ClientBuilder.newClient();
client.close();
client.target("http://stackoverflow.com").request().get(); // IllegalStateException
但是你可以捕获异常后调用一个方法:
Client client = ClientBuilder.newClient();
try {
client.target("http://foo.bar").request().get(); // java.net.ConnectException: Operation timed out
} catch (Exception ex) {
client.target("http://stackoverflow.com").request().get(); // works
}
所以关闭是你的工作。
更新: JAX-RS 2.1 will use AutoClosables。
谢谢你,lefloh – Jason 2014-09-08 16:52:13
Jersey 1.1x怎么样?我检查了API文档,没有找到close()方法。只有destroy()可用,但不认为它是平等的。 – DerekY 2015-05-08 02:16:19
来自ApiDoc:“销毁客户端,任何与客户端关联的系统资源都将被清除。”所以连接应该关闭。 – lefloh 2015-05-08 05:49:50