2012-07-20 6 views
5

ऑटो रीकनेक्ट करता है। मैं वर्तमान में टिकाऊ सब्सक्रिप्शन के लिए एक मैसेंजर सेवा प्रोग्रामिंग कर रहा हूं (यह तब तक टिकाऊ हो सकता है जब हम अभी भी उस पर चर्चा कर रहे हैं) और मैं कुछ सुझावों को ढूंढ रहा था कि कैसे एक परिदृश्य को संभालें जहां हमारा सर्वर किसी भी कारण से अस्थायी रूप से नीचे चला जाता है और हमें स्वचालित रूप से विषय पर पुनः सदस्यता लेने की आवश्यकता होती है। यहां नमूना कोड है कि यह कैसे कनेक्ट करता है:एक जेएमएस कनेक्शन स्थापित करने का आदर्श तरीका है, इसलिए यह

public void DurableChatter(String broker, String username, String password) 
{ 
    javax.jms.MessageProducer publisher = null; 
    javax.jms.MessageConsumer subscriber = null; 
    javax.jms.Topic topic = null; 

    //Create a connection: 
    try{ 
     javax.jms.ConnectionFactory factory; 
     factory = (new progress.message.jclient.ConnectionFactory (broker)); 
     connection = factory.createConnection (username, password); 

     //Durable Subscriptions are indexed by username, clientID and subscription name 
     //It is a good proactice to set the clientID: 
     connection.setClientID(CLIENT_ID); 
     pubSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE); 
     subSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE); 
    } 
    catch (javax.jms.JMSException jmse){ 
     System.err.println ("Error: Cannot connect to Broker - " + broker); 
     jmse.printStackTrace(); 
     System.exit(1); 
    } 

    //Create Publisher and Durable Subscriber: 
    try{ 

     topic = pubSession.createTopic(APP_TOPIC); 
     subscriber = subSession.createDurableSubscriber(topic, "SampleSubscription"); 
     subscriber.setMessageListener(this); 
     publisher = pubSession.createProducer(topic); 
     connection.start(); 
    } 
    catch (javax.jms.JMSException jmse){ 
     System.out.println("Error: connection not started."); 
     jmse.printStackTrace(); 
     System.exit(1); 
    } 

    //Wait for user input 

    try 
    { 
     System.out.println("Enter text to send as message and press enter."); 
     java.io.BufferedReader stdin = 
      new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); 
     while (true) 
     { 
      String s = stdin.readLine(); 

      if(s == null){ 
       exit(); 
      } 
      else if (s.length()>0) 
      { 
       try 
       { 
        javax.jms.TextMessage msg = pubSession.createTextMessage(); 
        msg.setText(username + ": " + s); 
        //Publish the message persistantly: 
        publisher.send(
         msg,        //message 
         javax.jms.DeliveryMode.PERSISTENT, //publish persistantly 
         javax.jms.Message.DEFAULT_PRIORITY,//priority 
         MESSAGE_LIFESPAN);     //Time to Live 
       } 
       catch (javax.jms.JMSException jmse){ 
        System.err.println("Error publishing message:" + jmse.getMessage()); 
       } 
      } 
     } 
    } 
    catch (java.io.IOException ioe) 
    { 
     ioe.printStackTrace(); 
    } 
} 

उत्तर

0

आपको विफलता का पता लगाने की कितनी तेज़ी से आवश्यकता है? अपना प्रोटोकॉल सेट अप करें ताकि यह गारंटी देता है कि हर क्लाइंट को कम से कम एक मिनट में एक संदेश भेजा जाता है (आपको अपने संचार प्रोटोकॉल में कुछ नया "फ्लफ" रखरखाव संदेश जोड़ना होगा) - किसी भी क्लाइंट को रखरखाव संदेश नहीं मिल रहा है सुरक्षित रूप से ग्रहण कर सकता है सर्वर नीचे है और पुनः कनेक्ट करना शुरू करें।

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

+0

यदि आप यही पूछ रहे हैं तो यह तत्काल नहीं होना चाहिए। क्या वैसे भी यह कोशिश/पकड़ ब्लॉक के साथ किया जा सकता है? – Icebreaker

+0

केवल तभी अंतर्निहित कनेक्शन कुछ अलग अपवाद फेंकता है जब इसे तोड़ दिया जाता है। मैं कोशिश किए बिना आपको नहीं बता सका। – radai

3

आपको अपने ग्राहक को implement javax.jmsExceptionListener बनाना चाहिए।

यह आपके क्लाइंट को कनेक्शन खो जाने पर तुरंत जेएमएस एपीआई से कॉलबैक प्राप्त करने की अनुमति देगा, भले ही आपका एप्लिकेशन इस समय कुछ भी प्रकाशित करने के लिए तैयार नहीं है।

Connection बनाने के बाद, कनेक्टिंग और इसे शुरू करने के बाद, connection.setExceptionListener(myListener) पर कॉल करें। Connection के लिए जावाडोक भी देखें।

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

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