在上一個博文中,我們簡單的介紹了以下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();
消息的順序消費分爲局部或者全局的順序。而局部的消費就採用上面的方式,然後全局的順序消費則是指定一個隊列來消費。