Jak zaktualizować aplikację internetową Tomcat bez ponownego uruchamiania całej usługi?

93

Jestem nowy Tomcat. Mamy maszynę deweloperską z około 5 uruchomionymi aplikacjami. Mimo że jest to programista, nasi klienci używają go dość intensywnie podczas testów.

Powiedzmy, że musimy dokonać jednej małej zmiany w jednym pliku klasy. W tej chwili musimy zamknąć Tomcat (wpływając na pozostałe cztery aplikacje), usunąć WARplik (i katalog aplikacji internetowej), ponownie wdrożyć nowy WARplik i ponownie uruchomić Tomcat.

Oczywiście denerwuje to kilka osób, ponieważ niszczy wszystkie zalogowane sesje dla wszystkich aplikacji.

Czy jest lepszy sposób, aby to zrobić? Chodzi mi o to, czy istnieje sposób, aby ponownie załadować zmienioną klasę zamiast wszystkiego na maszynie deweloperskiej?

Dzięki.

cbmeeks
źródło
Zmienić zarządzanie sesjami na coś, co pozostaje w pliku? Przepraszam, nie mogłem się oprzeć :)
rogerdpack
1
@rogerdpack Dowiedziałem się wiele o Tomcat, odkąd zadałem to pytanie ponad sześć lat temu. Mimo wszystko dziękuję.
cbmeeks
Odnośnie wymiany tylko klas na gorąco, zobacz stackoverflow.com/questions/32459047/…
rogerdpack

Odpowiedzi:

59

Czy próbowałeś użyć aplikacji Tomcat's Manager ? Pozwala cofnąć wdrażanie / wdrażanie plików wojennych bez wyłączania Tomcata.

Jeśli nie chcesz używać aplikacji Manager, możesz również usunąć plik war z katalogu webapps, Tomcat cofnie wdrożenie aplikacji po krótkim czasie. Następnie możesz skopiować plik wojenny z powrotem do katalogu, a Tomcat wdroży plik wojenny.

Jeśli używasz Tomcat w systemie Windows, może być konieczne skonfigurowanie kontekstu, aby nie blokować różnych plików.

Jeśli absolutnie nie możesz mieć żadnych przestojów, możesz przyjrzeć się wdrożeniom równoległym Tomcat 7. Możesz wdrożyć wiele wersji aplikacji internetowej z tą samą ścieżką kontekstową w tym samym czasie. Reguły używane do dopasowywania żądań do wersji kontekstu są następujące:

  • Jeśli żądanie nie zawiera informacji o sesji, użyj najnowszej wersji.
  • Jeśli w żądaniu znajdują się informacje o sesji, sprawdź menedżera sesji każdej wersji pod kątem pasującej sesji, a jeśli zostanie znaleziona, użyj tej wersji.
  • Jeśli żądanie zawiera informacje o sesji, ale nie można znaleźć pasującej sesji, użyj najnowszej wersji.
Steve K.
źródło
To też dobra sugestia. Do dzisiaj nie słyszałem o aplikacji do zarządzania. Tak, używamy systemu Windows. Jedną z obaw związanych z usunięciem pliku WAR i czekaniem jest to, że nasi klienci często oczekują „małych poprawek”. Czy te sugestie sprawdzą się w tym scenariuszu?
cbmeeks,
1
@cbmeeks - To zależy od tego, jak często zdarzają się te drobne poprawki i na jak długo ktoś to zauważy. W obu przypadkach aplikacja będzie niedostępna przez krótki czas. To zależy od twojego sprzętu / aplikacji, jak długi jest ten czas. Ale jest mierzony w sekundach, powiedziałbym, że zwykle 5-10 w naszych aplikacjach. Ale Twój przebieg może się różnić :)
Steve K,
1
Łał. Wiele się nauczyłem, odkąd zadałem to pytanie. Tak, teraz wdrażamy aplikacje Tomcat bez całkowitego wyłączania Tomcat. Jedną z rzeczy, które zrobiłem, było upewnienie się, że wszystkie rejestracje (aplikacja i Tomcat) nie rejestrują dzienników WEWNĄTRZ folderu webapps / aplikacji. Lub skonfigurowanie serwera Tomcat tak, aby nie blokował, również działa. Więc umieściliśmy logowanie w centralnym miejscu poza folderem Tomcata. Działa jak sen. Ale twoja odpowiedź była najbardziej pomocna. Dzięki!
cbmeeks
5
Przy ponownym wdrażaniu bez restartu będziesz musiał uważać na wycieki pamięci - bardzo często classloadery będą przeciekać referencje i musisz ponownie uruchomić cały proces Tomcat, aby zwolnić pamięć ze starej wersji aplikacji. LiveRebel (wspomniany w innej odpowiedzi) może to wszystko zautomatyzować.
Neeme Praks
3
Nie musisz usuwać wojny, aby ją ponownie rozmieścić. Po prostu skopiuj starą wojnę i poczekaj kilka sekund.
peceps
31

Istnieje wiele łatwych sposobów.

  1. Wystarczy dotknąć web.xml dowolnej aplikacji internetowej.

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

Możesz także zaktualizować konkretny plik jar w WEB-INF / lib, a następnie dotknąć web.xml, zamiast tworzyć cały plik wojny i wdrażać go ponownie.

  1. Usuń katalog webapps / YOUR_WEB_APP, Tomcat rozpocznie wdrażanie wojny w ciągu 5 sekund (zakładając, że twój plik wojenny nadal istnieje w folderze webapps).

  2. Ogólnie rzecz biorąc, nadpisywanie pliku wojennego nową wersją jest ponownie wdrażane przez tomcat automatycznie. Jeśli nie, możesz dotknąć pliku web.xml, jak wyjaśniono powyżej.

  3. Skopiuj już rozebrany „katalog” do folderu webapps

Chirag Katudia
źródło
1
Warto wiedzieć, że metoda „touch” nie przeładowuje klas. IOW, nie czyści i nie ładuje ponownie hierarchii modułu ładującego klasy dla aplikacji internetowej
Rondo
2
Widząc, dlaczego to działa, możesz przeczytać $CATALINA_BASE/conf/context.xml. WEB-INF / web.xml jest obserwowany pod kątem zmian. W razie potrzeby można tam łatwo wymienić inne zasoby.
Kevin,
21

W katalogu conf apache tomcat można znaleźć plik context.xml. W tym tagu edycji jako < Context reloadable = "true" >. powinno to rozwiązać problem i nie ma potrzeby ponownego uruchamiania serwera

skal
źródło
Zamiast tego wolę aplikację menedżera. Jest to kosztowna operacja dla barana.
Sorter