2011-02-09 14 views
12

हाय सब मैं एक वर्ग है एक init-विधिअवैध उपयोग: इस वेब आवेदन उदाहरण पहले से ही रोक दिया गया है

<bean id="appStarter" class="com.myapp.myClass" init-method="init" destroy-method="destroy"/> 

myClass एक्सएमएल में परिभाषित किया गया है:

public class myClass{ 

    private Thread t; 

    public void init() { 

      t = new Thread() { 

       @Override 
       public void run() { 
        while (true) 
         try { 
          doStuff(); 
          Thread.sleep(1000); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
       } 

      }; 
      t.start(); 
     } 

public void destroy() { 
     t.interrupt(); 
    } 

} 

जब एप्लिकेशन को इस शुरू होता है धागे ठीक चलते हैं, और सब ठीक काम करता है और कुछ समय बाद मुझे निम्नलिखित अपवाद मिला

INFO: Illegal access: this web application instance has been stopped already. Could not load com.sun.mail.imap.IMAPStore. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. 
java.lang.IllegalStateException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1273) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
    at javax.mail.Session.getService(Session.java:755) 
    at javax.mail.Session.getStore(Session.java:569) 
    at javax.mail.Session.getStore(Session.java:531) 
    at javax.mail.Session.getStore(Session.java:510) 

doStuff विधि में:

public void doStuff(){ 

Session sessioned = Session.getDefaultInstance(System.getProperties(), 
       null); 
     Store store = sessioned.getStore("imap"); 
     store.connect(hostName, userName, password); 
. 
. 
. 

} 

मैं पता नहीं क्यों, किसी भी विचार?

उत्तर

22

टोमकैट और अपाचे को पुनरारंभ करने के बाद समस्या हल हो गई, टोमकैट ऐप के पुराने संस्करण को कैश कर रहा था।

+13

मैं इसे स्थायी रूप से कैसे ठीक कर सकता हूं? इस मुद्दे के लिए मूल कारण क्या है? क्योंकि यह मेरे उत्पादन आवेदन को दुर्घटनाग्रस्त कर रहा है। मैं हर समय सर्वर को पुनरारंभ नहीं करना चाहता ... मदद चाहिए। – vissu

+0

यह दूसरा कर सकता है, टॉमकैट के पुनरारंभ ने समस्या को दूर कर दिया। – Gruber

+1

यह संभवतः एक हॉट डिप्लॉयमेंट समस्या + पहले से ही धागे शुरू कर दिया है, संभवत: अपने धागे नहीं बल्कि तीसरे पक्ष के पुस्तकालयों से। [यहां मेरा जवाब देखें] (http://stackoverflow.com/a/41503819/1075524)। –

6

मुझे संदेह है कि यह आपके ऐप को अनावश्यक करने के प्रयास के बाद होता है। क्या आपने कभी kill off that thread है जिसे आपने init() प्रक्रिया के दौरान प्रारंभ किया है? मैं इसे संबंधित destroy() विधि में करूँगा।

+0

सही, यह अनावश्यकता के बाद होता है, और मैं इस धागे को नहीं मारता, यह कैसे करना है, कृपया सलाह दें? –

+1

कुछ खोज के ठीक बाद मैंने कोड में कुछ बदलाव किए, लेकिन फिर भी वही त्रुटि मिलती है, क्या आप उपरोक्त कोड में परिवर्तन देख सकते हैं? –

+0

जब भी मैंने नष्ट विधि में बाधा का उपयोग किया, तब भी वही अपवाद प्राप्त हुआ –

4

संक्षेप में: यह तब होता है जब आप हॉट-तैनाती वाले वेबएप होते हैं। उदाहरण के लिए, आपका विचार + विकास सर्वर फिर से युद्ध को गर्म-तैनात करता है। थ्रेड, जो पहले बनाए गए हैं अभी भी चल रहे हैं। लेकिन इस बीच उनके क्लासलोडर/संदर्भ अमान्य है और IllegalAccessException/IllegalStateException का सामना करना पड़ता है क्योंकि इसके orgininating वेबपैप (पूर्व रनटाइम-पर्यावरण) को फिर से तैनात किया गया है।

तो, यहां राज्यों के रूप में, पुनरारंभ इस समस्या को स्थायी रूप से हल नहीं करता है। इसके बजाए, प्रबंधित थ्रेड पूल को खोजने/कार्यान्वित करना बेहतर है, एस। इस तरह धागे की समाप्ति को उचित रूप से संभालने के लिए। जावाईई में आप इन प्रबंधित थ्रेडएक्स्यूक्टर सर्विसेज का उपयोग करेंगे। A similar opinion and reference here

इसके लिए उदाहरण अपाचे कॉमन्स पूल के EvictorTread हैं, जो पूल की कॉन्फ़िगरेशन (अधिकतम निष्क्रिय इत्यादि) के अनुसार पूल किए गए उदाहरणों को "साफ़" करता है।