一、序言
消息大多数情况都是发送到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