Sofamq顺序消费问题

已解决

在案例中假设队列中有按顺序写入的1到10这十条消息,消费逻辑中加入随机sleep时间模拟业务逻辑处理, 如何保证 System.out.println打印的结果是1,2,3,4,5,6,7,8,9,10?如果配置单线程消费就能保证前面消息处理完后,再进行后面消息处理吗?
OrderConsumer consumer = accessPoint.createOrderedConsumer(properties);
consumer.subscribe("YOUR_TOPIC", "YOUR_TAG", new MessageOrderListener() {
@Override
public OrderAction consume(Message message, ConsumeOrderContext context) {
Thread.sleep(随机时间);
System.out.println(newString(message.getBody()));
return OrderAction.Success;
}
});

展开
收起
ShiehFay 2024-06-27 18:46:11 198 分享 版权
2 条回答
写回答
取消 提交回答
  • 采纳回答

    各位好,我用代码测试结果是这样的,按顺序写入1到10,消费逻辑里面,消费到消息后,sleep(10-message的值),确保最先消费到的消息sleep最久,即便在这种情况下,打印的结果依然可以保证顺序打印1到10,但是消费的速度明显很慢,和普通消息相比,消费者启动后很久才开始打印消费日志。

    2024-06-28 16:49:31
    赞同 3 展开评论
  • 单线程消费不能直接保证打印顺序,因为随机sleep会异步影响输出。要保证顺序,需改造消费逻辑,确保消息按序处理完成(包括sleep)后再进行下一条,或者使用外部同步机制协调,而非仅依赖单线程消费配置。

    2024-06-28 09:59:51
    赞同 5 展开评论

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系列产品 Serverless 化。RocketMQ 中文社区:https://rocketmq-learning.com/

还有其他疑问?
咨询AI助理