2014-09-04 125 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

相關問題