แก้ไข“ server.xml” ใน Tomcat โดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์หรือไม่


10

ฉันแก้ไขไฟล์ "server.xml" ในconfโฟลเดอร์ของ Tomcat 8 ฉันเพิ่มHostแท็กใหม่สำหรับเว็บไซต์ใหม่

ฉันต้องรีสตาร์ทเซิร์ฟเวอร์ Tomcat หรือไม่

ฉันจะให้ Tomcat แยกวิเคราะห์และใช้การแก้ไขใหม่ได้server.xmlหรือไม่



@dawud ขอขอบคุณสำหรับการเชื่อมโยง แต่เรากำลังพูดถึงไม่ได้<Host> <Context>
Basil Bourque

2
ส่วนที่สำคัญserver.xmlคือการแยกวิเคราะห์เมื่อเริ่มต้น ไม่สามารถโหลดซ้ำได้หากไม่มีการรีสตาร์ท
dawud

@dawud ขอบคุณ ฉันเห็นว่าพูดถึงตอนนี้ ฉันทำสิ่งนี้เป็นคำตอบเพื่อที่ฉันจะได้ปิดคำถามนี้
Basil Bourque

คำตอบ:


14

ฉันจะเริ่มต้นด้วยการพูดว่าคำถามนั้นไม่ได้ถูกต้องสมบูรณ์เพราะมันเป็นไปได้ที่จะแก้ไขไฟล์โดยไม่ต้องเริ่มต้น Tomcat ใหม่ แต่การเปลี่ยนแปลงจะถูกเพิกเฉยโดยกระบวนการที่ทำงานอยู่

คำถามจริงจะเป็นวิธีการใช้การเปลี่ยนแปลงserver.xmlโดยไม่ต้องเริ่ม Tomcat ใหม่

การรวบรวมข้อมูลจากกระบวนการเริ่มต้นและหน้าตัวโหลดคลาสบนเอกสารออนไลน์ของ Tomcat เป็นไปได้ที่จะเข้าใจในรายละเอียดเพิ่มเติม

โดยเฉพาะมันอธิบายไว้ในserverStartup.txtและแผนภาพ UML ของกระบวนการเริ่มต้นและส่วนที่เกี่ยวข้องสามารถสรุปได้ดังนี้:

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.

สิ่งนี้เกิดขึ้นหลังจากการสร้าง Bootstrap classloader ของโปรแกรม servlet (Catalina)

ด้วยข้อมูลนี้มันชัดเจนตอนนี้เมื่ออยู่ในขั้นตอนการเริ่มต้นserver.xmlไฟล์จะถูกแจง แต่มันก็ไม่ได้ตอบคำถามที่ว่าทำไมจึงต้องเริ่มต้น Tomcat ใหม่เพื่อใช้การเปลี่ยนแปลงกับไฟล์นี้

คำตอบก็คือบางส่วนหนึ่งของมันสามารถปรับเปลี่ยนได้แบบไดนามิกที่รันไทม์ใช้ JMX เพื่อให้เป็นไปได้ต้องมีการลงทะเบียน MBean ที่เหมาะสม (ขั้นตอน b6 ด้านบน) และต้องยอมรับการดำเนินการของ SET (MBeans บางตัวมีอินเตอร์เฟส GET เท่านั้น)

ในกรณีเฉพาะของคุณไม่มีวิธีในการสร้างและลงทะเบียนโฮสต์ใหม่ที่รันไทม์เนื่องจากไม่มีข้อกำหนดสำหรับมันและนี่คือเหตุผลที่คุณต้องเริ่มต้นกระบวนการ Tomcat ใหม่เพื่อให้ Bootstrap classloader สร้างอินสแตนซ์วัตถุนั้นและลงทะเบียนด้วย เอเจนต์ JMX

หลังจากนั้นเป็นไปได้ที่จะปรับเปลี่ยนโฮสต์นั้นจากไคลเอนต์ JMX เช่นjconsoleที่มาพร้อมกับ JDK ใด ๆ

เชื่อมต่อคุณjconsoleกับ Tomcat ที่เปิดใช้งาน JMX และเรียกดู Host MBean เพื่อตรวจสอบแอตทริบิวต์ที่มีอยู่ทั้งหมด:

jconsole แสดงคุณสมบัติของ Host MBean

และตรวจสอบการดำเนินการทั้งหมดที่มี (หนึ่งในนั้นแสดงด้านล่างเป็นตัวอย่าง):

jconsole แสดงการดำเนินการตัวอย่างบน Host MBean


1
+1 สำหรับแนะนำฉันให้รู้จักกับ JMX
ราชา Anbazhagan

7

ไม่ต้องรีสตาร์ท

หน้าเอกสาร Tomcat สำหรับการ<Context>กล่าวถึง:

…ไฟล์ conf / server.xml หลักไม่สามารถโหลดซ้ำได้โดยไม่ต้องรีสตาร์ท Tomcat


1
upvotes เหล่านั้นควรไปที่ @dawud ... ไม่มีความคิดเห็นอีกต่อไป คำตอบที่แย่สำหรับคนที่กล่าวว่าwe’re talking about <Host>, not <Context>.-1 ขอโทษมันหายากที่ฉันทำเช่นนี้ แต่ที่นั่นฉันต้อง ...
krisFR

@krisFR dawud มีอิสระที่จะเขียนคำตอบได้ตลอดเวลาแล้วหรือตอนนี้ ไม่ใช่ทุกคนที่เล่นเกมนี้เพื่อโหวต
Basil Bourque

1
@krisFR, Basil Bourque ฉันได้เพิ่มคำตอบโดยละเอียดเพื่อให้ครอบคลุมสิ่งนี้ในลักษณะทั่วไป หวังว่ามันจะมีประโยชน์
dawud
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.