Должны ли потоки иметь особый дизайн, который должен быть корректно завершен Tomcat?

Я разработал многопоточное веб-приложение, которое работает на Tomcat. Но я не могу использовать

shutdown.bat

Tomcat не остановился грациозно. В отладчике я видел, что потоки продолжают работать после команды выключения. Нужно ли исправлять код приложения, чтобы он соответствовал особым требованиям? Благодарю.

3 ответа

Решение

... и связать другие ответы с работой сред сервлетов Java;

если вы не объявляете свои потоки как потоки демонов, способ сообщить серверу о завершении работы потоков - реализовать ServletContextListener и настройте его в своем веб-приложении (web.xml). Когда Tomcat завершает работу, он сначала закрывает каждое приложение, что, в свою очередь, вызывает contextDestroyed() метод слушателя, который нужно вызвать - и здесь вы можете указать своим собственным потокам, что они должны завершить свою работу.

Любые потоки, которые еще работают, будут поддерживать процесс Java (Tomcat). Убедитесь, что все ваши темы выходят. Как только ваши потоки завершатся, Tomcat сможет завершить работу.

Смотрите Javadoc для темы. Обратите внимание на следующее:

Виртуальная машина Java продолжает выполнять потоки, пока не произойдет одно из следующих действий:

  • Был вызван метод выхода класса Runtime, и менеджер безопасности разрешил выполнение операции выхода.
  • Все потоки, которые не являются потоками демонов, умерли, либо возвращаясь из вызова метода run, либо выбрасывая исключение, которое распространяется за пределы метода run.

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

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

Другие вопросы по тегам