Pitfals развертывания / redploying приложения в Tomcat без перезапуска - PullRequest
3 голосов
/ 19 февраля 2010

Я прочитал, что с Tomcat 5.5+ возможно развернуть войну на сервере Tomcat без перезапуска.Это звучит фантастически, но я думаю, что я слишком скептически отношусь к этой функциональности и ее надежности.Мой предыдущий опыт (с Websphere) заключался в том, что рекомендуется перезапускать сервер, чтобы избежать проблем с памятью и т. Д. Поэтому я хотел получить обратную связь о том, какие подводные камни могут существовать в Tomcat.

(Чтобы понять мой опыт, я в течение 5 лет разрабатывал Java-приложения для большой компании, которая разделила разработчиков приложений от инженеров сервера приложений - мы использовали Websphere - поэтому у меня не так многоопыт запуска / настройки любых серверов приложений сам)

Ответы [ 2 ]

6 голосов
/ 19 февраля 2010

В общем случае существует несколько типов утечек, и они применяются к сценариям повторного развертывания.Для производственных систем действительно лучше выполнить перезапуск, если это возможно, поскольку в современных приложениях используется так много различных компонентов и библиотек, что очень сложно найти их все и еще сложнее их исправить.Особенноесли у вас нет доступа ко всему исходному коду.

  • Утечки памяти
  • Утечки Thread и ThreadLocal
  • Утечки ClassLoader
  • Утечки системных ресурсов
  • Утечки соединения

Утечки ClassLoader - это те, которые кусаются при перераспределении .

Они могут быть вызваны чем угодно.Действительно, я имею в виду все:

  • Таймеры: У таймеров есть Потоки и Потоки, созданные во время выполнения, наследуют текущий загрузчик класса контекста, что означает WebappClassloader Tomcat.
  • ThreadLocals: ThreadLocals связаны с потоком.Серверы приложений используют пулы потоков.Когда ThreadLocal привязан к Thread и поток возвращается обратно в пул, ThreadLocal останется там, если никто не удалит () его должным образом.Бывает довольно часто и очень трудно найти (у ThreadLocals нет имени, кроме редко используемого Spring NamedThreadLocal).Если ThreadLocal содержит класс, загруженный WebappClassloader, вы получили утечку ClassLoader.
  • Кэши: Например, EhCache CacheManager
  • Отражение: JavaBeans Introspector(например, хранение кэшей класса или метода)
  • Драйверы JDBC: их не должно быть в файле .war в любом случае.Утечка из-за статического реестра
  • Статические библиотеки, которые кэшируют ClassLoaders, такие как Commons-Logging LogFactory

Специфично для Tomcat, мой опыт выглядит следующим образом:

  • Для простых приложений с «чистыми» библиотеками он отлично работает в Tomcat
  • Tomcat очень старается очистить классы, загруженные WebappClassloader.Например, все статические поля классов имеют нулевое значение, когда веб-приложение не развернуто.Это иногда приводит к исключениям NullPointerException, когда код выполняется во время отмены развертывания, например, фоновые задания с использованием Logger
  • Tomcat имеет прослушиватель, который очищает еще больше вещей.Она называется org.apache.catalina.core.JreMemoryLeakPreventionListener и недавно была отправлена ​​в Tomcat 6.x

Я написал в блоге сообщение о моем опыте с утечками при стресс-тестировании при повторном развертывании - пытаясь "исправить" всевозможные утечки веб-приложения Java корпоративного уровня.

1 голос
/ 20 февраля 2010

Горячее развертывание очень приятно, так как обычно оно происходит намного быстрее, чем перестановка и выключение сервера.

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

Также обратите внимание, что некоторые IDE позволяют обновлять код внутри WAR (так же, как и приложения), при сохранении измененного исходного файла вместо повторного развертывания.MyEclipse делает это довольно хорошо.

...