#java #hibernate #spring #tomcat #log4j
#java #спящий режим #spring #tomcat #log4j
Вопрос:
После запуска моего веб-приложения на некоторое время (время варьируется от часов до дней в зависимости от трафика) Tomcat, по-видимому, случайным образом завершает работу. До того, как это произойдет, в журнале нет ничего необычного (без исключений), просто обычный информационный материал, который выдает мое приложение.
Кто-нибудь может помочь в том, как лучше всего это отладить? Есть ли что-нибудь в Tomcat, что вызвало бы AbstractProtocol pause
сигнал?
Журналы:
09-Nov-2011 21:40:19 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-80"]
09-Nov-2011 21:40:20 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
09-Nov-2011 21:40:21 org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
Версия Java: 1.6.0_25-b06
Версия Tomcat: 6
Комментарии:
1. Я не думаю, что какая-либо из ваших строк журнала имеет какое-либо отношение к завершению работы. Кажется, они просто указывают, что он завершает работу. Вы должны посмотреть в других файлах журнала. Есть хорошее изменение, которое просто вызывает некоторый код (возможно, не ваш)
System.exit()
. Я видел подобные вещи.2. Аарон, какая из проблем в правильном ответе вызвала завершение работы?
3. Это было довольно давно, но, если я правильно помню, экземпляр был запущен на небольшой виртуальной машине с ограниченным дисковым пространством. Журналы будут накапливаться в течение нескольких недель, заполнять диск, и Tomcat остановится.
Ответ №1:
Я видел, как это происходило раньше, и журналы иногда могут быть загадочными. Однако я замечаю, что вы работаете на порту 80 (что является совершенно другой проблемой), что заставляет меня поверить, что вы изменили свой server.xml. Если на сервере имеется несколько экземпляров tomcat, убедитесь, что все они имеют уникальные порты завершения работы. Стандартный порт — 8005, и если несколько экземпляров прослушивают один и тот же порт, можно отключить их оба.
В вашем коде или в используемой библиотеке может быть случайный System.exit (), или вы неправильно подавляете истинное сообщение об ошибке в своем коде. Я много раз видел, как люди записывают это в контроллеры как форму обработки ошибок:
try {
// Do something
} catch(Exception e) {
// No rethrowing or logging, just suppressing
}
Это предотвращает появление истинной ошибки или даже правильное ведение журнала.
Я также видел, что серверы tomcat просто перестают функционировать, когда они достигают пределов памяти. Где-то в журналах будет ошибка пространства кучи, но по какой-то причине я нахожу, что ее довольно легко скрыть, и все, что останется, это сообщения о паузе. Возможно, стоит посмотреть на localhost.войдите, кроме того, из catalina.out. Обычно там меньше мусора.
Комментарии:
1. Было много специфической обработки ошибок, но не было общего исключения. Это выявило реальную проблему.
2. @Aaron у меня такая же проблема, можете ли вы, пожалуйста, помочь решить ее
Ответ №2:
Если вы работаете в рабочей среде или хотите быстрое / временное исправление, вы можете установить порт завершения работы в server.xml до «-1», что отключит команду shutdown. Это не позволит другим приложениям, которые могут иметь тот же порт завершения работы, отправлять сигнал завершения работы вашему экземпляру tomcat. Но с этой настройкой вам придется убить свой tomcat вместо его выключения. Это и есть плохая часть.
Ответ №3:
Наш tomcat таинственным образом завершал работу, потому что наш пользовательский скрипт запустил original startup.sh (без nohup) и продолжил выполнять некоторые трудоемкие вещи. Человек, который вызвал пользовательский скрипт, использовал ctrl-Z, чтобы перевести его в фоновый режим, а затем закрыл терминал putty. Это отправило SIGHUP всем процессам, подключенным к терминалу, и tomcat завершил работу.
Жаль, что tomcat не напечатал сообщение о получении SIGHUP. Позже мы нашли эту ссылку, которая подтвердила наш анализ.
Ответ №4:
У нас возникает эта проблема, когда logrotate отправляет «kill -HUP» процессу Apache, а Tomcat был порожден Apache: Apache убьет всех своих дочерних элементов, когда получит сигнал HUP.