@@ -567,6 +567,196 @@ rocketmq.simple-consumer.filter-expression-type=tag
567567
568568<a name =" GSP33 " ></a >
569569
570+ # SQL92 消息过滤
571+
572+ <a name =" SQL92-01 " ></a >
573+
574+ ## 概述
575+
576+ RocketMQ V5 客户端支持 SQL92 消息过滤功能,允许消费者根据消息属性进行复杂的条件过滤。
577+
578+ ### 支持的过滤类型
579+
580+ 1 . ** TAG 过滤** (默认):基于 Tag 的简单过滤
581+ 2 . ** SQL92 过滤** :基于消息属性的复杂条件过滤
582+
583+ <a name =" SQL92-02 " ></a >
584+
585+ ## 配置说明
586+
587+ ### application.properties 配置
588+
589+ ``` properties
590+ # 基本配置
591+ rocketmq.simple-consumer.endpoints =localhost:8081
592+ rocketmq.simple-consumer.consumer-group =sql92Group
593+ rocketmq.simple-consumer.topic =sql92Topic
594+
595+ # TAG 过滤(默认)
596+ rocketmq.simple-consumer.tag =*
597+ rocketmq.simple-consumer.filter-expression-type =tag
598+
599+ # SQL92 过滤
600+ # rocketmq.simple-consumer.tag=(type = 'vip' AND amount > 500)
601+ # rocketmq.simple-consumer.filter-expression-type=sql92
602+ ```
603+
604+ <a name =" SQL92-03 " ></a >
605+
606+ ## SQL92 表达式语法
607+
608+ ### 比较操作符
609+
610+ - ` = ` : 等于
611+ - ` <> ` : 不等于
612+ - ` > ` : 大于
613+ - ` < ` : 小于
614+ - ` >= ` : 大于等于
615+ - ` <= ` : 小于等于
616+ - ` BETWEEN ` : 在某个范围内
617+ - ` IN ` : 在集合中
618+ - ` LIKE ` : 模糊匹配
619+
620+ ### 逻辑操作符
621+
622+ - ` AND ` : 与
623+ - ` OR ` : 或
624+ - ` NOT ` : 非
625+
626+ <a name =" SQL92-04 " ></a >
627+
628+ ## 使用示例
629+
630+ ### 示例 1:简单等值过滤
631+
632+ 只消费 type='vip' 的消息:
633+
634+ ``` properties
635+ rocketmq.simple-consumer.filter-expression-type =sql92
636+ rocketmq.simple-consumer.tag =(type = ' vip' )
637+ ```
638+
639+ 发送消息时添加属性:
640+
641+ ``` java
642+ Message<?> message = MessageBuilder . withPayload(order)
643+ .setHeader(" type" , " vip" )
644+ .build();
645+ ```
646+
647+ ### 示例 2:数值范围过滤
648+
649+ 消费金额在 100-1000 之间的订单:
650+
651+ ``` properties
652+ rocketmq.simple-consumer.filter-expression-type =sql92
653+ rocketmq.simple-consumer.tag =(amount >= 100 AND amount <= 1000)
654+ ```
655+
656+ ### 示例 3:多条件组合
657+
658+ 消费 VIP 用户且金额大于 500 的订单:
659+
660+ ``` properties
661+ rocketmq.simple-consumer.filter-expression-type =sql92
662+ rocketmq.simple-consumer.tag =(type = ' vip' AND amount > 500)
663+ ```
664+
665+ ### 示例 4:IN 操作符
666+
667+ 消费特定地区的订单:
668+
669+ ``` properties
670+ rocketmq.simple-consumer.filter-expression-type =sql92
671+ rocketmq.simple-consumer.tag =(region IN (' Beijing' , ' Shanghai' , ' Guangzhou' ))
672+ ```
673+
674+ ### 示例 5:LIKE 模糊匹配
675+
676+ 消费以 A 开头的产品类别:
677+
678+ ``` properties
679+ rocketmq.simple-consumer.filter-expression-type =sql92
680+ rocketmq.simple-consumer.tag =(category LIKE ' A%' )
681+ ```
682+
683+ <a name =" SQL92-05 " ></a >
684+
685+ ## 消费者代码示例
686+
687+ ``` java
688+ @Service
689+ @RocketMQMessageListener (
690+ endpoints = " ${demo.sql92.rocketmq.endpoints:}" ,
691+ topic = " ${demo.sql92.rocketmq.topic:}" ,
692+ consumerGroup = " ${demo.sql92.rocketmq.consumer-group:}" ,
693+ tag = " ${demo.sql92.rocketmq.tag:}" ,
694+ filterExpressionType = " ${demo.sql92.rocketmq.filter-expression-type:sql92}"
695+ )
696+ public class SQL92FilterConsumer implements RocketMQListener {
697+
698+ @Override
699+ public ConsumeResult consume (MessageView messageView ) {
700+ log. info(" 收到 SQL92 过滤消息 - ID: {}, 属性:{}" ,
701+ messageView. getMessageId(),
702+ messageView. getProperties());
703+ return ConsumeResult . SUCCESS ;
704+ }
705+ }
706+ ```
707+
708+ <a name =" SQL92-06 " ></a >
709+
710+ ## 生产者代码示例
711+
712+ ``` java
713+ @SpringBootApplication
714+ public class SQL92ProducerApplication implements CommandLineRunner {
715+
716+ @Resource
717+ private RocketMQClientTemplate rocketMQClientTemplate;
718+
719+ @Override
720+ public void run (String ... args ) throws ClientException {
721+ // 发送带属性的消息
722+ Message<?> message = MessageBuilder . withPayload(" VIP Order" )
723+ .setHeader(" type" , " vip" )
724+ .setHeader(" amount" , 600 )
725+ .setHeader(" region" , " Beijing" )
726+ .build();
727+
728+ rocketMQClientTemplate. syncSendNormalMessage(" orderTopic" , message);
729+ }
730+ }
731+ ```
732+
733+ <a name =" SQL92-07 " ></a >
734+
735+ ## 注意事项
736+
737+ 1 . ** 属性名称限制** :
738+ - 属性名称不能包含空格和特殊字符
739+ - 建议使用字母、数字和下划线
740+
741+ 2 . ** 性能考虑** :
742+ - SQL92 过滤比 TAG 过滤更消耗资源
743+ - 简单的过滤场景优先使用 TAG 过滤
744+
745+ 3 . ** 表达式长度** :
746+ - SQL92 表达式长度有限制,不宜过长
747+
748+ 4 . ** 数据类型** :
749+ - 确保发送的消息属性类型与过滤表达式中的类型一致
750+ - 字符串值需要用单引号包裹
751+
752+ 5 . ** NULL 值处理** :
753+ - 使用 ` IS NULL ` 或 ` IS NOT NULL ` 判断空值
754+ - 不要使用 ` = NULL `
755+
756+ 详细示例请参考 [ SQL92_USAGE.md] ( SQL92_USAGE.md )
757+
758+ <a name =" GSP33 " ></a >
759+
570760# ACL功能
571761
572762<a name =" PavXQ " ></a >
0 commit comments