提问者:小点点

如何验证PoolingHttpClientConnectionManager是否应用于泽西客户端


下面是我使用的泽西客户端连池的代码片段。

ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ClientProperties.CONNECT_TIMEOUT, defaultConnectTimeout);
clientConfig.property(ClientProperties.READ_TIMEOUT, defaultReadTimeout);
        
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(50);
cm.setDefaultMaxPerRoute(5);
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, cm);

clientConfig.connectorProvider(new ApacheConnectorProvider());

如何验证我的客户端是否正在使用连池?poolStats. get可用()计数是否有效?在我的例子中,当我测试客户端时,此可用计数为1。


共1个答案

匿名用户

是的,计数可以为1,但要确认您可以尝试以下步骤。

  1. 您可以首先添加一个在后台继续运行的线程,并以一定的间隔打印poolstats的现有状态,例如每60秒。您可以使用以下逻辑。确保您在以下逻辑代码中引用相同的PoolingHttpClientConnectionManager对象实例作为后台线程的一部分运行。
  2. 然后,尝试继续调用内部使用上述jersey客户端调用外部服务的逻辑(可能在for循环中)
  3. 您应该会看到打印出不同的日志(在您的线程逻辑中),这将确认jersey客户端实际上正在使用池化配置。

逻辑:

PoolStats poolStats = cm.getTotalStats();
        Set<HttpRoute> routes = cm.getRoutes();
        if(CollectionUtils.isNotEmpty(routes)) {
            for (HttpRoute route : routes) {
                PoolStats routeStats = poolingHttpClientConnectionManager.getStats(route);
                int routeAvailable = routeStats.getAvailable();
                int routeLeased = routeStats.getLeased();
                int routeIdle = (routeAvailable - routeLeased);
                log.info("Pool Stats for Route - Host = {}, Available = {} , Leased = {}, Idle = {}, Pending = {}, Max = {} " ,
                        route.getTargetHost(), routeAvailable, routeLeased, routeIdle, poolStats.getPending(), poolStats.getMax());
            }
        }

        int available = poolStats.getAvailable();
        int leased = poolStats.getLeased();
        int idle = (available - leased);
        log.info("Pool Stats - Available = {} , Leased = {}, Idle = {}, Pending = {}, Max = {} " ,
                available, leased, idle, poolStats.getPending(), poolStats.getMax());