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