Я впервые использую Apache HttpComponents и, в частности, HttpClient. У меня есть довольно простой вариант использования. Я опрашиваю сторонний сервер каждые N секунд (в данном случае их API ожидает POST).
CloseableHttpClient httpclient = HttpClients.custom().
setDefaultCookieStore(cookieStore).build();
Затем я выполняю некоторые запросы POST в цикле... используя:
while (!someCondition) {
HttpPost httpPost = ...
httpclient.execute(httpPost)
Thread.sleep(SOME_TIME)
}
Я заметил, что если я сплю дольше, например, 3 минуты, то я не получаю ответа от сервера, и соединение каждый раз обрывается:
DEBUG [org.apache.http.wire] http-outgoing-1 << "end of stream"
DEBUG [org.apache.http.impl.conn.DefaultManagedHttpClientConnection] http-outgoing-1: Close connection
DEBUG [org.apache.http.impl.conn.DefaultManagedHttpClientConnection] http-outgoing-1: Shutdown connection
DEBUG [org.apache.http.impl.execchain.MainClientExec] Connection discarded
DEBUG [org.apache.http.impl.conn.DefaultManagedHttpClientConnection] http-outgoing-1: Close connection
Я не верю, что это сервер. Вероятно, я неправильно использую HttpComponents или неправильно настроил его. Если я установлю его на более короткую продолжительность, например 1 минуту, он работает нормально (я заметил, что он умер после работы ~ 15 минут - так что это пятнадцать минутных интервалов).
Чтобы отправить запрос, я завернул его в несколько лямбда-выражений Java 8 и использовал попытку с ресурсами, но я не думаю, что это имеет значение:
private <R> R sendRequest(HttpUriRequest request, Function<String, R> func) {
try {
try (CloseableHttpResponse resp = this.httpclient.execute(request)) {
HttpEntity entity = resp.getEntity();
String responseString = EntityUtils.toString(entity);
R result = null;
if (func != null) {
result = func.apply(responseString);
}
EntityUtils.consume(entity);
return result;
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Error sending request: " + request, e);
}
}
Фактическое исключение:
Caused by: org.apache.http.NoHttpResponseException: myserver.com:80 failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:124)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)