使用 ApacheHttpClient43Engine RestEasy 客户端 v3.6 时的 getConnectionManager()。3.Final

getConnectionManager() when using ApacheHttpClient43Engine RestEasy client v3.6.3.Final

我将我的 WildFly 服务器从 10 迁移到 16。它现在使用 3.6 版的 resteasy-client。3.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?

提前致谢

您无法在以这种方式构建 HTTP 客户端时获得 RESTEasy 创建的 PoolingHttpClientConnectionManager 实例,原因是 engine.getHttpClient().getConnectionManager() returns 已弃用 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 访问连接管理器

希望对您有所帮助。

您可以按照弃用提示创建自己的 PoolingHttpClientConnectionManager, configure it, keep a reference of it to work with and explicitly set it via setConnectionManager() of HttpClientBuilder to create a HttpClient 实例。

然后通过创建您自己的 ApacheHttpClient43Engine with the appropriate constructor and configure it via httpEngine() of 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();