1. 程式人生 > >深入淺出JMS(四)--ActiveMQ訊息選擇器Selector

深入淺出JMS(四)--ActiveMQ訊息選擇器Selector

一、序言

       訊息大多數情況都是傳送到broker 的,在知道Destination 的情況下,都可以消費,因此有些情況下需要我們將訊息分組、隔離,或則指定A訊息,只能有A消費者消費等等情況,這裡做個大概的介紹和例項。

二、例項場景

       我們通過有時候我們需要一個queue/topic 通道,然後傳送訊息,但是我們要對不同消費者接受的訊息進行限制,或者說過濾,就可以使用這種情況。

       我這裡建立一個queue,分別傳送 300條A,B訊息,分別有消費者A,B接收

三、程式碼例項

       基本連線程式碼這裡就就不貼了,建議前的

       傳送者程式碼:

 Destination send_destination = session.createQueue("order_queue");  
      MessageProducer producer = session.createProducer(send_destination);  
for(int i =0;i<300;i++){  
           // 建立一個文字訊息  
           TextMessage message =  session.createTextMessage("A-張三-"+i);  
           // 這裡我們分別設定對應的訊息資訊,當成是一組訊息  
           message.setStringProperty("JMSXGroupID","A");  
           producer.send(message);  
  
           TextMessage message1 =  session.createTextMessage("B-李四-"+i);  
           message1.setStringProperty("JMSXGroupID","B");  
           producer.send(message1);  
       }  

消費者程式碼:
    Destination destination = session.createQueue("order_queue");  
         // 建立消費者  
         MessageConsumer consumer = session.createConsumer(destination,"JMSXGroupID='A'");  
         consumer.setMessageListener(new MessageListener() {  
             @Override  
             public void onMessage(Message message) {  
                 TextMessage textMessage = (TextMessage) message;  
                 try {  
                     System.out.println("A:"+textMessage.getText());  
                 } catch (JMSException e) {  
                     e.printStackTrace();  
                 }  
             }  
         });  

  消費者B
/ 指定接收訊息的地方  
        Destination destination = session.createQueue("order_queue");  
        // 建立消費者  
        MessageConsumer consumer = session.createConsumer(destination,"JMSXGroupID='B'");  
        consumer.setMessageListener(new MessageListener() {  
            @Override  
            public void onMessage(Message message) {  
                TextMessage textMessage = (TextMessage) message;  
                try {  
                    System.out.println("B:"+textMessage.getText());  
                } catch (JMSException e) {  
                    e.printStackTrace();  
                }  
            }  
        }); 

    然後開啟A,B消費者監聽,啟動傳送者,那麼就能看到訊息分別消費了

    同時Selector 支援一些表示式的過濾,比如可以寫成:JMSXGroupID = 'A' or JMSXGroupID = 'B'

 更多可參考:http://activemq.apache.org/features.html