【问题标题】:getConnectionManager() when using ApacheHttpClient43Engine RestEasy client v3.6.3.Final使用 ApacheHttpClient43Engine RestEasy 客户端 v3.6.3.Final 时的 getConnectionManager()
【发布时间】:2019-11-18 15:31:06
【问题描述】:

我将 WildFly 服务器从 10 迁移到 16。它现在使用版本 3.6.3 的 resteasy-client。Final 使用版本 4.5.4 的 http-client。问题是当我从构建器创建 restEasyClient 时,我无法在内部创建连接管理器,如下所示:

this.resteasyClient = new ResteasyClientBuilder()
                .connectionPoolSize(DEFAULT_POOL_SIZE)
                .maxPooledPerRoute(DEFAULT_POOL_SIZE)
                .build();

如何从 ApacheHttpClient43Engine 引擎获取连接管理器?我的最终目标是从经理那里获得 PoolStats,在我的情况下应该是 PoolingHttpClientConnectionManager [PoolingHttpClientConnectionManager#getTotalStats]。

我用来获取连接管理器的代码如下:

ApacheHttpClient43Engine engine = (ApacheHttpClient43Engine) resteasyClient.httpEngine();
ClientConnectionManager cm = engine.getHttpClient().getConnectionManager();

此方法 getConnectionManager() 已弃用,并且不会获取 HttpClientConnectionManager。

如何从我的 restEasyClient 获取 PoolStats?

提前致谢

【问题讨论】:

    标签: java httpclient resteasy apache-httpclient-4.x


    【解决方案1】:

    以这种方式构建 HTTP 客户端时,您无法获取 RESTEasy 创建的 PoolingHttpClientConnectionManager 实例,原因是 engine.getHttpClient().getConnectionManager() 返回不推荐使用的 ClientConnectionManager 接口的不同实现。

    相反,你可以做的是:

    1. 创建您自己的org.jboss.resteasy.client.jaxrs.ClientHttpEngineBuilder 接口实现,扩展org.jboss.resteasy.client.jaxrs.ClientHttpEngineBuilder43 并覆盖createEngine(..) 方法:您只需委托给super.createEngine(..),但您可以存储传递的HttpClientConnectionManager 实例作为第一个参数,应该是您要查找的参数。
    2. 然后您可以使用您新的自定义 ClientHttpEngineBuilder 来创建 ClientHttpEngine,以便在创建客户端时提供:

    ResteasyClientBuilder builder = new ResteasyClientBuilder(); ClientHttpEngine customClientHttpEngine = newCustomClientHttpEngineBuilder().resteasyClientBuilder(builder).build(); this.resteasyClient = builder .httpEngine(customClientHttpEngine) .connectionPoolSize(DEFAULT_POOL_SIZE) .maxPooledPerRoute(DEFAULT_POOL_SIZE) .build();

    1. 稍后,您可以从自定义 ClientHttpEngineBuilder 访问连接管理器

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您可以创建自己的PoolingHttpClientConnectionManager 实例,对其进行配置,保留它的引用以使用它并通过HttpClientBuilder 的setConnectionManager() 显式设置它以创建HttpClient,如弃用中所暗示的那样。

      之后只需通过使用适当的constructor 创建您自己的ApacheHttpClient43Engine 并通过httpEngine() 或ResteasyClientBuilder 配置它来指示RESTEasy 使用该HttpClient 实例。

      PoolingHttpClientConnectionManager connectionManager =
        new PoolingHttpClientConnectionManager();
      connectionManager.setMaxTotal(DEFAULT_POOL_SIZE);
      connectionManager.setDefaultMaxPerRoute(DEFAULT_POOL_SIZE);
      HttpClient httpClient = HttpClientBuilder
        .create()
        .setConnectionManager(connectionManager)
        .build();
      
      ApacheHttpClient43Engine engine = new ApacheHttpClient43Engine(httpClient);
      ResteasyClient resteasyClient = new ResteasyClientBuilder()
        .httpEngine(engine)
        .build();
      
      connectionManager.getTotalStats();
      

      【讨论】:

      • 感谢您的回复。但是当我使用自定义引擎时,ResteasyClientBuilder的以下代码不起作用:.connectionPoolSize(DEFAULT_POOL_SIZE) .maxPooledPerRoute(DEFAULT_POOL_SIZE)通过查看ClientHttpEngineBuilder43类的源代码,我认为我需要设置的maxTotal和maxPerRoute池化HttpClientConnectionManager
      • @FaizaAslam 你完全正确。我没有测试代码。构建器属性仅应用于内部创建的引擎及其依赖项。如您所见,您必须直接配置连接管理器。我会更新我的anwser。不过,我希望您了解如何自定义整个 RESTEasy 客户端实例。
      猜你喜欢
      • 2017-09-23
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多