【问题标题】:RESTEasy client connection pool is not pooling and "unable to invoke" occasionallyRESTEasy 客户端连接池不入池,偶尔“无法调用”
【发布时间】: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


    【解决方案1】:

    如果服务器(或代理)请求使用"Connection: close" 响应标头关闭它们,则不会重用连接。 haproxy 曾经在 1.5 之前这样做,除非使用了 option http-keep-alive。有时甚至被动关闭 (option httpclose) 也会在 haproxy 配置中显式使用以实现负载平衡,例如这里的 How to configure HAProxy to send GET and POST HTTP requests to two different application servers

    【讨论】:

      猜你喜欢
      • 2017-08-04
      • 2012-05-22
      • 2017-12-24
      • 1970-01-01
      • 2012-06-13
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多