2012-07-20 10 views
5

Attualmente sto programmando un servizio di messaggistica per abbonamenti durevoli (potrebbe non essere duraturo ne stiamo ancora discutendo) e stavo cercando alcuni suggerimenti su come gestire uno scenario in cui il nostro server si arresta temporaneamente per qualsiasi motivo e abbiamo bisogno di iscriversi nuovamente all'argomento automaticamente. Ecco il codice di esempio di come si connette:Modo ideale per configurare una connessione JMS in modo che si ricolleghi automaticamente

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

risposta

0

a quale velocità è necessario il rilevamento del guasto? imposta il tuo protocollo in modo tale da garantire ad ogni client di inviare un messaggio almeno una volta al minuto (dovrai aggiungere un nuovo messaggio keepalive "fluff" al tuo protocollo di comunicazione) - qualsiasi client che non riceve un messaggio keepalive può tranquillamente il server è inattivo e iniziare la riconnessione.

idealmente questo genere di cose è meglio fatto con trasmissione UDP e non JMS (per l'overhead), ma presumo che se si dispone di trasmissione UDP come opzione si usa jgroups per fare il rilevamento/failover/ricongiungimento cluster per tu.

+0

Non deve essere istantaneo se è quello che stai chiedendo. C'è comunque questo può essere fatto con un blocco try/catch? – Icebreaker

+0

solo se la connessione sottostante genera qualche sorta di eccezione quando viene interrotta. Non potrei dirtelo senza provarci. – radai

3

Dovresti rendere il tuo cliente implement javax.jmsExceptionListener.

Ciò consentirà al client di ricevere immediatamente una richiamata dall'API JMS quando la connessione viene persa, anche se l'applicazione non sta legando per pubblicare nulla al momento.

Dopo aver creato il Connection, collegandolo e avviarlo, chiamare connection.setExceptionListener(myListener). Vedi anche Javadoc per Connection.

Problemi correlati