rocketmq 启动后 在mq console界面的consumer的Quantity数量显示为0 问题记录
这几天在迁移环境,把当前生产环境运行的一套代码新迁移到一套演练环境。但是遇到一个问题:mq在当前的生产环境,消费者和生产者是成功的,但是当部署到演示环境之后,mq的消费者手动创建后,在控制台界面Quantity的数量一直为0,导致无法消费topic的消息。

类似这种的。
刚开始想着是环境的问题,但是排查了半天,mq环境和其他环境也没看出有什么问题。唯一的区别是:这些显示未0的,创建的方式和不为0的,是不同的。一种是基于事件的方式,另外一种直接是基于springboot的 :
基于事件的方式:

基于springboot方式的:

两张方式在生产环境当前都是正常的,但是演示环境,springboot的这种方式就是不行,很是奇怪。
然后我添加了启动日志,将rocketmq的topic/consumer这些基础信息打印了出来,发现也没问题,最终想到:rocketmq-springboot的这些基础信息是基于DefaultRocketMQListenerContainer里面的方式进入注册的,于是在这个类的启动方法上面都加上了debug:




最后发现在这个类的启动方法:initRocketMQPushConsumer() 里面
RPCHook rpcHook = RocketMQUtil.getRPCHookByAkSk(this.applicationContext.getEnvironment(), this.rocketMQMessageListener.accessKey(), this.rocketMQMessageListener.secretKey());
最后得到的这个rpcHook 是null
再然后发现自己的nacos的 mq的 accessKey和 secretKey不是叫这个名字,但是 springboot注解方式是有默认的名称的,和nacos的不一致。而且 新的演示环境开启了TCL认证,但是我的springboot并没有写上,最终导致的。
修复版本很简单,就是配置上accessKey和secretKey
@Component @RocketMQMessageListener(topic = "${rocketmq.topics.nlcTopic}", consumerGroup = "${rocketmq.consumer.nlpComsumer}",messageModel = MessageModel.CLUSTERING ,accessKey = "${rocketmq.accesskey}",secretKey = "${rocketmq.accessSecret}") public class KnowledgeCallbackMessageConsumer implements RocketMQListener<MessageExt> { private static final Logger logger = LoggerFactory.getLogger(KnowledgeCallbackMessageConsumer.class); @Autowired private org.springframework.core.env.Environment env; @PostConstruct public void printConfig() { String topic = env.getProperty("rocketmq.topics.nlcTopic"); String group = env.getProperty("rocketmq.consumer.nlpComsumer"); String nameServer = env.getProperty("rocketmq.name-server"); // 或 rocketmq.nameServer logger.info("RocketMQ Consumer Config - Topic: {}, Group: {}, NameServer: {}", topic, group, nameServer); } private ObjectMapper objectMapper;
重新启动生效了

浙公网安备 33010602011771号