1. 程式人生 > >JMS&MQ,從入門到精通(六)

JMS&MQ,從入門到精通(六)

本篇我們來介紹一下activeMq的Queue的細節之處

 前面的例子中建立一個訊息消費者使用的是:
 sesssion.createConsumer(destination)另外,還提供了另一種方式:
 sesssion.createConsumer(destination, selector)這裡selector是一個字串,用來過濾訊息。也就是說,這種方式可以建立一個可以只
 接收特定訊息的一個消費者Selector的格式是類似於SQL-92的一種語法,可以用來比較訊息頭資訊和屬性

思路

1.建立兩個消費者,共同監聽同一個Queue,但是它們的Selector不同
2.然後建立一個訊息生產者,來發送多個訊息

一個簡單的例項

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();

Queue queue = new ActiveMQQueue("testQueue");

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

MessageConsumer comsumerA = session.createConsumer(queue, "receiver = 'A'"
); comsumerA.setMessageListener(new MessageListener(){ public void onMessage(Message m) { try { System.out.println("ConsumerA get " + ((TextMessage) m).getText()); } catch (JMSException e1) { } } }); MessageConsumer comsumerB = session.createConsumer(queue, "receiver = 'B'"
); comsumerB.setMessageListener(new MessageListener(){ public void onMessage(Message m) { try { System.out.println("ConsumerB get " + ((TextMessage) m).getText()); } catch (JMSException e) { } } }); MessageProducer producer = session.createProducer(queue); for(int i=0; i<10; i++) { String receiver = (i%3 == 0 ? "A" : "B"); TextMessage message = session.createTextMessage("Message" + i + ", receiver:" + receiver); message.setStringProperty("receiver", receiver); producer.send(message ); } /** 結果如下: ConsumerA get Message0, receiver:A ConsumerB get Message1, receiver:B ConsumerB get Message2, receiver:B ConsumerA get Message3, receiver:A ConsumerB get Message4, receiver:B ConsumerB get Message5, receiver:B ConsumerA get Message6, receiver:A ConsumerB get Message7, receiver:B ConsumerB get Message8, receiver:B ConsumerA get Message9, receiver:A 可以看出,訊息消費者只會取走它自己感興趣的訊息。 * */
不知道大家看出來了沒,這裡有點SQL-92標準的where查詢的味道;

關鍵程式碼

TextMessage message = session.createTextMessage("Message" + i + ", receiver:" + receiver);
message.setStringProperty("receiver", receiver);
執行結果如下圖;

這裡寫圖片描述

下篇將結合本篇的精華之處,做一個複雜一點的例項,前方高能!!!