在案例中假设队列中有按顺序写入的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;
}
});
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
各位好,我用代码测试结果是这样的,按顺序写入1到10,消费逻辑里面,消费到消息后,sleep(10-message的值),确保最先消费到的消息sleep最久,即便在这种情况下,打印的结果依然可以保证顺序打印1到10,但是消费的速度明显很慢,和普通消息相比,消费者启动后很久才开始打印消费日志。
单线程消费不能直接保证打印顺序,因为随机sleep会异步影响输出。要保证顺序,需改造消费逻辑,确保消息按序处理完成(包括sleep)后再进行下一条,或者使用外部同步机制协调,而非仅依赖单线程消费配置。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系列产品 Serverless 化。RocketMQ 中文社区:https://rocketmq-learning.com/