Resteasy客户端未关闭连接。

4

我发现了一个情况,即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,一切都会很顺利。但是如果意外发生这种情况,我希望我的客户端能够处理它,而不会耗尽连接。

1个回答

5
我假设下列方法属于resteasy客户端代理接口(?):
Response deleteObject(@PathParam("id") Long id);

如果是这样,问题就在于您的方法返回resteasy ClientResponse对象(这是jax-rs Response的resteasy实现)。当您的方法返回ClientResponse时,您需要负责释放连接。

在您的情况下,您还依赖于代理工厂,因此可能无法释放连接。在这种情况下,您应该更改方法签名,以返回void或您在HTTP响应正文中期望的对象类型:

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

如果您期望得到Foo对象,则需要:
@DELETE
@Path("{id}")
Foo deleteObject(@PathParam("id") Long id);

请参阅resteasy的传输层文档以获取更多信息。(点击此处进入)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接