首页 > 解决方案 > 我正在尝试使用 PoolingHttpClientConnectionManager 和 ClosableHttpClient 为 HTTPS 创建具有单个连接的连接池并重用它

问题描述

尝试创建一个连接池,其中只会创建单个 HTTPS 连接,并且当后续请求到来时,将使用先前的连接池。目前,当我每次尝试建立新连接并且先前的连接进入时间等待状态时都尝试点击任何请求。

在我使用的代码片段下面,它适用于 HTTP 连接,但不适用于 HTTPS

  SslConfigurator sslConfig = SslConfigurator.newInstance().keyStoreFile(this.connectionInfo.getKeyStorePath()).keyStorePassword(connectionInfo.getKeyStorePassword()).keyStoreType("JKS").trustStoreFile(this.connectionInfo.getKeyStorePath()).trustStorePassword(connectionInfo.getKeyStorePassword()).securityProtocol("TLS");
                logger.info("SSL CONFIG Accepted");
                sslContext = sslConfig.createSSLContext();
                SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE);
                logger.info("SSL CONTEXT CREATED, Building Client" );

                Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).build();
                connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
                connManager.setMaxTotal(1);
                connManager.setDefaultMaxPerRoute(1);

                config = RequestConfig.custom().setConnectTimeout(60000).setConnectionRequestTimeout(60000).setSocketTimeout(60000).build();
                client = HttpClients.custom().setDefaultRequestConfig(config).setConnectionManager(connManager).build();

标签: sslapache-httpclient-4.x

解决方案


connManager.setMaxTotal(1);

我不确定您为什么认为这没有效果,因为这绝对应该将池中的连接总数限制为一次只有一个。

但是,在您的特定情况下,您应该使用BasicHttpClientConnectionManager而不是PoolingHttpClientConnectionManager


推荐阅读