问题描述:使用RocketMQ筛选同一Topic同一Tag下的消息
- 使用producer发送消息时,设置属性
Message msg = new Message("TOPIC_FILTER",
"TAG_FILTER",
("HELLO ROCKETMQ FILTER"+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
//设置属性
msg.putUserProperty("a",String.valueOf(i));
- 使用consumer消费消息的时,筛选消息
//根据设置的消息的属性进行过滤,若消息存在属性a,且值在[0-3]之间的闭区间内,则订阅
consumer.subscribe("TOPIC_FILTER",MessageSelector.bySql("a between 0 and 3"));
- 启动的时候报错
org.apache.rocketmq.client.exception.MQClientException: CODE: 1 DESC: The broker does not support consumer to filter message by SQL92
解决办法
- 找到RocketMQ的安装目录的conf/2m-2s-async下的broker-a.properties主配置文件,增加如下配置
#是否支持根据属性过滤 如果使用基于标准的sql92模式过滤消息则改参数必须设置为true
enablePropertyFilter=true
- 停止broker服务
sh bin/mqshutdown broker
- 重新指定修改后配置文件启动broker
nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-async/broker-a.properties &
- 在RocketMQ的console下可以看到更新后的值为true。
扩展
consumer消费端可以筛选消息
public void subscribe(final String topic, final MessageSelector messageSelector)
- 通过指定的Tag过滤
consumer.subscribe("TopicTest","TagA");
- 通过*,获取该Topic下所有的消息
consumer.subscribe("TopicTest","*");
- 通过||,获取指定Tag下的消息
consumer.subscribe("TopicTest", "TagA || TagC || TagD");
- 通过SQL92,获取匹配的消息
// only subsribe messages have property a, also a >=0 and a <= 3:只订阅消息中属性a属性且值在【0-3】之间的消息
consumer.subscribe("TOPIC_FILTER",
MessageSelector.bySql("a between 0 and 3"));
RocketMQ仅定义了一些基本语法来支持此功能。您也可以轻松扩展它。
数值比较,如>,>=,<,<=,BETWEEN,=;
字符比较,如=,<>,IN; IS NULL或IS NOT NULL;
逻辑AND,OR,NOT,
‘常量类型为:
数值,例如123、3.1415;
字符,例如“ abc”,必须用单引号引起来;
NULL,特殊常数;
布尔,TRUE或FALSE