消息 tag 和 key

Tag 过滤

发消息时:topic 用来确定队列,tag 不参与队列的选择,tag 会作为消息属性与消息一起存储在队列上

消费消息时:borker 会根据消息的 tag 把消息推送到对应的的消费者

生产者

发送两条消息,一条消息 tag 为 vip1,一条消息 tag 为 vip2

DefaultMQProducer producer = new DefaultMQProducer("tag-producer-group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
Message message = new Message("tagTopic", "vip1", "vip1消息".getBytes());
Message message2 = new Message("tagTopic", "vip2", "vip2消息".getBytes());
producer.send(message);
producer.send(message2);
producer.shutdown();

消费者1

borker 会把 tag 是 vip1 的消息推送给当前消费者

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("tag-consumer-group-a");
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.subscribe("tagTopic", "vip1");
consumer.registerMessageListener(new MessageListenerConcurrently() {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
        System.out.println("消费者1:" + new String(msgs.get(0).getBody()));
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});
consumer.start();

消费者2

borker 会把两条消息(tag 是 vip1vip2)都推送给当前消费者

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("tag-consumer-group-b");
consumer.setNamesrvAddr("127.0.0.1:9876");
// 订阅 tagTopic,接收 tag 为 vip1 或 vip2 的消息(两个消息都会接收)
consumer.subscribe("tagTopic", "vip1 || vip2");
consumer.registerMessageListener(new MessageListenerConcurrently() {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
        System.out.println("消费者2:" + new String(msgs.get(0).getBody()));
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});
consumer.start(); 

指定 Key

生产者

DefaultMQProducer producer = new DefaultMQProducer("key-producer-group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
String key = UUID.randomUUID().toString();
// topic、tag、key、msg
Message message = new Message("keyTopic", "vip1", key, "我是带key的消息".getBytes());
producer.send(message);
producer.shutdown();

消费者

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("key-consumer-group");
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.subscribe("keyTopic", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
        MessageExt messageExt = msgs.get(0);
        System.out.println("消息主体:" + new String(messageExt.getBody()));
        System.out.println("消息key:" + messageExt.getKeys());
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});
consumer.start();
posted @ 2025-07-03 15:39  CyrusHuang  阅读(10)  评论(0)    收藏  举报