深入淺出JMS(四)--ActiveMQ訊息選擇器Selector
阿新 • • 發佈:2019-01-06
一、序言
訊息大多數情況都是傳送到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