HTTPClient ConnectionKeepAliveStrategy не работает должным образом - PullRequest
0 голосов
/ 18 октября 2019

Я написал код ниже, где я отправляю содержимое XML через REST POST, а затем возвращаю ответ обратно в мою вызывающую функцию. Я хочу, чтобы моя вызывающая функция использовала одно и то же соединение в течение определенного времени и не должна создавать новые соединения снова и снова.

Но это работает не так, как ожидалось, и все еще создает новые соединения для каждого нового запроса.

String out = null;
StringBuilder sb = new StringBuilder();

        DefaultConnectionKeepAliveStrategy defaultConnectionKeepAliveStrategy = new DefaultConnectionKeepAliveStrategy() {
            public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
                long keepAlive = super.getKeepAliveDuration(response, context);
                if (keepAlive == -1L)
                    keepAlive = 120000L;
                return keepAlive;
            }
        };

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        HttpPost post = new HttpPost(url);
        connectionManager.setMaxTotal(100);
        connectionManager.setDefaultMaxPerRoute(100);
        final int maxRetries = 3;
        try (CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).setRetryHandler((exception1, executionCount, context) -> {
            try {
                Thread.sleep(retryWaitTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return (executionCount <= maxRetries);
        }).setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {
            int waitPeriod = waitTime;

            public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {
                this.waitPeriod *= 2;
                return (executionCount <= maxRetries && response.getStatusLine().getStatusCode() >= 500);
            }

            public long getRetryInterval() {
                return this.waitPeriod;
            }
        }).setKeepAliveStrategy(defaultConnectionKeepAliveStrategy).setConnectionTimeToLive(120L, TimeUnit.SECONDS).build()) {

            try {
                StringEntity requestEntity = new StringEntity(xml, ContentType.APPLICATION_XML);
                post.setEntity(requestEntity);

                CloseableHttpResponse response = httpClient.execute(post);
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == 200) {

                    BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), StandardCharsets.UTF_8));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sb.append(line).append("\n");
                    }

                    br.close();
                } else {
                        .....
                }

            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        post.releaseConnection();
        return out;
    }

Как я могу улучшить код?

...