2013-05-02 150 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