RoceketMQ消息默认会随机发送到4个队列中,RoceketMQ只能保持各自队列的消息的有序性,所以无法保证全局消息的有序性
要全局顺序只能一个队列。
有序消息的生产者:
public class OrderProducer {
//nameserver地址
private static String namesrvaddress="127.0.0.1:9876;";
public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException, RemotingException, MQClientException, MQBrokerException {
//创建DefaultMQProducer
DefaultMQProducer producer = new DefaultMQProducer("order_producer_group_name");
//设置namesrv地址
producer.setNamesrvAddr(namesrvaddress);
//启动Producer
producer.start();
//创建消息
Message message = new Message(
"Topic_Order_Demo",
"TagOrder",
"KeyOrder",
"hello order message!".getBytes(RemotingHelper.DEFAULT_CHARSET));
//发送消息
//参数1:发送的消息
//参数2:选中指定的消息队列对象(会将所有的消息队列都传进来)
//参数3:指定对应队列的下标
SendResult result = producer.send(
message, //要发送的消息
new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
return mqs.get((Integer) arg);
}
},
1);//设置存入第几个队列中,这里是下标,从0开始 可在控制台消息均被发送到下标为1的队列
//关闭Producer
producer.shutdown();
}
}
有序消息的消费者:
public class OrderConsumer {
//nameserver地址
private static String namesrvaddress="127.0.0.1:9876;";
public static void main(String[] args) throws MQClientException {
//创建消息消费对象DefaultMQConsumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("order_consumer_group_name");
//设置nameserver地址
consumer.setNamesrvAddr(namesrvaddress);
//设置消费顺序
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//设置消息拉取最大数
consumer.setConsumeMessageBatchMaxSize(5);
//设置消费主题
consumer.subscribe("Topic_Order_Demo","TagOrder");
//消息监听
consumer.setMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
try {
for (MessageExt msg : msgs) {
String topic = msg.getTopic();
String tags = msg.getTags();
String keys = msg.getKeys();
String body = new String(msg.getBody(), RemotingHelper.DEFAULT_CHARSET);
System.out.println("topic:"+topic+",tags:"+tags+",keys:"+keys+",body:"+body);
}
} catch (UnsupportedEncodingException e) {
//消费异常 :重试消费
return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
e.printStackTrace();
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
//启动Consumer
consumer.start();
}
}