Приложение Tomcat Java Server не восстанавливается из нескольких зависимых java.net.SocketTimeoutExceptions - PullRequest
1 голос
/ 12 февраля 2012

У меня есть веб-приложение Java / JSP, обслуживаемое Tomcat, которое обращается к веб-службе партнера для получения данных.Технологии, используемые в партнерской службе, неизвестны.Веб-служба партнера часто имеет расширенные сбои, когда она возвращает исключение SocketTimeout:

java.net.SocketTimeoutException: connect timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)

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

Если я в этот момент запускаю и останавливаю Tomcat, после этого все работает нормально.

Я не использую http keep-alives.Мой код анально об очистке всех экземпляров объекта, независимо от того, происходят ли исключения или нет.Кажется, что Java-процесс Tomcat «использует» какой-то ресурс (сокеты?), Выбрасывая его с каждой ошибкой, пока не останется больше ничего, что можно было бы использовать.Кто-нибудь видел это раньше, и есть ли очевидное решение?Я много искал по этому вопросу и не нашел никого с такой же проблемой.

Заранее спасибо!John

1 Ответ

0 голосов
/ 12 февраля 2012

В прошлом у меня была ситуация, когда у меня не хватало слотов в стеках TCP / IP для соединений, которые были в состоянии TCP_WAIT. Существуют некоторые жесткие ограничения для операционных систем, с которыми вы можете столкнуться. Чтобы узнать, каково ограничение, используйте такой инструмент, как netstat, если вы работаете на сервере Windows, вы можете использовать некоторые инструменты из sysinternals.

Решением вашей проблемы может быть схема проектирования под названием Circuit Braker, которая описана в книге под названием http://pragprog.com/book/mnee/release-it

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

https://bitbucket.org/asaikali/circuitbreaker/ имеет пример реализации шаблона CircuitBreaker с открытым исходным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...