2012-07-20 48 views
5

Tôi hiện đang lập chương trình dịch vụ nhắn tin cho đăng ký bền (có thể kết thúc là không bền, chúng tôi vẫn đang thảo luận) và tôi đang tìm một số gợi ý về cách xử lý một tình huống mà máy chủ của chúng tôi tạm thời ngừng hoạt động vì bất kỳ lý do gì và chúng tôi cần phải tự động đăng ký lại chủ đề đó. Dưới đây là mã mẫu về cách kết nối:Cách lý tưởng để thiết lập kết nối JMS để nó tự động kết nối lại

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

Trả lời

0

bạn cần phát hiện lỗi nhanh như thế nào? thiết lập giao thức của bạn để đảm bảo mọi khách hàng được gửi thư ít nhất một lần mỗi phút (bạn sẽ cần phải thêm một số thông báo mới "fluff" vào giao thức truyền thông của bạn) - bất kỳ khách hàng nào không nhận được thông điệp an toàn máy chủ bị hỏng và bắt đầu kết nối lại.

lý tưởng loại điều này được thực hiện tốt nhất với phát sóng UDP chứ không phải JMS (cho phí), nhưng tôi giả sử nếu bạn có phát sóng UDP làm tùy chọn, bạn sẽ sử dụng nhóm làm việc để xóa cụm từ/failover/rejoin bạn.

+0

Nó không phải là ngay lập tức nếu đó là những gì bạn đang yêu cầu. Có anyway này có thể được thực hiện với một khối try/catch? – Icebreaker

+0

chỉ khi kết nối cơ bản ném một số loại ngoại lệ khi bị cắt. tôi không thể nói với bạn mà không cố gắng. – radai

3

Bạn nên đặt khách hàng của mình implement javax.jmsExceptionListener.

Điều này sẽ cho phép khách hàng của bạn ngay lập tức nhận được cuộc gọi lại từ API JMS khi kết nối bị mất, ngay cả khi đơn đăng ký của bạn không liên kết để xuất bản bất kỳ nội dung nào vào lúc này.

Sau khi tạo Connection, hãy kết nối và khởi động nó, hãy gọi connection.setExceptionListener(myListener). Xem thêm Javadoc cho Connection.

Các vấn đề liên quan