2012-08-04 32 views
5

जब मैंने पहली बार अपाचे डिमन का उपयोग करके विंडोज़ के लिए जावा सेवा विकसित की, तो मैंने JVM मोड का उपयोग किया जो मुझे बहुत पसंद आया। आप अपनी कक्षा निर्दिष्ट करते हैं और \ रोक (स्थैतिक) विधियां शुरू करते हैं। लेकिन लिनक्स के साथ, जेएसवीसी ऐसा नहीं लगता है कि इसका एक ही विकल्प है। मैं वास्तव में जानना चाहूंगा क्यों?क्या एक जावा एप्लिकेशन के भीतर एक अलग जेवीएम से विधि कॉल करना संभव है?

वैसे भी अगर मैं लिनक्स की इनिट सिस्टम का उपयोग करने जा रहा हूं, तो मैं उसी व्यवहार को पूरा करने का एक समान तरीका ढूंढने की कोशिश कर रहा हूं जो ऐप को किसी भी तरह से शुरू करना है, लेकिन इसे रोकने के लिए, मुझे एक कॉल करना होगा एक वर्ग में विधि।

मेरा सवाल यह है कि, जार शुरू होने के बाद, मैं अपने आवेदन में एक विधि कॉल करने के लिए जेवीएम पुस्तकालयों या किसी और चीज का उपयोग कैसे कर सकता हूं (जो मेरे आवेदन को को बंद करने का प्रयास करेगा)।

एक और पक्ष सवाल है, एक आवेदन शुरू कर दिया जाता है और अगर मैं यह है कि यदि आवेदन वर्ग है एक में एक main विधि को चलाने के लिए java कमांड लाइन का उपयोग करें कि आवेदन, स्थिर तरीकों है, और अगर main विधि है, जो static एक और कहेंगे कक्षा में स्थैतिक विधि जिसमें मैं समाप्ति संकेत को सिग्नल करना चाहता हूं, क्या वह उसी JVM में कॉल करेगा?

उत्तर

8

क्यों नहीं अपने आवेदन में ShutdownHook जोड़ें?

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

  • एक कार्यक्रम:

    public class ShutdownHookDemo { 
        public void start() { 
         System.out.println("Demo"); 
         ShutdownHook shutdownHook = new ShutdownHook(); 
         Runtime.getRuntime().addShutdownHook(shutdownHook); 
        } 
    
        public static void main(String[] args) { 
         ShutdownHookDemo demo = new ShutdownHookDemo(); 
         demo.start(); 
         try { 
          System.in.read(); 
         } 
         catch(Exception e) { 
         } 
        } 
    } 
    
    class ShutdownHook extends Thread { 
        public void run() { 
         System.out.println("Shutting down"); 
         //terminate all other stuff for the application before it exits 
        } 
    
    } 
    

    यह जब

    बंद हुक रन नोट करना महत्वपूर्ण है:

यह आपके जार बंद होने से पहले शान से समाप्त करने के लिए अनुमति देगा सामान्य रूप से मौजूद है। उदाहरण के लिए, System.exit() को कॉल किया जाता है, या अंतिम गैर-डिमन थ्रेड निकलता है।

  • वर्चुअल मशीन को समाप्त कर दिया गया है। जैसे CTRL-C। यह यूनिक्स सिस्टम पर मारने के लिए -SIGTERM पिड या
  • kill -15 पिड से मेल खाता है।
  • बंद हुक नहीं चलेगा जब:

    • वर्चुअल मशीन रोकता
    • एक SIGKILL संकेत यूनिक्स सिस्टम पर वर्चुअल मशीन की प्रक्रिया के लिए भेजा जाता है। जैसे मारो- सिगकिल पिड या मार -9 पिड
    • एक टर्मिनेट प्रोसेस कॉल विंडोज सिस्टम पर प्रक्रिया में भेजा जाता है।

    आप आप इस का उपयोग कर सकते चाहिए वैकल्पिक रूप से अगर एक कक्षा में एक विधि कॉल करने के:

    public class ReflectionDemo { 
    
        public void print(String str, int value) { 
        System.out.println(str); 
        System.out.println(value); 
        } 
    
        public static int getNumber() { return 42; } 
    
        public static void main(String[] args) throws Exception { 
        Class<?> clazz = ReflectionDemo.class;//class name goes here 
        // static call 
        Method getNumber = clazz.getMethod("getNumber"); 
        int i = (Integer) getNumber.invoke(null /* static */); 
        // instance call 
        Constructor<?> ctor = clazz.getConstructor(); 
        Object instance = ctor.newInstance(); 
        Method print = clazz.getMethod("print", String.class, Integer.TYPE); 
        print.invoke(instance, "Hello, World!", i); 
        } 
    } 
    

    और एक वर्ग को गतिशील लोड करने के लिए:

    ClassLoader loader = URLClassLoader.newInstance(
        new URL[] { yourURL }, 
        getClass().getClassLoader() 
    ); 
    Class<?> clazz = Class.forName("mypackage.MyClass", true, loader); 
    Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class); 
    

    संदर्भ:

    2

    मूल रूप से एक ही रास्ता JVMs के बीच कॉल करने के लिए Sockets के उपयोग के माध्यम या तो सीधे या उस पर आधारित कार्यान्वयन के माध्यम से, RMI

    के रूप में ऐसी है

    अधिक जानकारी के लिए आप http://www.javaworld.com/javaqa/2000-03/03-qa-0324-ipc.html देख सकते हैं