开发者社区 > 云原生 > 消息队列 > 正文

大佬们,问个问题:rocketmqListener如何selectorexpression动态设置?

大佬们,问个问题:rocketmqListener如何selectorexpression动态设置参数,如通过读取yml的值配置selectorexpression?谢谢 没有遇到这样的需求?

展开
收起
cuicuicuic 2023-07-03 15:59:36 448 0
6 条回答
写回答
取消 提交回答
  • 2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>

    在Listener中使用变量:你可以在Listener的代码中定义一个变量,并将该变量作为SelectorExpression的值。然后,在代码中读取外部配置文件(如yml),将配置文件中的值赋给该变量。这样可以实现在代码中动态设置SelectorExpression。

    使用Spring Expression Language(SpEL):如果你使用的是Spring框架来管理RocketMQ的Listener,你可以使用SpEL表达式来动态设置SelectorExpression。在SpEL表达式中,你可以使用Spring的PropertyPlaceholderConfigurer来读取外部配置文件中的值,并将其作为SelectorExpression的一部分。

    2023-07-08 10:13:01
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>

    如果要动态设置rocketmqListener的selectorExpression参数,可以使用Spring的@Value注解来读取yml配置文件中的值,并将其传递给selectorExpression属性。

    例如,假设配置文件中的selectorExpression属性如下所示:

    selectorExpression: "select * from myTopic where topicName = 'myTopic'" 那么在Spring中,可以使用@Value注解将该值动态地注入到rocketmqListener的属性中,如下所示:

    @Configuration @EnableRocketMqListener public class RocketMqConfig {

    @Value("${rocketMqListener.selectorExpression}") private String selectorExpression;

    // ...

    } 这样,在启动RocketMQ时,就会将传入的selectorExpression值动态地注入到rocketmqListener的属性中,从而实现对消息的动态过滤。

    2023-07-06 15:18:03
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>

    @RocketMQMessageListener(topic = "${topic}", consumerGroup = "${consumerGroup}", selectorExpression = "${selectorExpression}")
    public class MyRocketMQListener implements RocketMQListener<String> {
        // ...
    }
    
    
    rocketmq:
      topic: my_topic
      consumerGroup: my_consumer_group
      selectorExpression: TagA
    
    
    @Configuration
    public class RocketMQConfig {
        @Value("${rocketmq.topic}")
        private String topic;
    
        @Value("${rocketmq.consumerGroup}")
        private String consumerGroup;
    
        @Value("${rocketmq.selectorExpression}")
        private String selectorExpression;
    
        @Bean
        public RocketMQListenerContainer rocketMQListenerContainer() {
            DefaultRocketMQListenerContainer container = new DefaultRocketMQListenerContainer();
            container.setTopic(topic);
            container.setConsumerGroup(consumerGroup);
            container.setSelectorExpression(selectorExpression);
            container.setMessageListener(new MyRocketMQListener());
            // ...
            return container;
        }
    }
    
    2023-07-04 08:38:22
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>

    同学你好,这个配置还是比较简单的:

    第一步:在 YAML 配置文件中,添加一个属性来配置 selectorExpression

    rocketmq:
      listener:
        selector-expression: your-selector-expression
    

    第二步:在消息监听器类中,注入 RocketMQListenerConfig 对象,并将其作为参数传递给 @RocketMQMessageListener 注解

    @RocketMQMessageListener(
        topic = "your-topic",
        consumerGroup = "your-consumer-group",
        selectorExpression = "#{rocketMQListenerConfig.selectorExpression}"
    )
    public class YourMessageListener implements RocketMQListener<String> {
        // ...
    }
    
    2023-07-03 16:43:25
    赞同 展开评论 打赏
  • 2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>

    image.png ,此回答整理自钉群“群1-Apache RocketMQ 中国开发者钉钉群”

    2023-07-03 16:14:57
    赞同 展开评论 打赏
  • 2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>

    这个可以借助于使用 RocketMQ 的 MessageSelector 接口。通过这个接口可以实现自己的 MessageSelector 类,并在其中根据您的业务逻辑动态设置 selectorExpression。

    2023-07-03 16:09:28
    赞同 展开评论 打赏
滑动查看更多
问答分类:

多个子产品线联合打造金融级高可用消息服务以及对物联网的原生支持,覆盖多行业。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载
http://www.vxiaotou.com