2015-11-26 13 views
22

में संसाधनों को तैनात करना मुझे जर्सी सर्वलेटकंटनर में संसाधनों को गर्म-तैनाती और संसाधनों की आवश्यकता है।गतिशील रूप से (संयुक्त) जर्सी

संसाधन संसाधन पर संसाधनों को 'अनधिकृत' करने का कोई तरीका नहीं लगता है, इसलिए जिस मार्ग का मैं अनुसरण कर रहा हूं वह सभी संसाधनों को नए सेट के साथ प्रतिस्थापित करना है।

हालांकि the documentation कहता है रजिस्टर संसाधन संसाधनों पर स्रोत स्रोत संसाधन कोड के माध्यम से ब्राउज़ करने से सभी संसाधनों को प्रतिस्थापित करता है।

मुझे जो समाधान मिला वह सर्वलेटकॉन्टेनर को पूरी तरह से नए संसाधन कॉनफिग के साथ पुनः लोड करना था।

Set<Class<?>> classes = ... 
ResourceConfig config = new ResourceConfig(classes); 
container.reload(config); 

यह ठीक काम करता है जब तक मैं एक संसाधन है कि एक ModelValidationException में जो परिणाम को तैनात। उसके बाद मैं ServletContainer को उचित स्थिति में वापस नहीं प्राप्त कर सकता।

अगर मैं स्रोत कोड पर एक नज़र डालें:

public void reload(final ResourceConfig configuration) { 
    try { 
     containerListener.onShutdown(this); 

     webComponent = new WebComponent(webComponent.webConfig, configuration); 
     containerListener = webComponent.appHandler; 
     containerListener.onReload(this); 
     containerListener.onStartup(this); 
    } catch (final ServletException ex) { 
     LOGGER.log(Level.SEVERE, "Reload failed", ex); 
    } 
} 

ModelValidationException WebComponent निर्माता से फेंक दिया है। उसके बाद ऑनशॉटडाउन विधि से अपवाद में परिणामों को पुनः लोड करने के लिए कोई भी कॉल, ServiceLocatorImpl की प्रीडेस्ट्राय विधि में चेकस्टेट के कारण होता है।

मैं, वास्तव में सत्यापन त्रुटियों

ResourceConfig config = new ResourceConfig(classes); 
config.property(ServerProperties.RESOURCE_VALIDATION_IGNORE_ERRORS, 
    Boolean.TRUE); 
container.reload(config); 

कोई रास्ता नहीं अनदेखी अब तथापि बाहर अगर वहाँ किसी भी त्रुटि लेकिन लॉगिंग, जो बस के रूप में बुरा है पता लगाने के लिए थे खोजने के लिए वहाँ है द्वारा अपवाद बच सकते हैं।

प्रति heenenee's comment मैंने ServletContainer subclassing करने की कोशिश की, लेकिन ऐसा कुछ समस्याएं देता है क्योंकि संसाधन कॉनफिग को दो वेबकंपोनेंट्स में नहीं रखा जा सकता है।

मैं नीचे बंद, एक प्रारंभिक बाहर निकलने के पाने के लिए पहले WebComponent बनाने की कोशिश की है, लेकिन इस वास्तविक पुनः लोड विफल रहता है वहाँ संसाधनों में कोई त्रुटि है (क्योंकि resourceconfig के बाद webcomponent बना दिया गया है संशोधित नहीं किया जा सकता है)

@Override 
public void reload(ResourceConfig configuration) { 
    try { 
     new WebComponent(new WebServletConfig(this), configuration); 
    } catch (ServletException e) { 
     LOGGER.log(Level.SEVERE, "Reload failed", e); 
     List<ResourceModelIssue> resources = Collections.emptyList(); 
     throw new ModelValidationException(e.getMessage(), resources); 
    } 
    super.reload(configuration); 
} 

क्या हॉट-बेरोज़गार संसाधनों का कोई और तरीका है? असफल रीलोड के बाद ServletContainer को रीसेट करने का कोई तरीका है?

+0

आप उपवर्ग के लिए 'ServletContainer', ओवरराइड' पुनः लोड (ResourceConfig) की कोशिश कर सकते '' पकड़ने के लिए RuntimeException' और एक त्रुटि प्रवेश करें, फिर अपने web.xml में अपने उपवर्ग निर्दिष्ट करें। – heenenee

उत्तर

1

मुझे नहीं लगता कि यह एक हॉटलेट कंटेनर के उपयोग के बिना हासिल किया जा सकता है जो गर्म तैनाती का समर्थन करता है। मेरे अनुभव में, ऐसा करने का एक अच्छा तरीका एक कंटेनर का उपयोग कर रहा है जो ओएसजीआई का समर्थन करता है। आप Eclipse Virgo या Apache Karaf पर एक नज़र डाल सकते हैं।

उदाहरण के लिए, ओएसजीआई पर्यावरण में, आप मॉड्यूल (जिसे बंडल कहा जाता है) बना सकते हैं जिसे स्कैन किए गए फ़ोल्डर में छोड़ दिया जा सकता है ताकि कुछ सुविधाओं को अक्षम करने के लिए रनटाइम पर सुविधाओं को सक्षम किया जा सके या किसी फ़ोल्डर से हटा दिया जा सके। यह इसी प्रकार है कि प्लगइन्स ग्रहण आईडीई में कैसे काम करते हैं, जहां एक नई प्लगइन इंस्टॉल/अनइंस्टॉल करने की आवश्यकता नहीं होती है, उसे पुनरारंभ करने की आवश्यकता नहीं होती है।

+0

मैं सहमत हूं। मॉड्यूलर वेब एप्लिकेशन के लिए यह बिल्कुल उपयोग का मामला है। आपको ओएसजीआई कंटेनर में अपनी जेएक्स-आरएस सेवाओं को @Path के साथ एनोटेटेड करने की आवश्यकता है जो पूर्वनिर्धारित इंटरफेस को संतुष्ट करता है। सर्वलेट कार्यान्वयन (एक बंडल) आपकी सेवाएं पायेगा और HTTP के माध्यम से प्रकाशित होगा। ओएसजीआई कंटेनर आपकी सेवा और सर्विसलेट को रनटाइम पर एक साथ तारों के लिए ज़िम्मेदार है। – Leo

0

जर्सी तकनीकी रूप से एक सर्वलेट कंटेनर नहीं है, यह एक आरईएसटी/जैक्सबी ढांचा है जो एक सर्वलेट कंटेनर पर चल रहा है।

अधिकतर एम्बेड करने योग्य सर्वलेट कंटेनर, टोमकैट, जेट्टी, ग्रीज़ली आपको रनटाइम पर एप्लिकेशन और सर्लेट को फिर से तैनात करने की अनुमति देता है। लेकिन पुनर्वितरण आमतौर पर ऐसी सुविधा नहीं है जिसका उपयोग आप कोड में कंटेनर एम्बेड करते समय करते हैं।

गर्म पुनर्वितरण उत्पादन में सबसे उपयोगी है, जिससे आप लगातार नए संस्करणों को तैनात कर सकते हैं। टॉमकैट पर आपके पास एक ही सर्वर पर तैनात किए गए एप्लिकेशन का नया और पुराना संस्करण हो सकता है, और टॉमकैट यह सुनिश्चित करता है कि एप्लिकेशन पर नवीनतम संस्करण पर नए सत्र शुरू हो जाएं, लेकिन पुराने संस्करण उन एप्लिकेशन संस्करण का उपयोग करना जारी रखेंगे, जिनके साथ वे शुरू किए गए थे। जब कोई एप्लिकेशन उपयोग नहीं किया जाता है तो यह स्वचालित रूप से बेरोजगार होता है।

संबंधित मुद्दे