ฉันจะอัปเดตเว็บแอป Tomcat โดยไม่ต้องเริ่มบริการใหม่ทั้งหมดได้อย่างไร


93

Tomcatฉันใหม่ เรามีเครื่อง dev ที่มีแอปทำงานอยู่ประมาณ 5 แอป แม้ว่าจะเป็น dev แต่ลูกค้าของเราก็ใช้งานค่อนข้างหนักในระหว่างการทดสอบ

สมมติว่าเราจำเป็นต้องทำการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ในไฟล์คลาสเดียว ตอนนี้เรามีการปิด Tomcat (มีผลกระทบต่อคนอื่นอีกสี่ปพลิเคชัน) ลบWARไฟล์ (และไดเรกทอรีเว็บแอป) โยกย้ายกำลังคนใหม่ไฟล์และเริ่มต้นใหม่WARTomcat

แน่นอนว่าสิ่งนี้ทำให้บางคนไม่พอใจเพราะมันทำลายเซสชันที่เข้าสู่ระบบทั้งหมดสำหรับแอพทั้งหมด

มีวิธีที่ดีกว่านี้หรือไม่? ฉันหมายถึงมีวิธีรีโหลดเฉพาะCLASSที่เปลี่ยนแทนทุกอย่างบนเครื่อง dev หรือไม่

ขอบคุณ.


เปลี่ยนการจัดการเซสชันของคุณเป็นสิ่งที่ยังคงอยู่ในไฟล์หรือไม่ ขออภัยไม่สามารถต้านทาน :)
rogerdpack

1
@rogerdpack ฉันได้เรียนรู้มากมายเกี่ยวกับ Tomcat ตั้งแต่ฉันถามคำถามนี้เมื่อหกปีที่แล้ว แต่ยังไงก็ตามขอบคุณ
cbmeeks

เกี่ยวกับการแลกเปลี่ยนความร้อนเฉพาะคลาสโปรดดูstackoverflow.com/questions/32459047/…
rogerdpack

คำตอบ:


59

คุณเคยลองใช้แอปพลิเคชัน Tomcat's Managerหรือยัง? ช่วยให้คุณสามารถยกเลิกการปรับใช้ / ปรับใช้ไฟล์สงครามโดยไม่ต้องปิด Tomcat

หากคุณไม่ต้องการใช้แอปพลิเคชัน Manager คุณสามารถลบไฟล์ war จากไดเร็กทอรี webapps ได้ Tomcat จะยกเลิกการใช้งานแอปพลิเคชันหลังจากช่วงเวลาสั้น ๆ จากนั้นคุณสามารถคัดลอกไฟล์ war กลับเข้าไปในไดเร็กทอรีและ Tomcat จะปรับใช้ไฟล์ war

หากคุณใช้ Tomcat บน Windows คุณอาจต้องกำหนดค่า Context ของคุณเพื่อไม่ให้ล็อกไฟล์ต่างๆ

หากคุณไม่สามารถหยุดทำงานได้เลยคุณอาจต้องการดูการปรับใช้ Parallel ของ Tomcat 7 คุณสามารถปรับใช้เว็บแอปพลิเคชันหลายเวอร์ชันที่มีเส้นทางบริบทเดียวกันในเวลาเดียวกัน กฎที่ใช้ในการจับคู่คำขอกับเวอร์ชันบริบทมีดังนี้:

  • หากไม่มีข้อมูลเซสชันอยู่ในคำขอให้ใช้เวอร์ชันล่าสุด
  • หากมีข้อมูลเซสชันอยู่ในคำขอให้ตรวจสอบตัวจัดการเซสชันของแต่ละเวอร์ชันเพื่อหาเซสชันที่ตรงกันและหากพบให้ใช้เวอร์ชันนั้น
  • หากมีข้อมูลเซสชันอยู่ในคำขอ แต่ไม่พบเซสชันที่ตรงกันให้ใช้เวอร์ชันล่าสุด

นั่นเป็นคำแนะนำที่ดีเช่นกัน ฉันไม่เคยได้ยินเกี่ยวกับแอปผู้จัดการจนถึงวันนี้ ใช่เราใช้ Windows ข้อกังวลอย่างหนึ่งที่ฉันมีกับการลบไฟล์ WAR และการรอคอยก็คือลูกค้าของเราคาดหวังว่า คำแนะนำเหล่านั้นใช้ได้กับสถานการณ์นั้นหรือไม่?
cbmeeks

1
@cbmeeks - ขึ้นอยู่กับว่าการแก้ไขเล็กน้อยเหล่านี้เกิดขึ้นบ่อยแค่ไหนและนานแค่ไหนก่อนที่จะมีคนสังเกตเห็น ไม่ว่าในกรณีใดจะมีช่วงเวลาเล็กน้อยที่แอปพลิเคชันไม่สามารถใช้งานได้ ขึ้นอยู่กับฮาร์ดแวร์ / แอปพลิเคชันของคุณว่าระยะเวลานั้นนานแค่ไหน แต่มันวัดเป็นวินาทีฉันมักจะบอกว่า 5-10 ในแอปพลิเคชันของเรา แต่ระยะทางของคุณอาจแตกต่างกันไป :)
Steve K

1
ว้าว. ฉันได้เรียนรู้มากมายตั้งแต่ฉันถามคำถามนี้ ใช่ตอนนี้เราปรับใช้แอพ Tomcat โดยไม่ต้องใช้ Tomcat อย่างสมบูรณ์ สิ่งหนึ่งที่ฉันทำคือตรวจสอบให้แน่ใจว่าการบันทึกทั้งหมด (แอปและ Tomcat) ไม่ได้บันทึกบันทึกไว้ข้างในโฟลเดอร์เว็บแอป / แอปพลิเคชัน หรือการกำหนดค่า Tomcat ไม่ให้ล็อกก็ใช้ได้เช่นกัน ดังนั้นเราจึงวางการบันทึกไว้ที่ส่วนกลางนอกโฟลเดอร์ของ Tomcat ทำงานเหมือนความฝัน แต่คำตอบของคุณมีประโยชน์มากที่สุด ขอบคุณ!
cbmeeks

5
เมื่อปรับใช้งานใหม่โดยไม่ต้องรีสตาร์ทคุณจะต้องระวังหน่วยความจำรั่วบ่อยครั้งที่ตัวโหลดคลาสจะรั่วไหลการอ้างอิงและคุณต้องรีสตาร์ทกระบวนการ Tomcat ทั้งหมดเพื่อเพิ่มหน่วยความจำจากแอปพลิเคชันเวอร์ชันเก่า LiveRebel (กล่าวถึงในคำตอบอื่น) สามารถทำทุกอย่างให้คุณโดยอัตโนมัติ
Neeme Praks

3
คุณไม่จำเป็นต้องลบสงครามเพื่อปรับใช้ใหม่ เพียงแค่คัดลอกสงครามเก่าและรอไม่กี่วินาที
peceps

31

มีหลายวิธีง่ายๆ

  1. เพียงแตะ web.xml ของเว็บแอพใดก็ได้

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

คุณยังสามารถอัปเดตไฟล์ jar เฉพาะใน WEB-INF / lib แล้วแตะ web.xml แทนที่จะสร้างไฟล์ war ทั้งหมดแล้วปรับใช้อีกครั้ง

  1. ลบ webapps / ไดเรกทอรี YOUR_WEB_APP Tomcat จะเริ่มปรับใช้ war ภายใน 5 วินาที (สมมติว่าไฟล์ war ของคุณยังอยู่ในโฟลเดอร์ webapps)

  2. โดยทั่วไปการเขียนทับไฟล์ war ด้วยเวอร์ชันใหม่จะถูกปรับใช้โดย tomcat โดยอัตโนมัติ หากไม่เป็นเช่นนั้นคุณสามารถแตะ web.xml ตามที่อธิบายไว้ข้างต้น

  3. คัดลอก "ไดเร็กทอรี" ที่ระเบิดไปแล้วไปยังโฟลเดอร์ webapps ของคุณ


1
มีประโยชน์ที่จะทราบว่าเมธอด 'สัมผัส' ไม่โหลดคลาสซ้ำ IOW จะไม่ล้างและรีโหลดลำดับชั้น classloader สำหรับ webapp
Rondo

2
ดูว่าเหตุใดจึงสามารถอ่าน$CATALINA_BASE/conf/context.xmlได้ WEB-INF / web.xml ถูกเฝ้าดูการเปลี่ยนแปลง แหล่งข้อมูลอื่น ๆ สามารถระบุไว้ที่นั่นได้อย่างง่ายดายตามต้องการ
Kevin

21

ในไดเรกทอรี conf ของ apache tomcat คุณสามารถค้นหาไฟล์ context.xml ในแท็กแก้ไขนั้นเป็น < Context reloadable = "true" > สิ่งนี้ควรแก้ปัญหาได้และคุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์


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