JMS&MQ,從入門到精通(六)
阿新 • • 發佈:2019-01-09
本篇我們來介紹一下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);
執行結果如下圖;
下篇將結合本篇的精華之處,做一個複雜一點的例項,前方高能!!!