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

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

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

展开
收起
真的很搞笑 2023-07-03 15:59:36 1072 0
6 条回答
写回答
取消 提交回答
  • 在Listener中使用变量:你可以在Listener的代码中定义一个变量,并将该变量作为SelectorExpression的值。然后,在代码中读取外部配置文件(如yml),将配置文件中的值赋给该变量。这样可以实现在代码中动态设置SelectorExpression。

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

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

    如果要动态设置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会长
    @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
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

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

    第一步:在 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
    赞同 展开评论 打赏
  • image.png ,此回答整理自钉群“群1-Apache RocketMQ 中国开发者钉钉群”

    2023-07-03 16:14:57
    赞同 展开评论 打赏
  • 这个可以借助于使用 RocketMQ 的 MessageSelector 接口。通过这个接口可以实现自己的 MessageSelector 类,并在其中根据您的业务逻辑动态设置 selectorExpression。

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

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关电子书

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