在上一个博文中,我们简单的介绍了以下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();
消息的顺序消费分为局部或者全局的顺序。而局部的消费就采用上面的方式,然后全局的顺序消费则是指定一个队列来消费。