ค่า servlet <load-on-startup> หมายถึงอะไร


174

ฉันเริ่มสับสนที่นี่ ในแอปพลิเคชันของเราเรามีการกำหนด servlets ไว้สองสามรายการ นี่คือข้อความที่ตัดตอนมาจากweb.xmlหนึ่งใน servlets:

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

ตามความเข้าใจของฉันค่าของ<load-on-startup>ต้องเป็นจำนวนเต็มบวกเพื่อให้โหลดโดยอัตโนมัติ ฉันค้นหาใน Google แต่คำตอบที่ฉันพบมี แต่เพิ่มความสับสนให้ฉัน

คำตอบ:


186

Resin 3.0 แสดงพฤติกรรมนี้:

load-on-startup สามารถระบุค่าจำนวนเต็ม (ทางเลือก) ถ้าค่าเป็น 0 หรือมากกว่าแสดงว่าลำดับสำหรับการโหลด servlets, servlets ที่มีตัวเลขสูงกว่าจะโหลดหลังจาก servlets ที่มีตัวเลขต่ำกว่า

JSP 3.1 สเปค (JSR 340) กล่าวว่านี้ในหน้า 14-160:

องค์ประกอบload-on-startupระบุว่าควรโหลด servlet นี้ (สร้างอินสแตนซ์และมีการเรียก init ()) ในการเริ่มต้นเว็บแอ็พพลิเคชัน เนื้อหาองค์ประกอบขององค์ประกอบนี้ต้องเป็นจำนวนเต็มที่ระบุลำดับที่ควรโหลด servlet ถ้าค่าเป็นจำนวนเต็มลบหรือองค์ประกอบไม่มีอยู่คอนเทนเนอร์จะโหลด servlet ได้ฟรีทุกครั้งที่เลือก หากค่าเป็นจำนวนเต็มบวกหรือ 0 คอนเทนเนอร์ต้องโหลดและเตรียมข้อมูลเบื้องต้น servlet เมื่อแอปพลิเคชันถูกปรับใช้ คอนเทนเนอร์ต้องรับประกันว่า servlets ที่ทำเครื่องหมายด้วยจำนวนเต็มต่ำกว่าจะถูกโหลดก่อน servlets ที่มีเครื่องหมายจำนวนเต็มสูง คอนเทนเนอร์อาจเลือกลำดับการโหลด servlets ที่มีload-on-startupค่าเดียวกัน

คุณอาจต้องการตรวจสอบไม่เพียง แต่ JSR เท่านั้น แต่ยังรวมถึงเอกสารสำหรับเว็บคอนเทนเนอร์ของคุณด้วย อาจมีความแตกต่าง


Cletus ผิดในคำตอบของเขา คุณควรพิจารณาแก้ไขโพสต์
Alboz

3
จะเกิดอะไรขึ้นเมื่อไม่ได้ระบุ load on startup?
Nirmal

1
@Nirmal ย่อหน้าที่สองระบุว่าหากองค์ประกอบไม่มีอยู่จะมีลักษณะการทำงานเหมือนกับว่าเป็นค่าลบกล่าวคือคอนเทนเนอร์มีอิสระในการโหลด servlet เมื่อใดก็ตามที่เลือก
Finnegan

129

คำตอบแบบสั้น : ค่า> = 0 หมายความว่ามีการโหลด servlet เมื่อปรับใช้เว็บแอปหรือเมื่อเซิร์ฟเวอร์เริ่มทำงาน ค่า <0: servlet ถูกโหลดเมื่อใดก็ตามที่รู้สึกเหมือนคอนเทนเนอร์

คำตอบแบบยาว (จากข้อมูลจำเพาะ):

อิลิเมนต์ load-on-startup ระบุว่าควรโหลด servlet นี้ (สร้างอินสแตนซ์และมีการเรียก init ()) เมื่อเริ่มต้นเว็บแอ็พพลิเคชัน เนื้อหาที่เป็นทางเลือกขององค์ประกอบเหล่านี้ต้องเป็นจำนวนเต็มที่ระบุลำดับที่ควรโหลด servlet ถ้าค่าเป็นจำนวนเต็มลบหรือองค์ประกอบไม่มีอยู่คอนเทนเนอร์จะโหลด servlet ได้ฟรีทุกครั้งที่เลือก ถ้าค่าเป็นจำนวนเต็ม 128 บวกหรือ 0 คอนเทนเนอร์ต้องโหลดและเตรียมข้อมูลเบื้องต้น servlet เมื่อแอปพลิเคชันถูกปรับใช้ คอนเทนเนอร์ต้องรับประกันว่า servlets ที่ทำเครื่องหมายด้วยจำนวนเต็มต่ำกว่าจะถูกโหลดก่อน servlets ที่ทำเครื่องหมายด้วยจำนวนเต็มสูงกว่า คอนเทนเนอร์อาจเลือกลำดับการโหลด servlets ที่มีค่า load-on-start-up เดียวกัน


1
และที่ว่าทำไมเราทำเครื่องหมาย 0 สำหรับ DispatcherServlet inorder โหลดมันเป็นครั้งแรกเมื่อโปรแกรมเริ่มต้น ..
โชคดี

11

แสดงว่า servlet จะไม่เริ่มทำงานจนกว่าจะมีการร้องขอพยายามเข้าถึง

หาก load-on-startup มีค่ามากกว่าหรือเท่ากับศูนย์เมื่อคอนเทนเนอร์เริ่มทำงานมันจะเริ่ม servlet นั้นตามลำดับจากน้อยไปหามากของภาระในค่าเริ่มต้นที่คุณใส่ไว้ที่นั่น (เช่น 0, 1 จากนั้น 2 จากนั้น 5 แล้วก็ 10 เป็นต้น) .


7
Zero ทำให้โหลดได้เช่นกัน ไม่รับประกันเฉพาะค่าลบ: "[... ] ถ้าค่าเป็นจำนวนเต็มบวกหรือ 0 คอนเทนเนอร์ต้องโหลดและเตรียมใช้งาน servlet เมื่อแอปพลิเคชันถูกปรับใช้ [... ]"
marabol

1
@cletus ฉันคิดว่าควรแก้ไขค่าที่มากกว่าศูนย์ด้วย ค่าที่มากกว่าหรือเท่ากับศูนย์เนื่องจากผู้ใช้จำนวนมากอ่านคำตอบของคุณตามที่ระบุไว้ตามคำตอบที่ยอมรับ ขอบคุณล่วงหน้า
Tarik

9

วงจรชีวิตของ Servlet

วงจรชีวิตของ servlet ถูกควบคุมโดยคอนเทนเนอร์ที่ใช้ servlet เมื่อคำร้องขอถูกแมปกับ servlet คอนเทนเนอร์จะดำเนินการตามขั้นตอนต่อไปนี้

  1. หากไม่มีอินสแตนซ์ของ servlet อยู่เว็บคอนเทนเนอร์:

    ก. โหลดคลาส servlet

    ข. สร้างอินสแตนซ์ของคลาส servlet

    ค. เริ่มต้นอินสแตนซ์ servlet โดยการเรียกใช้เมธอด init (การกำหนดค่าเริ่มต้นครอบคลุมในการสร้างและการเตรียมใช้งาน Servlet )

  2. คอนเทนเนอร์เรียกใช้วิธีการบริการส่งผ่านคำขอและอ็อบเจ็กต์การตอบสนอง วิธีการบริการจะกล่าวถึงในการบริการการเขียน

ค่า 0 บนload-on-startupหมายความว่าจุด 1 ถูกดำเนินการเมื่อมีการร้องขอไปยัง servlet นั้น ค่าอื่น ๆ หมายความว่าจุดที่ 1 ถูกเรียกใช้เมื่อเริ่มต้นคอนเทนเนอร์


คำตอบไร้ที่ติ!
Gaurav

1

ตามที่ระบุไว้ในคำตอบอื่น ๆ และศูนย์บทความการโหลดเมื่อเริ่มต้นนี้เป็นที่ยอมรับได้และหากไม่มี servlet อื่นใดสิ่งนี้จะให้ความสำคัญกับการโหลดและโหลดระหว่างการปรับใช้ การใช้ load-on statup ที่ดีที่สุดคือการโหลด servlets ซึ่งใช้เวลานานกว่าในการเริ่มต้นก่อนที่คำขอแรกจะมาเหมือน servlets ที่สร้างพูลการเชื่อมต่อหรือโทรผ่านเครือข่ายหรือถือทรัพยากรขนาดใหญ่ซึ่งจะช่วยลดเวลาตอบสนองสำหรับคำขอสองสามรายการแรกลงอย่างมาก


1
  1. หากค่าสำหรับสอง servlet เหมือนกันเกินกว่าที่จะโหลดตามลำดับที่ประกาศไว้ในไฟล์ web.xml
  2. ถ้าเป็น 0 หรือจำนวนเต็มลบมากกว่า Servlet จะถูกโหลดเมื่อ Container รู้สึกว่าโหลดได้
  3. รับประกันการโหลดการเริ่มต้นและการเรียกใช้วิธีการ init () ของ servlet โดยคอนเทนเนอร์เว็บ
  4. หากไม่มีองค์ประกอบสำหรับ servlet ใด ๆ เกินกว่าที่จะโหลดเมื่อคอนเทนเนอร์เว็บตัดสินใจโหลด

0

ใช่มันสามารถมีค่าเดียวกัน .... เหตุผลในการให้ตัวเลขสำหรับ load-on-startup คือการกำหนดลำดับสำหรับเซิร์ฟเวอร์เพื่อโหลด servlet ทั้งหมด servlet ที่มีค่า load-on-startup จะโหลดก่อนและ servlet ที่มีค่า 1 จะโหลดหลังจากนั้น

หากสอง servlets จะมีค่าสำหรับ load-on-startup เท่ากันมากกว่าที่จะโหลดด้วยวิธีการประกาศใน web.xml จากบนลงล่าง servlet ที่มาก่อนใน web.xml จะถูกโหลดก่อนและอีกอันจะถูกโหลดหลังจากนั้น


0

-> (ไม่มีแท็ก load-on-start-up) ประการแรกเมื่อใช้ servlet ในเซิร์ฟเวอร์เป็นความรับผิดชอบของเซิร์ฟเวอร์ในการสร้างวัตถุ servlet เช่น: สมมติว่า Servlet ถูกปรับใช้ในเซิร์ฟเวอร์ไคลเอนต์ (Servlet Object ไม่พร้อมใช้งานในเซิร์ฟเวอร์) ไคลเอ็นต์ส่งคำขอไปยัง servlet เป็นครั้งแรกจากนั้นเซิร์ฟเวอร์จะสร้างวัตถุ servlet ด้วยความช่วยเหลือของตัวสร้างเริ่มต้นและเรียกใช้ init () ทันที จากนั้นเมื่อไคลเอนต์ส่งคำขอบริการวิธีเดียวจะได้รับการดำเนินการเมื่อวัตถุพร้อมใช้งานแล้ว

หากใช้แท็ก load-on-start-up ใน deployment descriptor: ในช่วงเวลาของการปรับใช้เซิร์ฟเวอร์จะสร้างออบเจ็กต์ servlet สำหรับ servlet โดยยึดตามค่าบวกที่ระบุระหว่างแท็ก การสร้างอ็อบเจ็กต์สำหรับคลาส servlet จะตามมาจาก 0-128 0 number servlet จะถูกสร้างขึ้นก่อนและตามด้วยตัวเลขอื่น ๆ

หากเราให้ค่าเดียวกันสำหรับสอง servlets ใน web.xml การสร้างอ็อบเจ็กต์จะทำตามตำแหน่งของคลาสใน web.xml ก็แตกต่างกันไปในแต่ละเซิร์ฟเวอร์

หากเราระบุค่าลบระหว่างโหลดบนแท็กเริ่มต้นเซิร์ฟเวอร์จะไม่สร้างออบเจ็กต์ servlet

สถานการณ์อื่น ๆ ที่เซิร์ฟเวอร์สร้างอ็อบเจ็กต์สำหรับ servlet

ถ้าเราไม่ใช้ load บนแท็ก start up ใน web.xml โปรเจ็กต์จะถูกปรับใช้เมื่อไคลเอนต์ส่งคำขอเป็นครั้งแรกที่เซิร์ฟเวอร์สร้างอ็อบเจ็กต์และเซิร์ฟเวอร์จะรับผิดชอบในการเรียกใช้เมธอดวงจรชีวิต จากนั้นหากมีการแก้ไข. class ในเซิร์ฟเวอร์ (tomcat) ไคลเอนต์อีกครั้งส่งคำร้องขอสำหรับ servlet ที่แก้ไข แต่ในกรณีของอ็อบเจ็กต์ใหม่ tomcat จะไม่ถูกสร้างขึ้นและเซิร์ฟเวอร์จะใช้อ็อบเจ็กต์ที่มีอยู่เว้นแต่จะรีสตาร์ทเซิร์ฟเวอร์ แต่ในคลาสของเว็บตรรกะเมื่อไฟล์. class ถูกแก้ไขในเซิร์ฟเวอร์โดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์หากได้รับคำขอจากนั้นเซิร์ฟเวอร์เรียกเมธอดทำลายบน servlet ที่มีอยู่และสร้างอ็อบเจ็กต์ servlet ใหม่และเรียกใช้ init () สำหรับการเริ่มต้น .


-1

ถ้าค่าเป็น <0 serlet จะถูกสร้างอินสแตนซ์เมื่อมีการร้องขออื่น ๆ > = 0 คอนเทนเนอร์จะโหลดตามลำดับที่เพิ่มขึ้นของค่า ถ้า 2 servlets หรือมากกว่ามีค่าเดียวกันดังนั้นลำดับของ servlets ที่ประกาศใน web.xml


-2

คอนเทนเนอร์ servlet โหลด servlet ระหว่างการเริ่มทำงานหรือเมื่อมีการร้องขอครั้งแรก การโหลด servlet ขึ้นอยู่กับแอตทริบิวต์ "load-on-startup" ในไฟล์ "web.xml" หากแอตทริบิวต์มีจำนวนเต็มบวก (0 ถึง 128) แล้ว servlet จะโหลดพร้อมกับการโหลดคอนเทนเนอร์มิฉะนั้นจะโหลดเมื่อมีการร้องขอครั้งแรกสำหรับการบริการ

เมื่อโหลด servlet เมื่อได้รับคำขอจะเรียกว่า "Lazy loading"


-6

เป็นเรื่องง่ายอย่างที่คุณไม่คาดคิด

หากค่าเป็นบวกจะโหลดเมื่อคอนเทนเนอร์เริ่มทำงาน

หากค่าไม่เป็นบวกเกินกว่าที่จะโหลด servelet เมื่อมีการร้องขอ

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