2014-09-04 124 views
5

我读过Jersey documentation,并说一个实体读取(如response.readEntity(SomeObject.class))后,新泽西自动关闭连接Jersey客户端是否关闭异常连接?

但是,当一个异常被抛出,无论是糟糕的请求或套接字超时,Jersey自动关闭连接,还是应该有一个调用client.close()的finally子句?

回答

5

不可以。如果发生异常,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

+0

谢谢你,lefloh – Jason 2014-09-08 16:52:13

+0

Jersey 1.1x怎么样?我检查了API文档,没有找到close()方法。只有destroy()可用,但不认为它是平等的。 – DerekY 2015-05-08 02:16:19

+0

来自ApiDoc:“销毁客户端,任何与客户端关联的系统资源都将被清除。”所以连接应该关闭。 – lefloh 2015-05-08 05:49:50

相关问题