2013-05-02 171 views
3

我發現一個情況是resteasy沒有關閉連接。有沒有解決的辦法?我創建了我的客戶如:Resteasy客戶端不關閉連接

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(); 
HttpClient httpClient = new DefaultHttpClient(cm); 
ClientExecutor executor = new ApacheHttpClient4Executor(httpClient); 
T proxiedService = org.jboss.resteasy.client.ProxyFactory.create(clazz, base, executor); 

我呼籲服務

@DELETE 
@Path("{id}") 
Response deleteObject(@PathParam("id") Long id); 

以下方法和服務是返回上什麼,我缺少

HTTP/1.1 500 Internal Server Error [Content-Length: 0, Server: Jetty(8.1.2.v20120308)] 

任何想法讓連接關閉。注意:對於所有其他響應類型,連接正在關閉。

我知道如果我不退還500,一切都會很好。但是,如果這種情況偶然發生,我希望我的客戶能夠處理它,而不會連接不足。

回答

2

我假設下面的方法所屬的RestEasy的客戶端的代理接口(?):

Response deleteObject(@PathParam("id") Long id); 

如果是這樣,這裏的問題是,你的方法返回RestEasy的ClientResponse對象(這是RestEasy的實施的jax-rs響應)。當您的方法返回ClientResponse時,您承擔釋放連接的責任。

就你而言,你也依賴於代理工廠,所以它可能無法釋放連接。在這種情況下,你應該改變你的方法的簽名返回void或者您在HTTP響應主體預期的對象類型:

@DELETE 
@Path("{id}") 
void deleteObject(@PathParam("id") Long id); 

,或者如果您預期的Foo對象回:

@DELETE 
@Path("{id}") 
Foo deleteObject(@PathParam("id") Long id); 

有關更多信息,請參閱resteasy Transport Layer documentation