2010-09-15 9 views
5

को बंद करें, मुझे केवल अपने प्रोग्राम का एक उदाहरण चलाना है। लेकिन मैं इसे पुराने लोगों को बंद करना चाहता हूं, अगर वे खुले हैं।जावा: अगर मेरे पास प्रोग्राम चलाने का एक उदाहरण है, तो मैं इसे कैसे पहचानूं, और फिर पुराने (0)

यह जावा में है।

उत्तर

1

आप एक सर्वर लॉकेट को एक विशेष लॉक के रूप में उपयोग कर सकते हैं।

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

serverSocket = new ServerSocket(localhost:8888) 
if success, 
    start ServerSocketListeningThread 
else 
    socket = new Socket(localhost:8888) 
    socket.close(); 
    sleep(100); 
    repeat attempt of binding server socket 

ServerSocketListeningThread 
    serverSocket.accept(); //block until someone connects 
    System.exit(); 

यह नीचे कमांड लाइन

telnet localhost 8888 
2

यदि एप्लिकेशन Java Web Start का उपयोग करके लॉन्च किया गया है तो यह जेएनएलपी एपीआई की सिंगल इंस्टेंस सेवा का उपयोग कर सकता है। यहां एक demo. of the SIS है।

2

आपके पास हमेशा लॉक फ़ाइल हो सकती है, और सुनिश्चित करें कि आपका प्रोग्राम समाप्त हो गया है यदि यह उस पर एक विशेष लॉक प्राप्त नहीं कर सकता है।

संदर्भ

+0

बस उत्सुक .. यदि ऐप। लिनक्स पर हत्या -9 कहकर लॉक समाप्त हो गया है, क्या जेवीएम समाप्त होने के बाद लॉक जारी किया जाएगा? –

+0

मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह होगा, हाँ। – zigdon

2

मुझे लगता है कि आप एक स्टैंडअलोन जावा कार्यक्रम के बारे में बात कर रहे हैं, प्रत्येक उदाहरण के लिए अपने स्वयं के JVM में चल रहा है। उस मामले में यहां के विकल्प मैं तुम्हारे लिए देख रहे हैं:

  • सेट-अप RMI अपने कार्यक्रमों के बीच कॉल (यह थोड़ा overkill दिखता है)
  • प्रयास करें cajo (मैं इसे अपने आप प्रयास नहीं किया है, लेकिन यह ऐसा लगता है आपकी समस्या का समाधान हो सकता है)
  • यदि आप यूनिक्स/लिनक्स पर हैं, तो मौजूदा प्रक्रिया को मारने के लिए खोल स्क्रिप्ट का आह्वान करें
  • घर से बने समाधान का उपयोग करें, उदाहरण के लिए प्रत्येक बार प्रोग्राम सिस्टम पर एक अद्वितीय नाम वाली फ़ाइल बनाएं एक ही निर्देशिका में मौजूद किसी भी अन्य फ़ाइल को शुरू और हटाएं। फिर समय-समय पर जांच करें कि वर्तमान इंस्टेंस से जुड़ी फाइल अभी भी है (टाइमर का उपयोग करके), यदि यह नहीं है, तो वर्तमान JVM को समाप्त करें।
0

से अपने अनुप्रयोग बंद करने के लिए बस main() विधि में Exiter.isAlone() विधि कॉल आसान है। यह पिछले को मारता है। (यह अपरिवर्तनीय के समाधान का एक कार्यान्वयन है, धन्यवाद) एक सर्वर सॉकेट पोर्ट 8181 (इस उदाहरण में) पर सुन रहा है। अगर इसे कोई अनुरोध मिलता है, तो यह अस्तित्व में है और jvm (System.exist()) को रोकता है। जब आप एक नया एप्लीकेशन लॉन्च करते हैं, तो यह सॉकेट श्रोता स्थापित करने का प्रयास करता है। यदि यह ठीक है, तो पोर्ट व्यस्त है, तो इसे रोकने का अनुरोध भेजता है। विधि isAlone() पिछली हुई हत्या की प्रतीक्षा कर रही है। यदि आप इसे मुख्य (स्ट्रिंग [] एस) विधि की पहली पंक्ति में कॉल करते हैं, तो आप सुनिश्चित हैं कि पिछला हटा दिया गया है।

public class Exiter implements Runnable { 

    private static final Exiter instance = new Exiter(); 
    private ServerSocket serverSocket; 
    private int port = 8181; 
    private boolean bStarting = true; 

    private Exiter() { 
     (new Thread(this)).start(); 
    } 

    @Override 
    public void run() { 

     while (bStarting) { 
      try { 
       serverSocket = new ServerSocket(port); 
       bStarting = false; 
       awake(); 
      } catch (IOException e) { 
       System.err.println("Exiter : "+e.getMessage()+" port "+port); 
       openSocketKillRequest(); 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     } 
     try { 
      Socket s = serverSocket.accept();// Ca bloque 
      System.err.println("Kimll Request from :" + s.getRemoteSocketAddress()); 
      System.exit(0); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    private void openSocketKillRequest() { 
     try { 
      System.err.println("Send request kill previous"); 
      Socket socket = new Socket("localhost", port); 
      socket.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static Exiter getInstance() { 
     return instance; 
    } 

    private synchronized void awake(){ 
     notifyAll(); 
    } 

    public synchronized boolean isAlone() { 
     if(bStarting){ 
      try { 
       wait(); 
      } catch (InterruptedException e) { 

       e.printStackTrace(); 
      } 
     } 
     return true; 
    } 
} 
संबंधित मुद्दे

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