Ich weiß, dass Tomcat und die Servlet-Spezifikation das Starten von Webapps nicht unterstützt in einer bestimmten Reihenfolge .
Allerdings scheint mir das ein gewöhnlicher Anwendungsfall zu sein, und ich frage mich, ob jemand einen cleveren Workaround dafür gefunden hat.
Ich habe webapp A, das Spring Remoting verwendet, um einen geteilten Dienst freizugeben, von dem webapp B ein Client ist. Webapp B kann nicht initialisiert werden, außer Webapp A wird ausgeführt. Allerdings startet mein Tomcat die webapps immer linear, beginnend mit webapp B.
Aus Gründen der Infrastruktur muss ich diese auf dem gleichen Tomcat-Server laufen lassen.
Irgendwelche Ideen?
Danke, Roy
UPDATE -
Es stellt sich heraus, dass in meinem speziellen Fall die Reihenfolge keine Rolle spielt. Der Grund ist folgender: Ich verwende eine der folgenden Methoden, um App A vor App B zu starten. So startet App A, aber da Spring Remoting den HTTP Invoker verwendet, ist der HTTP-Port noch nicht geöffnet (er wird nicht geöffnet bis alle Apps gestartet werden. Also wird A starten und B wird hängen bleiben, da der gesuchte Port noch nicht verfügbar ist. Doh.
Das Endergebnis war zwei separate Tomcat-Instanzen.
Wir haben das gleiche Problem und um es zu lösen, verlassen wir uns auf die Tatsache (glatt, ich weiß), dass Anwendungen in der Reihenfolge gestartet werden, in der sie in <tomcat_home>/conf/server.xml
definiert sind.
Das hat natürlich den Nachteil, Apps in server.xml
fest zu programmieren, aber wir können damit leben.
Das ist ziemlich einfach zu erreichen, wenn es Ihnen nichts ausmacht, ein wenig Tomcat-Code zu hacken und Ihre eigene Host-Instanz zu erstellen
1) Erstellen Sie eine Unterklasse von org.apache.catalina.core.StandardHost, sagen Sie MyHost:
%Vor%2) Registrieren Sie Ihre Klasse auf dem xml-Host-Tag Ihres Servers ()
Unglaublich, wie es scheint, löst es das Problem, solange Sie alle Ihre Web-App in der richtigen Reihenfolge innerhalb des Host-Tags deklariert haben:
%Vor%Thaen app1 wird vor app2 starten, egal welche SO benutzt du.
Theoretisch könnte man eine Runnable
by ExecutorService
in contextInitialized()
generieren, die ihrerseits die Verfügbarkeit der anderen Webapps in bestimmten Zeitabständen prüft (vielleicht indem sie eine HTTP HEAD
Anfrage auslöst?). Sobald die andere Webanwendung verfügbar ist, legen Sie ein Attribut im Servlet-Kontext fest, der darauf hinweist. Fügen Sie ein Filter
hinzu, das nach dem Vorhandensein dieses Attributs sucht und Anforderungen entsprechend blockiert / fortsetzt.
Ich weiß, dass diese Frage ein bisschen alt ist, aber ich habe es gefunden, als ich versuchte, dasselbe zu tun und dachte, ich würde mit einer besseren Lösung aktualisieren ...
Sie können in Ihrer server.xml mehrere Dienste definieren, die auf verschiedenen Ports laufen. Die Dienste werden nacheinander in der Reihenfolge gestartet, in der sie in der Datei server.xml aufgeführt sind. Dies bedeutet, dass Sie zum Beispiel einen Konfigurationsdienst haben können, der im ersten Dienst ausgeführt wird, und dann die Anwendungen, die im zweiten Dienst davon abhängen (ich verwende den Standard Catalina für den Rest von ihnen ...)
Sie können mehr Informationen hier sehen: Ссылка
Und das ist der Dienst, den ich vor dem Catalina-Dienst einschließe:
%Vor%Wie Sie sehen, verwende ich docbase anstatt appBase, aber Sie sollten in der Lage sein, eine andere appBase zu konfigurieren, wenn Sie ...
bevorzugenBeachten Sie, dass es wichtig ist, den Namen des Dienstes und der Suchmaschine zu ändern.
HTH
Hier ist ein weiterer Trick auf Linux.
Einige unserer Webservice-Anwendungen werden wegen fehlerhafter WSDL nicht bereitgestellt. Dies geschieht, wenn sie nach einer Reihe anderer Anwendungen bereitgestellt oder gestartet werden. Die Reihenfolge, in der sie gestartet werden, hängt von der Reihenfolge ab, in der Kontext-XMLs in / opt / apache-tomee / conf / Catalina / localhost
gefunden werden Kann mit " ls -1f
" überprüft werden. Ein einfaches "ls" liefert eine sortierte Ausgabe.
Dies war die Reihenfolge, in der Dateien zu diesem Verzeichnis hinzugefügt wurden, aber bei ext4-Dateisystemen basiert die Reihenfolge auf einem Hash des Dateinamens. Dies kann wie folgt deaktiviert werden:
%Vor%Jetzt können Sie zumindest selbst entscheiden, in welcher Reihenfolge sie gestartet werden. Neuordnen: Verschieben Sie alle Dateien in einen temporären Ordner und verschieben Sie sie in der gewünschten Reihenfolge zurück.
Hier ist ein netter Trick, den ich benutze, um 2 Ebenen des Ladens von Webapps zu erstellen. In jedem Level ist die Reihenfolge nicht garantiert. Dies beruht auf der Tatsache, dass tomcat erste Kontextdeskriptoren von tomcat / conf / [Engine Name] / [Hostname] und nur dann Kontexte aus dem appBase-Attribut des Host-Elements in server.xml lädt
Fügen Sie einfach den folgenden Code irgendwo in der Webanwendung hinzu, die Sie in der 2. Ebene (d. h. später) laden möchten
%Vor%