RocketMq(2)-发送有序的消息

在上一个博文中,我们简单的介绍了以下RockMq,以及如何实现一个无序的消息,还写出了如何处理消息失败重试的机制·

开始

搭建一个消息的顺序消费

搭建一个生产者
DefaultMQProducer queueProducer=new DefaultMQProducer("queueGroup");
    queueProducer.setNamesrvAddr("47.106.132.60:9876");
    queueProducer.setRetryTimesWhenSendFailed(5);
    queueProducer.setRetryAnotherBrokerWhenNotStoreOK(true);
    queueProducer.setDefaultTopicQueueNums(5);
    queueProducer.start();
    for (int i=1;i<=10;i++){
        for (int j=0;j<3;j++){
            Message message=new Message("queueTopic","queueTag","key:"+i,(i+":"+j).getBytes());
            queueProducer.send(message, new MessageQueueSelector() {
                public MessageQueue select(List list, Message message, Object o) {
                //o的值就是send传参的第三个参数的值,messgaeQueue主要是该组中有多少个队列。
                    Integer id= (Integer) o;
                    System.out.println(id);
                    return list.get(id%list.size());
                }
            },i);
        }
    }
    queueProducer.shutdown();
搭建一个消费者
DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("queueConsumer");
    consumer.setNamesrvAddr("47.106.132.60:9876");
    consumer.setMessageModel(MessageModel.CLUSTERING);
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    consumer.subscribe("queueTopic","*");
    consumer.registerMessageListener(new MessageListenerOrderly() {
        public ConsumeOrderlyStatus consumeMessage(List list, ConsumeOrderlyContext consumeOrderlyContext) {
            for (MessageExt ext:list){
                System.out.println(new String(ext.getBody()));
            }
            return ConsumeOrderlyStatus.SUCCESS;
        }
    });
    consumer.start();

消息的顺序消费分为局部或者全局的顺序。而局部的消费就采用上面的方式,然后全局的顺序消费则是指定一个队列来消费。

你可能感兴趣的:(MQ)