Saya akan mulai dengan mengatakan bahwa pertanyaannya tidak sepenuhnya dibuat dengan benar, karena sangat mungkin untuk benar-benar mengedit file tanpa me-restart Tomcat, tetapi perubahannya diabaikan oleh proses yang berjalan.
Pertanyaan sebenarnya adalah bagaimana menerapkan perubahan server.xml
tanpa memulai ulang Tomcat.
Mengumpulkan informasi dari proses permulaan dan halaman pemuat kelas pada dokumentasi online Tomcat, dimungkinkan untuk memahami ini secara lebih rinci.
Lebih khusus, dijelaskan di serverStartup.txt dan diagram UML dari proses startup dan bagian-bagian yang relevan dapat diringkas sebagai berikut:
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.
Ini terjadi setelah penciptaan classloader Bootstrap dari mesin servlet (Catalina).
Dengan informasi ini, jelas sekarang ketika dalam proses startup server.xml
file diurai, tetapi tidak benar-benar menjawab pertanyaan mengapa diperlukan untuk memulai kembali Tomcat untuk menerapkan perubahan pada file ini.
Jawabannya adalah bahwa beberapa bagian dapat dimodifikasi secara dinamis saat runtime menggunakan JMX . Agar hal ini dimungkinkan, MBean yang sesuai harus didaftarkan (b6 langkah di atas), dan juga harus menerima operasi SET (beberapa MB hanya memiliki antarmuka GET).
Dalam kasus spesifik Anda, tidak ada cara untuk membuat dan mendaftarkan Host baru pada saat runtime karena tidak ada ketentuan untuk itu, dan ini adalah alasan mengapa Anda harus memulai kembali proses Tomcat untuk membuat bootloader classloader instantiate objek itu dan mendaftarkannya dengan Agen JMX.
Setelah itu, dimungkinkan untuk memodifikasi host itu dari klien JMX seperti jconsole
yang dibundel dengan JDK apa pun.
Hubungkan Anda jconsole
ke Tomcat yang diaktifkan JMX dan telusuri Host MBean untuk memeriksa semua atribut yang tersedia:
dan periksa semua operasi yang tersedia (salah satunya ditunjukkan di bawah sebagai contoh):