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

业务场景

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

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

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

 发送消息

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

解决步骤

  •  找到@RocketMQMessageListener 的配置类

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

        简单赋值

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

         实现afterPropertiesSet方法进行属性填充

        真正解析赋值的是initRocketMQPushConsumer方法

 


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

        

解决方案

1. 修改ListenerContainerConfiguration的代码代码 

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

 2. 老老实实使用原生版

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值