On Tue, 2016-02-23 at 01:11 +0000, Pete Keyes wrote: > version: 4.4.1 > App Server: TomEE7 > > We use PoolingHttpClientConnectionManager with the following defaults: > > * max total connections: 100,000 > * default max per route: 50 > > we create the HttpClient and PoolingHttpClientConnectionManager as static > singletons at container startup. > private static Thread globalConnManagerThread; > private static CloseableHttpClient globalHttpClient; > static { > // create global pooling connection manager > globalConnManagerPool = new PoolingHttpClientConnectionManager( > registry > ); > globalConnManagerPool.setDefaultMaxPerRoute(50); > globalConnManagerPool.setMaxTotal(100000); > > // create global HttpClient instance > final HttpClientBuilder builder = HttpClients.custom() > .setConnectionManager(globalConnManagerPool) > .setConnectionManagerShared(true) > .setConnectionTimeToLive(5, TimeUnit.MINUTES) > .setDefaultConnectionConfig(connConfig) > .setDefaultRequestConfig(requestConfig) > .setMaxConnPerRoute(50) // <<== default per route is 50 > .setDefaultSocketConfig(socketConfig) > .setMaxConnTotal(100000) > .setRetryHandler(httpRetryHandler) > .useSystemProperties() > ;
Please note that connection level parameters will have no effect when the connection manager is explicitly set. Please have a look at Javadocs. > CloseableHttpClient globalHttpClient = builder.build(); > } > > We set the max per specific route with the following code snippet: > > @PostConstruct public void init() { > List<URL> allUrls = getAllUrls(); > for(final URL url : allUrls) { > HttpServiceConfig hsc = getHttpServiceConfig(url); > > final String host = url.getHost(); > final int portNo = url.getPort() == -1 ? url.getDefaultPort() : > url.getPort(); > final String protocol = url.getProtocol(); > final HttpHost httpHost = new HttpHost(host, portNo, protocol); > final HttpRoute httpRoute = new HttpRoute(httpHost); > globalConnManagerPool.setMaxPerRoute(httpRoute, 200); // <<== max > set to 200 for route > log.info(gMarker, "set route max-conns:" > + "; max-allowed=" + hsc.getMaxConns() > + "; protocol-host-port=" + protocol + "://" + host + ":" + portNo > + "; httpRoute=" + String.valueOf(httpRoute) > ); > } > } > > > we see each route specific max connection log message at startup. for > instance: > set route max-conns: conns-max=200; protocol-host-port=https://some-host:443; > httpRoute={}->https://some-host:443 > > we have a background thread that monitors the apache-hc connection pool > statistics and emits log messages. we see the following apache-hc connection > manager pool “route specific” statistics logged: > private void logPoolStats() { > Set<HttpRoute> routes = globalConnManagerPool.getRoutes(); > for(final HttpRoute r : routes) { > final PoolStats ps = cm.getStats(r); > final int available = ps.getAvailable(); > final int active = ps.getLeased(); > final int limit = ps.getMax(); > final int blocking = ps.getPending(); > > String s = "emit statistic:" > + " type=hc-conn-pool" > + "; route=" + hostname > + "; available=" + available > + "; active=" + active > + "; blocking=" + blocking > + "; max-allowed=" + limit > + "; server-nm=" + Helpers.getLocalHost() + ":" + > Helpers.getServerHttpsPort() > ; > log.info(marker, s); > } > } > > we see log messages like the following from the apache-hc connection pool > monitor logging: > emit statistic: type=hc-conn-pool; route=some-host; available=1; active=0; > blocking=0; max-allowed=50 > > The connection manager isn’t respecting the per-route connection settings. > Above we see that the “max-allowed” per route reported by the pool-manager is > 50 for a route that specifically set the max-allowed to 200. > > Any hints about what we are doing wrong to override the limit on a per-route > basis? > Could you please try to reproduce the issue with a test case? Oleg --------------------------------------------------------------------- To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org For additional commands, e-mail: httpclient-users-h...@hc.apache.org