ba__jie 2024-03-08 17:30 采纳率: 16.7%
浏览 825

RocketMQ mq消息出现NOT_CONSUME_YET

rocketmq消息被投递到了0队列之外,但消费者只能消费0队列

img


能否让消费者消费其他队列,或者生产者只往一个队列投递

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-08 17:30
    关注

    引自免费微信小程序:皆我百晓生

    在 Apache RocketMQ 中,消息会按照 Topic 进行发布,并且可以被分布到多个 Broker 上的不同队列中。消费者消费消息时,默认情况下,一个消费组下的消费者会均匀地消费该 Topic 下所有队列的消息。

    对于您提到的问题,“RocketMQ 消息出现 NOT_CONSUME_YET”通常意味着消息已经被投递到了某个队列,但是消费者还没有来得及或者没有正确地消费该消息。

    若消费者只能消费 0 队列,这可能是因为消费者实例配置了只订阅特定队列。要让消费者能够消费其他队列,您需要调整消费者的订阅策略,使其订阅整个 Topic 的所有队列。示例代码如下:

    // 创建 PushConsumer 实例
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup");
    
    // 设置 NameServer 地址
    consumer.setNamesrvAddr("yourNameServerAddress");
    
    // 订阅指定 Topic,并设置为消费所有队列
    consumer.subscribe("yourTopic", "*");
    
    // 启动消费者
    consumer.start();
    

    另外,如果您希望生产者只往一个队列投递消息,您可以指定发送消息时的目标队列编号,但这样做可能会导致消息处理的不均衡和吞吐量受限。一般不推荐这种做法,除非有特殊场景需求。如果确实需要,可以通过 Message 类的 setQueueId 方法来实现:

    // 创建 Message 实例
    Message msg = new Message("yourTopic", // Topic
        "TagA", // Tag
        ("Hello RocketMQ").getBytes(RemotingHelper.DEFAULT_CHARSET)); // Body
    
    // 设置目标队列编号(例如:始终发往第0队列)
    msg.setQueueId(0);
    
    // 发送消息
    SendResult sendResult = producer.send(msg);
    

    请根据实际情况调整代码以满足您的需求。同时,请确保检查您的集群、消费者分组以及消息路由配置是否正确无误。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月8日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见