powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat и корректное завершение тредов
8 сообщений из 8, страница 1 из 1
Tomcat и корректное завершение тредов
    #33262486
botpride
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется приложение (обработка документов, приходящих почтой), где основной поток обработки разделен на несколько Threads.
Естественно, имеется необходимость при завершении сервиса корректно их останавливать (фактически, делать в "безопасном" месте break внутри цикла Run).

Что пробовалось:
- отработка InterruptedException (который вокруг sleep)
- вызов Thread.interrupt() из finalize() центрального класса
- отработка this.interrupt() в finalize() каждого треда - аналогично

И вот глядение в логи убедило, что даже все три метода вместе не дают возможности корректно отловить момент остановки сервиса и быстро завершить текущие операции (хотя finalize вроде железно должно это делать). Вопрос: что я делаю не так, и есть ли стандартный способ корректно останавливать треды? Реально надо "продержать" их максимум секунду, чтобы успеть, скажем, принять письмо и закрыть рор3-сессию, или завершить начатую обработку документа.
...
Рейтинг: 0 / 0
Tomcat и корректное завершение тредов
    #33262589
botpride
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, сам разобрался... Runtime.addShutdownHook() рулит:)
Честно говоря, до сего момента был уверен, что перед шатдауном ВСЕ живые объекты корректно финализируются JVM, ан нет.
...
Рейтинг: 0 / 0
Tomcat и корректное завершение тредов
    #33262762
коты
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может, тупой вопрос, но при чем тут томкет?
...
Рейтинг: 0 / 0
Tomcat и корректное завершение тредов
    #33262828
botpride
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
котыможет, тупой вопрос, но при чем тут томкет?

Да это я ступил. Просто было святое убеждение, что сервера должны финализировать при шатдауне важные объекты (скажем, bean в скоупе Application) сами, или уж по крайней мере интерраптить все не-даймон треды.
Собственно, убеждение было основано на том, что при работе с каким-то стареньким Джейраном таких проблем не возникало - обработчики не сыпались "на самом интересном месте".
...
Рейтинг: 0 / 0
Tomcat и корректное завершение тредов
    #33263978
usa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаеш сервлет, прописываеш его в web.xml, переопределяеш 2 метода init и destroy, эти 2 метода и вызываются при старте/остановке приложения/томката
...
Рейтинг: 0 / 0
Tomcat и корректное завершение тредов
    #33265074
botpride
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот это мысль... потому что с addShutdownHook тоже как-то кисленько, а сервлет Startup с методом init() у меня уже есть - как раз те самые сервисы и инициализируются, которые в конце надо прибивать.
Спасибо, завтра с утречка опробую:)

Но вот что меня интересует: почему же в старом джейране таких фишек не было? Действительно разница в поведении двух вебсерверов, или что-то менее очевидное?
...
Рейтинг: 0 / 0
Tomcat и корректное завершение тредов
    #33265108
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
хотя finalize вроде железно должно это делать). 
Не совсем.
При уборке мусора в Java для идентификации используемых объектов применяется механизм, кот. наз. проверкой достижимости объектов.Изменение состояния объекта от момента создания до момента уничтожения называется жизненным цмклом.Утечка памяти в Java возникает обычно тогда,когда доступный объект с длинным жизненным циклом содержит ссылку на объект с коротким жизненным циклом.Короче говоря блин, к утечкам памяти относятся доступные, но не используемые объекты,ищи их.
...
Рейтинг: 0 / 0
Tomcat и корректное завершение тредов
    #33267500
botpride
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
peter6636
Код: plaintext
хотя finalize вроде железно должно это делать). 
Не совсем.
При уборке мусора в Java для идентификации используемых объектов применяется механизм, кот. наз. проверкой достижимости объектов.Изменение состояния объекта от момента создания до момента уничтожения называется жизненным цмклом.Утечка памяти в Java возникает обычно тогда,когда доступный объект с длинным жизненным циклом содержит ссылку на объект с коротким жизненным циклом.Короче говоря блин, к утечкам памяти относятся доступные, но не используемые объекты,ищи их.

Нет, тут дело немного не в том. У меня есть треды, которые "вечно живые", т.е. крутятся все время работы приложения. Они, естественно, никакому gc не подлежат. Весь смысл был сделать им interrupt в момент шатдауна и дождаться (буквально секунду) пока каждый из них доделает некий критичный участок кода и выскочит из run().
Дык вот, я был свято уверен, что перед выходом JVM финализирует вообще ВСЕ объекты (т.е. все, что есть, считает мусором и прибивает). Оказалось - фигушки. Есть некий метод в System.runFinalizersOnExit(boolean), который задает это явно, но вызывать его категорически не рекомендуют, вместо него советуя Runtime.addShutdownHook(); как оказалось, в Томкате и эта байда нагло игнорируется (видимо, прибивается через security manager, я не разбирался). Во всяком случае, хук нифига не отрабатывал.
А вот добавил в уже имевшийся класс Startup кроме метода init() еще и destroy() - все прекрасно начало корректно останавливать обработку, я сегодня целый день с этого счастливый, спасибо usa:-)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat и корректное завершение тредов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]