2012-07-20 23 views
5

Jestem obecnie programowanie usługi Messenger dla wytrzymałych subskrypcji (może to skończyć się nie trwała nadal jesteśmy omawianie tego) i szukałem pewnych sugestii, w jaki sposób obsłużyć scenariusz, w którym nasz serwer tymczasowo nie działa z jakiegoś powodu i musimy ponownie automatycznie przesłać subskrypcję tematu. Oto przykładowy kod tego, jak się łączy:idealnym sposobem, aby skonfigurować połączenie JMS więc auto ponownie łączy

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(); 
    } 
} 

Odpowiedz

0

jak szybko potrzebujesz wykrywanie awarii? skonfigurować protokół, tak aby każdy klient gwarantuje wysyłana jest wiadomość co najmniej raz na minutę (trzeba dodać jakieś nowe „kłaczków” wiadomości keepalive do protokołu komunikacyjnego) - każdy klient nie odbiera keepalive wiadomość można bezpiecznie założyć, serwer nie działa i rozpoczyna ponowne łączenie.

najlepiej to zrobić najlepiej przy transmisji UDP, a nie JMS (dla narzutu), ale zakładam, że jeśli masz opcję rozgłaszania UDP jako opcję, użyłbyś jgroups do wykonania detekcji klastra/przełączania awaryjnego/ponownego przyłączenia dla ty.

+0

To nie musi być natychmiastowy jeśli o to pytasz. Czy mimo to można to zrobić za pomocą bloku try/catch? – Icebreaker

+0

tylko jeśli Połączenie podstawowe rzuca jakiś wyjątek, gdy jego zerwane. Nie mogłem ci powiedzieć bez próbowania. – radai

3

Należy dokonać klienta implement javax.jmsExceptionListener.

Pozwoli to klient, aby natychmiast otrzymać zwrotnego z API JMS kiedy połączenie zostanie utracone, nawet jeśli aplikacja nie jest wiązana do publikowania czegokolwiek w tej chwili.

Po utworzeniu Connection, podłączeniu i uruchomieniu, zadzwoń pod numer connection.setExceptionListener(myListener). Zobacz także Javadoc dla Connection.