【RoceketMQ】顺序消息

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();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值