【发布时间】:2017-03-13 18:00:21
【问题描述】:
我有一个使用 JAX-WS 的项目,实现是 RESTEasy。我知道 http 连接是一种昂贵的资源,而且我们的网络服务流量很大。所以我尝试重用连接并提升性能。
以下是我的客户端代码,我将池大小设置为 20。
public abstract class BaseService{
protected static ResteasyClientBuilder clientBuilder = new ResteasyClientBuilder();
static {
clientBuilder.connectionPoolSize( 20 )
.establishConnectionTimeout(5000, TimeUnit.MILLISECONDS)
.socketTimeout(5000, TimeUnit.MILLISECONDS);
}
public Client getClient() {
Client client = clientBuilder.build();
...
return client;
}
}
一个示例服务类
public class MyService extends BaseService implements IMyService {
public Something getSomething(long id){
return getClient().target(uri).path("getSomethingById")
.queryParam("id", id)
.request().get(Something.class);
}
}
首先,RESTEasy 似乎并没有真正汇集连接并重用它们。我使用netstat监控连接数,无论我为connectionPoolSize设置多少个数,实际连接数总是超过这个数。
RESTEasy 中的网络通信由 Apache HttpClient 处理,它支持通过 PoolingHttpClientConnectionManager 进行池连接。所以我的问题是有没有办法让 RESTEasy 客户端真正利用池?
另外一个非常烦人的问题是,有时由于无法分配连接而导致 Web 服务调用失败,尤其是在访问量很大的情况下。
javax.ws.rs.ProcessingException: Unable to invoke request
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:287)
由于空间限制,日志中的异常堆栈跟踪被截断,但我认为该错误是由 IllegalStateException: Invalid use of BasicClientConnManager: connection still assigned 引起的。我知道当多线程共享 javax.ws.rs.client.Client 对象时可能会发生错误,但这不适用于我的情况。怎么会这样?解决办法是什么?
提前致谢。
【问题讨论】:
标签: web-services jax-ws connection-pooling resteasy