深入掌握JMS(四):實戰Queue

  Queue實現的是點到點模型,在下面的例子中,啓動2個消費者共同監聽一個Queue,然後循環給這個Queue中發送多個消息,我們依然採用ActiveMQ。

[java] view plaincopy
  1. import javax.jms.Connection;  
  2. import javax.jms.DeliveryMode;  
  3. import javax.jms.JMSException;  
  4. import javax.jms.Message;  
  5. import javax.jms.MessageConsumer;  
  6. import javax.jms.MessageListener;  
  7. import javax.jms.MessageProducer;  
  8. import javax.jms.Queue;  
  9. import javax.jms.Session;  
  10. import javax.jms.TextMessage;  
  11. import org.apache.activemq.ActiveMQConnectionFactory;  
  12. import org.apache.activemq.command.ActiveMQQueue;  
  13.   
  14. public class QueueTest {  
  15.     public static void main(String[] args) throws Exception {  
  16.         ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");  
  17.      
  18.         Connection connection = factory.createConnection();  
  19.         connection.start();  
  20.          
  21.   
  22.         //創建一個Queue  
  23.         Queue queue = new ActiveMQQueue("testQueue");  
  24.         //創建一個Session  
  25.         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  26.          
  27.   
  28.         //註冊消費者1  
  29.         MessageConsumer comsumer1 = session.createConsumer(queue);  
  30.         comsumer1.setMessageListener(new MessageListener(){  
  31.             public void onMessage(Message m) {  
  32.                 try {  
  33.                     System.out.println("Consumer1 get " + ((TextMessage)m).getText());  
  34.                 } catch (JMSException e) {  
  35.                     e.printStackTrace();  
  36.                 }  
  37.             }  
  38.         });  
  39.          
  40.   
  41.         //註冊消費者2  
  42.         MessageConsumer comsumer2 = session.createConsumer(queue);  
  43.         comsumer2.setMessageListener(new MessageListener(){  
  44.             public void onMessage(Message m) {  
  45.                 try {  
  46.                     System.out.println("Consumer2 get " + ((TextMessage)m).getText());  
  47.                 } catch (JMSException e) {  
  48.                     e.printStackTrace();  
  49.                 }  
  50.             }  
  51.              
  52.         });  
  53.          
  54.   
  55.         //創建一個生產者,然後發送多個消息。  
  56.         MessageProducer producer = session.createProducer(queue);  
  57.         for(int i=0; i<10; i++){  
  58.             producer.send(session.createTextMessage("Message:" + i));  
  59.         }  
  60.     }  
  61. }  

  運行這個例子會得到下面的輸出結果:

[java] view plaincopy
  1. Consumer1 get Message:0  
  2. Consumer2 get Message:1  
  3. Consumer1 get Message:2  
  4. Consumer2 get Message:3  
  5. Consumer1 get Message:4  
  6. Consumer2 get Message:5  
  7. Consumer1 get Message:6  
  8. Consumer2 get Message:7  
  9. Consumer1 get Message:8  
  10. Consumer2 get Message:9  
 
  可以看出每個消息直被消費了一次,但是如果有多個消費者同時監聽一個Queue的話,無法確定一個消息最終會被哪一個消費者消費。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章