Ich würde zunächst sagen, dass die Frage nicht vollständig richtig gestellt ist, da es durchaus möglich ist, die Datei tatsächlich zu bearbeiten, ohne Tomcat neu zu starten, aber die Änderungen werden vom laufenden Prozess ignoriert.
Die eigentliche Frage wäre, wie Änderungen übernommen werden können, server.xml
ohne Tomcat neu zu starten.
Durch das Sammeln von Informationen aus dem Startvorgang und den Klassenlade- Seiten in der Online-Dokumentation von Tomcat ist es möglich, dies genauer zu verstehen.
Insbesondere wird es in serverStartup.txt beschrieben und das UML-Diagramm des Startvorgangs sowie die relevanten Teile können wie folgt zusammengefasst werden:
Sequence 1. Start from Command Line
...
Sequence 2. Process command line argument (start, startd, stop, stopd)
Class: org.apache.catalina.startup.Bootstrap (assume command->start)
What it does:
a) Catalina.setAwait(true);
b) Catalina.load()
b3) createStartDigester()
Configures a digester for the main server.xml elements
b4) Load the server.xml and parse it using the digester
Parsing the server.xml using the digester is an automatic
XML-object mapping tool, that will create the objects defined
in server.xml
Startup of the actual container has not started yet.
b6) Calls initialize on all components, this makes each object
register itself with the JMX agent.
Dies geschieht nach der Erstellung des Bootstrap-Klassenladeprogramms der Servlet-Engine (Catalina).
Mit diesen Informationen ist jetzt klar, wann die server.xml
Datei beim Start analysiert wird, aber sie beantwortet nicht wirklich die Frage, warum Tomcat neu gestartet werden muss, um Änderungen an dieser Datei anzuwenden.
Die Antwort ist, dass ein Teil davon zur Laufzeit mit JMX dynamisch geändert werden kann . Damit dies möglich ist, musste die entsprechende MBean registriert werden (Schritt b6 oben) und SET-Operationen akzeptieren (einige MBeans haben nur eine GET-Schnittstelle).
In Ihrem speziellen Fall gibt es keine Möglichkeit, einen neuen Host zur Laufzeit zu erstellen und zu registrieren, da dies nicht vorgesehen ist. Aus diesem Grund müssen Sie den Tomcat-Prozess neu starten, damit der Bootstrap-Klassenladeprogramm dieses Objekt instanziiert und registriert JMX-Agent.
Anschließend ist es möglich, diesen Host von einem JMX-Client aus zu ändern, z. B. dem jconsole
, der mit einem beliebigen JDK geliefert wird.
Verbinden Sie sich jconsole
mit einem JMX-fähigen Tomcat und durchsuchen Sie die Host-MBean, um alle verfügbaren Attribute zu überprüfen:
und überprüfen Sie alle verfügbaren Vorgänge (einer davon wird unten als Beispiel gezeigt):