当前位置:   article > 正文

「RocketMQ专题」@RocketMQMessageListener selectorExpression属性不支持EL表达式 tag不生效 问题发现及解决方案_rocketmq selectorexpression

rocketmq selectorexpression

业务场景

        需要动态获取Tag标签,进行消息的消费。

于是乎,查看@RocketMQMessageListener注解发现,似乎支持占位符表达式的写法

那我们就采用跟他一样的写法如

 发送消息

此时就会发现,好像并没有收到消息。 

解决步骤

  •  找到@RocketMQMessageListener 的配置类

    经过dubug发现配置类org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration
    如下代码初始化我们的监听器
    1. private DefaultRocketMQListenerContainer createRocketMQListenerContainer(String name, Object bean, RocketMQMessageListener annotation) {
    2. DefaultRocketMQListenerContainer container = new DefaultRocketMQListenerContainer();
    3. String nameServer = environment.resolvePlaceholders(annotation.nameServer());
    4. nameServer = StringUtils.isEmpty(nameServer) ? rocketMQProperties.getNameServer() : nameServer;
    5. String accessChannel = environment.resolvePlaceholders(annotation.accessChannel());
    6. container.setNameServer(nameServer);
    7. if (!StringUtils.isEmpty(accessChannel)) {
    8. container.setAccessChannel(AccessChannel.valueOf(accessChannel));
    9. }
    10. container.setTopic(environment.resolvePlaceholders(annotation.topic()));
    11. container.setConsumerGroup(environment.resolvePlaceholders(annotation.consumerGroup()));
    12. container.setRocketMQMessageListener(annotation);
    13. container.setRocketMQListener((RocketMQListener) bean);
    14. container.setObjectMapper(objectMapper);
    15. container.setName(name); // REVIEW ME, use the same clientId or multiple?
    16. return container;
    17. }
    设置监听器
    container.setRocketMQMessageListener(annotation);

        简单赋值

         然后我们又发现该类实现了InitializingBean接口

         实现afterPropertiesSet方法进行属性填充

        真正解析赋值的是initRocketMQPushConsumer方

 


        其中我们发现会调用如下代码,解析注解中的占位符表达式,发现并没有我们的加载我们的selectorExpression属性,把我们的占位符当成字符串使用了。

        

解决方案

1. 修改ListenerContainerConfiguration的代码代码 

beanBuilder.addPropertyValue("selectorExpress", this.environment.resolvePlaceholders(annotation.selectorExpression()));

 2. 老老实实使用原生版

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/603632
推荐阅读
相关标签
  

闽ICP备14008679号