Rocket MQ--015--基于Tag和属性过滤消息

背景

对于一个Broker来说,可能存在不同业务的数据。假如消费者只关注订单业务,那么它怎么过滤掉非订单业务呢?答案其实很简单:使用Tag或属性进行过滤。

生产者带Tag或属性发送

package com.klcwqy.rocketmq.message.tag;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class TagMessageProducer {
	
	public static void main(String[] args) throws Exception {
		DefaultMQProducer producer = new DefaultMQProducer("test-order-producer-group");
		producer.setNamesrvAddr("192.168.8.2:9876;192.168.8.3:9876");
		producer.start();
		//发送顺序消息:根据业务模式,让同一个事务的消息进同一个MessageQueue
		int orderId = 0;
		Message message = null;
		for (int i = 0; i < 10; i++) {
			orderId = i;
			//指定Tag
			message = new Message("TEST-ORDER-TOPIC", "Tag-A || Tag-B", String.valueOf(orderId).getBytes(RemotingHelper.DEFAULT_CHARSET));
			//设置一些属性
			message.putUserProperty("item", "TV");
			message.putUserProperty("count", "100");
			producer.send(message);
		}
	}

}

消费者使用Tag或属性过滤

package com.klcwqy.rocketmq.message.tag;

import java.util.List;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;


public class TagMessageConsume {

	public static void main(String[] args) throws Exception {
		//创建消费
		DefaultMQPushConsumer consume = new DefaultMQPushConsumer("group");
		//绑定NameServer
		consume.setNamesrvAddr("192.168.8.2:9876;192.168.8.3:9876");
		//订阅Topic并使用Tag过滤
		consume.subscribe("TEST-ORDER-TOPIC", "Tag-A || Tag-B"); 
		//或订阅Topic并使用sql过滤
		//consume.subscribe("TEST-ORDER-TOPIC", MessageSelector.bySql("item = TV and count > 20"));
		
		consume.setMessageModel(MessageModel.CLUSTERING);
		//注册监听:顺序消费
		consume.registerMessageListener(new MessageListenerConcurrently() {
			
			@Override
			public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
				return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
			}
		});
		//启动消费者
		consume.start();
	}
}

RocketMQ支持比较丰富的数据过滤语法,如下所示:

  1. 数值比较: >, >=,<,< =,BETWEEN,=
  2. 字符比较:=,<>,IN
  3. IS NULL 或者 IS NOT NULL
  4. 逻辑符号: AND, OR, NOT
  5. 数值,比如:123, 3.1415
  6. 字符,比如:‘abc’,必须用单引号包裹起来
  7. NULL,特殊的常量
  8. 布尔值,TRUE 或 FALSE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值