rocketmq发送顺序消息(四)

rocketmq怎么发送消息可参考我的上一篇博客:rocketmq发送第一条消息。此处我们讲解如何发送rocketmq顺序消息

producer

public class ProducerOrder {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("testGrp");

        // 设置nameserver地址  nameserver具备路由功能(发现服务,有点注册中心的意思),让其分配合理的broker来进行消息发送
        producer.setNamesrvAddr("192.168.52.11:9876");
        try {
            producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 20; i++) {
            Message message = new Message("monkeyOrderMsgTopic", ("这是顺序消息:" + i).getBytes());
            producer.send(message,
                    // 自定义选择Queue
                    new MessageQueueSelector() {
                        /**
                         *
                         * @param list 当前topic里所有的queue
                         * @param message 要发送的消息
                         * @param o 对应到 send() 里的 args参数
                         * @return
                         */
                        @Override
                        public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
                            // 根据传入的参数决定Queue
                            MessageQueue messageQueue = list.get((Integer)o);
                            return messageQueue;
                        }
                    }, 0, 3000);
        }

        System.out.println("发送完成");
    }
}

 consumer

public class ConsumerOrder {

    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("testConsumerOrder");

        consumer.setNamesrvAddr("192.168.52.11:9876");
        consumer.subscribe("monkeyOrderMsgTopic","*");

        consumer.registerMessageListener(new MessageListenerOrderly() {
            @Override
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {
                for (MessageExt messageExt : list) {
                    System.out.println(new String(messageExt.getBody()) + "current Thread:" + Thread.currentThread().getName());
                }
                return ConsumeOrderlyStatus.SUCCESS;
            }
        });
        consumer.start();
        System.out.println("consumer start .....");
    }

}

测试结果: 

 总结:

你们应该如何保证消息的顺序?

  • 同一topic

  • 同一个QUEUE

  • 发消息的时候一个线程去发送消息

  • 消费的时候 一个线程 消费一个queue里的消息或者使用MessageListenerOrderly

  • 多个queue 只能保证单个queue里的顺序

猜你喜欢

转载自blog.csdn.net/u010960161/article/details/118876563