深入浅出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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值