【发布时间】:2021-11-30 20:45:06
【问题描述】:
我创建了一个 Apache HTTP 客户端
CloseableHttpClient client = HttpClients.custom()
.setMaxConnPerRoute(25)
.setMaxConnTotal(50)
.setDefaultRequestConfig(RequestConfig.custom()
.setConnectionRequestTimeout(20_000)
.build())
.build();
我将它用作单例。我有这个发送请求的方法:
public RestResponse sendPost(String serverUrl, String body) throws RestException {
try {
HttpPost httpPost = new HttpPost(serverUrl);
httpPost.setEntity(new StringEntity(body));
try (CloseableHttpResponse response = client.execute(httpPost)) {
RestResponse restResponse = new RestResponse();
restResponse.setCode(response.getStatusLine().getStatusCode());
restResponse.setBody(EntityUtils.toString(response.getEntity()));
return restResponse;
}
} catch (Exception e) {
throw new RestException(e);
}
}
它工作正常。但是在空闲一段时间(5-6 分钟)后,如果我发送请求,我会收到 "java.net.SocketException: Connection reset"
我有 2 个问题
-
我怎样才能找到这个时间开始的地方?这些参数对我不起作用
.setSocketTimeout(25_000) .setConnectTimeout(26_000) -
解决此问题的最佳方法是什么? (我的意思是在每个请求之后或之前重试请求或更改超时或重新连接)
【问题讨论】:
-
你可能需要配置你的连接池来测试连接
标签: java apache-httpclient-4.x apache-httpcomponents socket-timeout-exception