2012-12-18 14 views
8

मेरे पास ServletContextListener लागू करने वाला एक वर्ग है जो स्टार्टअप पर कुछ संसाधन लोड करता है।ServletContextListener में अपवाद पर टॉमकैट स्टार्टअप को कैसे रोकें?

वे संसाधन इस एप्लिकेशन के लिए महत्वपूर्ण हैं कि मैं अपने लॉजिक में कुछ खराब घटना होने पर पूरे स्टार्टअप को विफल करना चाहता हूं।

क्या कोई आदेश है जिसे मैं ServletContextListener.contextInitialized() विधि के अंदर से निष्पादित कर सकता हूं ताकि पूरे टॉमकैट स्टार्टअप को रोक और विफल कर सकें?

+0

किसी System.exit (1) की तुलना में किसी अन्य तरीके से मिला? – Bastien

+0

@ बास्टियन, स्प्रिंगबूट –

+2

@ लियो अप्रासंगिक का उपयोग करें। प्रश्न का सही उत्तर इस बात का एक स्पष्टीकरण होगा कि स्प्रिंगबूट इस समस्या का प्रबंधन कैसे करता है। – Bastien

उत्तर

11

कोशिश निर्दिष्ट करना:

-Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE=true 
अपने java क्रम विकल्पों में

, official documentation उद्धृत:

सच है, तो सर्वर से बाहर हो जाएंगे सर्वर प्रारंभ चरण के दौरान एक अपवाद होता है अगर।

यदि निर्दिष्ट नहीं है, तो गलत का डिफ़ॉल्ट मान उपयोग किया जाएगा।

अद्यतन:

आप कोड द्वारा ऐसा करना चाहते हैं, तो होगा System.exit() काम करता है?

public class FailFastListener implements ServletContextListener { 

    private static final Logger log = LoggerFactory.getLogger(FailFastListener.class); 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     try { 
      //initialization 
     } catch(Exception e) { 
      log.error("Sooo bad, shutting down", e); 
      System.exit(1); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    } 
} 

आप पैटर्न का उपयोग कर सकते हैं उन्हें अव्यवस्थित किए बिना मौजूदा श्रोताओं रैप करने के लिए। सुनिश्चित नहीं है कि टॉमकैट आपको कैसे प्रतिक्रिया देगा ...

+0

धन्यवाद, जो लगभग मेरी समस्या हल करता है, लेकिन ... मैं इसे कोड निष्पादन द्वारा कर रहा हूं। यदि असंभव है - मैं रनटाइम ऑप्ट का उपयोग करूंगा। – urir

+1

@urir: मेरा अपडेट देखें –

+0

हाँ :) जादुई System.exit (1) :) मुझे पता है, मुझे मुझे एक स्पष्ट तरीके से प्रश्न रखना चाहिए ... तो ... टॉमकैट कंटेनर को पुनर्प्राप्त करने के माध्यम से इसे करने का कोई तरीका ? मुख्य कारण मुझे डर है कि System.exit जीवन चक्र में अन्य घटनाओं को बंद नहीं करेगा, जैसे कि अन्य श्रोताओं के विनाश 'कोड ... आप उस पर क्या सोचते हैं? सुरक्षा प्रबंधक सक्षम होने पर – urir

0

यदि आप टोमकैट को रोकना चाहते हैं क्योंकि आपका वेबपैप तैनात करने में विफल रहा है, तो मुझे लगता है कि आपके पास टॉमकैट पर अन्य ऐप्स तैनात नहीं हैं। उस मामले में आप एम्बेडेड टोमकैट/जेट्टी के साथ एक स्टैंडअलोन वेबपैप के रूप में इस ऐप को क्यों नहीं बनाते? इस तरह, जब तक आपका वेबपैप ठीक से शुरू नहीं होता है, तब तक एम्बेडेड सर्वर भी बंद हो जाएगा।

मेरे लिए ऐसा लगता है कि ServletContextListener कोई समस्या नहीं है, जो ServletContextListener के लिए है।

System.exit() का उपयोग न करें क्योंकि यह सर्वर को मार देगा जो मुझे अन्य तैनात ऐप्स चला सकता है। यदि यह ठीक है क्योंकि आप जानते हैं कि कभी भी अन्य ऐप्स नहीं होंगे (और आप नहीं चाहते हैं), तो एक स्टैंडअलोन वेबपैप बनाएं। यह खराब अभ्यास सीडब्ल्यूई में संभावित कमजोरी के रूप में सूचीबद्ध है: CWE-382

बस एक संकेत: वसंत बूट एम्बेडेड सर्वर के साथ एक स्टैंडअलोन वेबपैप बनाने के प्रयास की सुविधा प्रदान करता है। इस गाइड देखें: https://spring.io/guides/gs/spring-boot/

अच्छा लेख का कारण बताते हुए यह शायद आप के लिए क्या देख रहे हैं: http://www.beyondjava.net/blog/application-servers-sort-of-dead/

+0

डाउनवॉटर ... क्या आप कृपया बताएं क्यों? –

+0

हाय डाउनवॉटर, इसके बारे में कैसे? http://cwe.mitre.org/data/definitions/382.html –

+1

मैंने आपको सामान्य रूप से सही बताया है, हालांकि टॉमकैट एक विशेष मामला है क्योंकि एम्बेडेड टॉमकैट हमेशा सचमुच एम्बेडेड नहीं होता है ... यह एकाधिक क्लासलोडर है अभी भी उपयोग किया जाता है। उदाहरण के लिए टॉमकैट मेवेन प्लगइन एक एकल WAR को निष्पादन योग्य JAR ** में बदल देगा ** लेकिन ** यह वास्तव में सामान्य टोमकैट के समान ही चल रहा है। स्प्रिंग बूट ऐसा नहीं करता क्योंकि यह माता-पिता है और टोमकैट उसी क्लासलोडर में चलता है। वास्तव में एकाधिक क्लासलोडर (टॉमकैट मेवेन प्लगइन तरीका) होने का लाभ है क्योंकि आप टॉमकैट जार (जैसे लॉगिंग में इसकी पसंद) के साथ मुद्दों से बच सकते हैं। –

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