2012-01-09 23 views
8

So che Tomcat e la specifica Servlet do not support starting webapps in a particular order.Tomcat - avvio di webapp in un ordine specifico

Tuttavia, questo mi sembra un caso di utilizzo comune e mi chiedo se qualcuno abbia scoperto un'intelligente soluzione alternativa.

Ho una webapp A che utilizza Spring Remoting per esporre un servizio condiviso, di cui webapp B è un client. Webapp B non può essere inizializzato a meno che webapp A non sia in esecuzione. Tuttavia, Tomcat avvia sempre le app Web in modo lineare, iniziando con la webapp B.

Per motivi di infrastruttura, è necessario che siano in esecuzione sullo stesso server Tomcat.

Qualche idea?

Grazie, Roy

UPDATE -

Risulta che nel mio caso particolare, l'ordine non importa. Il motivo è questo: dire che uso uno dei metodi seguenti per avviare l'app A prima dell'app B. Quindi l'app A parte, ma, dal momento che il servizio remoting di Spring utilizza l'Invoker HTTP, la porta HTTP non è ancora aperta (non si aprirà fino al tutte le app sono state avviate). Quindi A inizierà e B si bloccherà perché la porta che sta cercando non è ancora disponibile. Doh.

Il risultato finale era di due istanze Tomcat separate.

+0

Fare in modo che l'app Web che deve attendere l'altra app Web, invece di fallire e arrendersi, attendere. –

+1

Hey Dave, unf. non iniziano in parallelo .. B inizia (beh, prova ad avviarsi) e A inizierà dopo. Ma se B non può avviarsi perché non può connettersi ad A, A non tenta mai di avviarsi. –

+1

Dovrebbe avviarli in ordine ASCII. Un trucco che vedo sulle installazioni di Debian Apache è creare una convenzione di denominazione 00_default 000_default. Ciò lo rende un po 'più chiaro quando si visualizza l'ordine ASCII dell'elenco di directory. – speeves

risposta

3

Abbiamo lo stesso problema e per risolverlo ci basiamo sul fatto (sdrucciolevole, lo so) che le applicazioni vengono avviate nell'ordine in cui sono definite in <tomcat_home>/conf/server.xml.

Questo ovviamente ha uno svantaggio delle app di codifica nel server.xml ma possiamo conviverci.

+0

Grazie mindas - Questo è probabilmente il modo "migliore" per farlo, ma unf non funziona per me - modificherò la mia domanda per spiegare perché. –

1

In teoria si potrebbe generare un Runnable da ExecutorService in contextInitialized() che a sua volta controlla la disponibilità dell'altro webapp ad intervalli di tempo (forse da uno sparo di HTTP HEAD richiesta?). Una volta disponibile l'altra webapp, imposta alcuni attributi nel contesto servlet che indica quello. Aggiungi un Filter che verifica la presenza di tale attributo e blocca/continua le richieste di conseguenza.

0

Ecco un bel trucco che utilizzo per creare 2 livelli di caricamento webapp. in ogni livello l'ordine non è garantito. Questo dipende dal fatto che tomcat caricherà i primi descrittori di contesto da tomcat/conf/[Nome motore]/[Nome host] e solo i contesti dall'attributo appBase dell'elemento Host in server.xml

Basta aggiungere quanto segue il codice da qualche parte nella webapp che si desidera caricare nel 2 ° livello (vale a dire più tardi)

File contextDescriptor = new File(getParameter("catalina.home"),"/conf/Catalina/localhost/mywebapp.xml"); 
contextDescriptor.deleteOnExit(); 
3

che è abbastanza facile da realizzare se non vi interessa l'hacking un po 'di codice di Tomcat e creare la propria istanza Host

1) Creare una sottoclassella org.apache.catalina.core.StandardHost, dire myhost:

class MyHost extends org.apache.catalina.core.StandardHost{ 
     public MyHost(){ 
     super(); 
     //changing HashMap for a predictable ordered Map :) 
     this.children = new LinkedHashMap(); 
     } 
    } 

2) registrare la classe su tag XML host del server()

Per quanto incredibile possa sembrare, si risolve il problema fino a quando si dispone di tutto il vostro web app dichiarato l'ordine corretto all'interno del tag Host:

<Host> 
    <context app1> 
    <context app2> 
    </Host> 

Thaen app1 inizierà prima app2, non importa quale SO è stato utilizzato.

+1

Dopo il primo passaggio, dove dovremmo inserire la classe MyHost? Puoi per favore elaborare di più. – abi1964

+0

possiamo avere un esempio della configurazione dell'host –

1

So che questa domanda è un po 'vecchio, ma ho trovato quando si cerca di fare la stessa cosa e ho pensato di aggiornare con una soluzione migliore ...

è possibile definire i servizi mulitple nel server. xml, che funziona su diverse porte. I servizi vengono avviati in sequenza in base all'ordine in cui appaiono nel server.xml. Ciò significa che è possibile avere, ad esempio, un servizio di configurazione in esecuzione nel primo servizio e quindi le app che ne dipendono nel secondo (utilizzo il Catalina predefinito per il resto ...)

Si può vedere più informazioni qui: http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27

E questo è il servizio che includo prima il servizio Catalina:

<Service name="ConfigService"> 
    <Connector port="8081" protocol="HTTP/1.1" 
     connectionTimeout="20000" 
     redirectPort="8444" /> 
    <Engine name="ConfigServiceEngine" defaultHost="localhost"> 
     <Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true" 
      xmlValidation="false" xmlNamespaceAware="false"> 

      <Context path="/" reloadable="true" docBase="/path/to/your/service/directory" /> 
     </Host> 
    </Engine> 
</Service> 

Come potete vedere, io uso Docbase piuttosto che AppBase, ma si dovrebbe essere in grado di configurare un appBase diverso se preferisci r ...

NB è importante modificare il nome del servizio e del motore.

HTH

1

Ecco un altro trucco su Linux.

Alcune delle nostre applicazioni Webservice non riescono a distribuire, a causa di WSDL errato. Ciò accade se vengono distribuiti o avviati dopo un certo numero di altre applicazioni. L'ordine in cui vengono avviati dipende dall'ordine in cui XML contesto di si trovano in/opt/apache-tomee/conf/Catalina/localhost

può essere verificato utilizzando "ls -1f". Un semplice "ls" dà un output ordinato.

Questo era l'ordine in cui i file venivano aggiunti a quella directory, ma con i filesystem ext4, l'ordine è basato su un hash del nome file. Questo può essere disabilitato come segue:

# tune2fs -O ^dir_index /dev/xyz 

Ora è possibile decidere almeno in quale ordine verranno avviati. Riordino: sposta tutti i file in una cartella temporanea, spostali indietro nella sequenza desiderata.

Problemi correlati