Apache httpclient дает тайм-аут соединения через 5 или 6 часов - PullRequest
0 голосов
/ 11 октября 2011

Я использую httpclient 4.1.2. Если я сделаю подключение к определенному хосту XYZ и сохраню клиентская программа, работающая более 5-6 часов, подключается к тому же хосту, XYZ начинает выдавать:

org.apache.http.conn.ConnectTimeoutException: Connect to XYZ timed out
        at
org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:377)
        at
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
        at
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
        at
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
        at
org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
        at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)

Если я подключусь к другому хосту, все пройдет успешно. Проблема уходит однажды Я перезапускаю свою клиентскую программу. Подключение к тому же хосту через браузер будет успешным.

Сервер является котом 6. И клиент, и сервер работают на JRE 5. Я установил время ожидания соединения = 20000 и время ожидания сокета = 60000. Я использую DefaultHttpClient с SingleClientConnManager.

1 Ответ

1 голос
/ 11 октября 2011

Я видел похожие проблемы с подключением в следующих случаях:

  1. Когда программист не полностью очищает объект ответа http после каждого запроса. В частности, когда вы получаете неожиданный код ответа (например, 500) - вы все равно должны очистить объект ответа.

  2. Когда между клиентом и сервером существует брандмауэр / балансировщик нагрузки, и запрос не передается на сервер. Вы можете посмотреть количество передаваемых заголовков и убедиться, что оно не слишком велико, и отбросить ненужные.

ПРИМЕЧАНИЕ: я бы посчитал эти значения тайм-аута очень высокими. В общем случае вы ожидаете, что сервер ответит за пару секунд, а не за десятки секунд.

Ведение журнала на уровне проводов может быть полезно при устранении таких проблем.

...