Come si aggiorna una webapp Tomcat senza riavviare l'intero servizio?


93

Sono nuovo a Tomcat. Abbiamo una macchina di sviluppo con circa 5 app in esecuzione. Anche se è sviluppatore, viene utilizzato dai nostri clienti piuttosto pesantemente durante i test.

Quindi diciamo che dobbiamo fare una piccola modifica su un file di classe. In questo momento, dobbiamo arrestare Tomcat (che interessa le altre quattro app), eliminare il WARfile (e la directory dell'app Web), ridistribuire il nuovo WARfile e riavviare Tomcat.

Ovviamente, questo sconvolge alcune persone perché distrugge tutte le sessioni registrate per tutte le app.

C'è un modo migliore per farlo? Voglio dire, c'è un modo per ricaricare solo la CLASS che è cambiata invece di tutto sulla macchina di sviluppo?

Grazie.


Modificare la gestione della sessione in qualcosa che persiste nel file? Scusa non ho potuto resistere :)
rogerdpack

1
@rogerdpack Ho imparato molto su Tomcat da quando ho posto questa domanda più di sei anni fa. Ma grazie comunque.
cbmeeks

Per quanto riguarda hot swapping classi solo, vedi stackoverflow.com/questions/32459047/...
rogerdpack

Risposte:


59

Hai provato a utilizzare l'applicazione Manager di Tomcat ? Ti consente di annullare la distribuzione / distribuire i file war senza spegnere Tomcat.

Se non desideri utilizzare l'applicazione Manager, puoi anche eliminare il file war dalla directory webapps, Tomcat annullerà la distribuzione dell'applicazione dopo un breve periodo di tempo. È quindi possibile copiare nuovamente un file war nella directory e Tomcat distribuirà il file war.

Se utilizzi Tomcat su Windows, potrebbe essere necessario configurare il contesto in modo che non blocchi vari file.

Se non puoi assolutamente avere tempi di inattività, potresti voler guardare le distribuzioni parallele di Tomcat 7 Puoi distribuire più versioni di un'applicazione web con lo stesso percorso di contesto allo stesso tempo. Le regole utilizzate per abbinare le richieste a una versione contestuale sono le seguenti:

  • Se nella richiesta non sono presenti informazioni sulla sessione, utilizzare la versione più recente.
  • Se le informazioni sulla sessione sono presenti nella richiesta, controllare il gestore sessioni di ciascuna versione per una sessione corrispondente e, se ne viene trovata una, utilizzare quella versione.
  • Se le informazioni sulla sessione sono presenti nella richiesta ma non è possibile trovare alcuna sessione corrispondente, utilizzare la versione più recente.

Anche questo è un buon suggerimento. Non ho mai sentito parlare dell'app manager fino ad oggi. Sì, usiamo Windows. Una preoccupazione che ho con l'eliminazione del file WAR e l'attesa è che i nostri clienti si aspettano spesso "piccole correzioni". Quei suggerimenti funzionerebbero per quello scenario?
cbmeeks

1
@cbmeeks - Dipende da quanto spesso si verificano queste piccole correzioni e da quanto tempo prima che qualcuno se ne accorga. In entrambi i casi, l'applicazione non sarà disponibile per un breve periodo. Dipende dal tuo hardware / applicazione quanto tempo è. Ma è misurato in secondi, direi di solito 5-10 sulle nostre applicazioni. Ma il tuo chilometraggio può variare :)
Steve K

1
Wow. Ho imparato così tanto da quando ho posto questa domanda. Sì, ora distribuiamo le app Tomcat senza disattivare completamente Tomcat. Una cosa che ho fatto è stata assicurarmi che tutti i log (app e Tomcat) non registrassero i log ALL'INTERNO della cartella webapps / application. Oppure, funziona anche la configurazione di Tomcat in modo che non si blocchi. Quindi abbiamo messo la registrazione in una posizione centrale al di fuori della cartella di Tomcat. Funziona come un sogno. Ma la tua risposta è stata la più utile. Grazie!
cbmeeks

5
Durante la ridistribuzione senza riavvio, dovrai fare attenzione alle perdite di memoria: molto spesso i classloader perdono riferimenti ed è necessario riavviare l'intero processo Tomcat per liberare memoria dalla vecchia versione dell'applicazione. LiveRebel (menzionato in un'altra risposta) può automatizzare tutto ciò per te.
Neeme Praks

3
Non è necessario eliminare la guerra per ridistribuire. Basta copiare la vecchia guerra e attendere qualche secondo.
peceps

30

Ci sono molti modi semplici.

  1. Basta toccare web.xml di qualsiasi webapp.

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

Puoi anche aggiornare un particolare file jar in WEB-INF / lib e quindi toccare web.xml, invece di creare un intero file war e distribuirlo di nuovo.

  1. Elimina la directory webapps / YOUR_WEB_APP, Tomcat inizierà a distribuire war entro 5 secondi (supponendo che il tuo file war esista ancora nella cartella webapps).

  2. Generalmente la sovrascrittura del file war con la nuova versione viene ridistribuita automaticamente da Tomcat. In caso contrario, puoi toccare web.xml come spiegato sopra.

  3. Copia su una "directory" già esplosa nella tua cartella webapps


1
Utile sapere che il metodo "touch" non ricarica le classi. IOW, non elimina e ricarica la gerarchia del classloader per la webapp
Rondo

2
Vedendo perché questo funziona può leggere $CATALINA_BASE/conf/context.xml. Il WEB-INF / web.xml viene controllato per i cambiamenti. Altre risorse possono essere facilmente elencate lì, se necessario.
Kevin il

21

Nella directory conf di apache tomcat puoi trovare il file context.xml. In quel tag di modifica come < Context reloadable = "true" >. questo dovrebbe risolvere il problema e non è necessario riavviare il server


Preferisci invece l'applicazione manager. Questa è un'operazione costosa per l'ariete.
Sorter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.