Я написал код ниже, где я отправляю содержимое 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;
}
Как я могу улучшить код?