《Apache RocketMQ用户指南》之过滤消息示例

640?wx_fmt=gif

在大多数情况下,tag是一种简单而有用的设计,用于选择所需的信息。 例如:


1

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_EXAMPLE");

2

consumer.subscribe("TOPIC""TAGA || TAGB || TAGC");

消费者将收到包含TAGA或TAGB或TAGB的消息. 但限制是一条消息只能有一个标签,而这对于复杂的情况可能无效。 在这种情况下,您可以使用SQL表达式筛选出消息.

原理

SQL功能可以通过您在发送消息时放入的属性进行一些计算。 在RocketMQ定义的语法下,您可以实现一些有趣的逻辑。 这是一个例子:

 
   

------------ | message  | |----------|  a > 5 AND b = 'abc' | a = 10   |  --------------------> Gotten | b = 'abc'| | c = true | ------------ ------------ | message  | |----------|   a > 5 AND b = 'abc' | a = 1    |  --------------------> Missed | b = 'abc'| | c = true | ------------

语法

RocketMQ只定义了一些基本的语法来支持这个功能。 你也可以很容易地扩展它.

  1. 数字比较, 像 >>=<<=BETWEEN=;

  2. 字符比较, 像 =<>IN;

  3. IS NULL 或者 IS NOT NULL;

  4. 逻辑运算ANDORNOT;

常量类型是:

  1. 数字, 像123, 3.1415;

  2. 字符串, 像‘abc’,必须使用单引号;

  3. NULL, 特殊常数;

  4. 布尔常量, TRUE 或FALSE;

使用限制

只有消费者可以通过SQL92选择消息。 示例:

1public void subscribe(final String topic, final MessageSelector messageSelector)

生产者示例

发送时,您可以通过putUserProperty方法在消息中放置属性.

01DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
02producer.start();
03
04Message msg = new Message("TopicTest",
05    tag,
06    ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)
07);
08// Set some properties.
09msg.putUserProperty("a", String.valueOf(i));
10
11SendResult sendResult = producer.send(msg);
12
13producer.shutdown()

消费者示例

消费时,使用Message Selector.by Sql通过SQL92选择消息.

01DefaultMQPushConsumer consumer = newDefaultMQPushConsumer("please_rename_unique_group_name_4");
02
03// only subsribe messages have property a, also a >=0 and a <= 3
04consumer.subscribe("TopicTest", MessageSelector.bySql("a between 0 and 3");
05
06consumer.registerMessageListener(new MessageListenerConcurrently() {
07    @Override
08    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
09        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
10    }
11});
12

consumer.start();


(全文完)

点击下方
阅读原文



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值