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<MessageQueue> 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<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {
            for (MessageExt ext:list){
                System.out.println(new String(ext.getBody()));
            }
            return ConsumeOrderlyStatus.SUCCESS;
        }
    });
    consumer.start();

消息的順序消費分爲局部或者全局的順序。而局部的消費就採用上面的方式,然後全局的順序消費則是指定一個隊列來消費。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章