RocketMQ顺序消息

RocketMQ顺序消息

实现原理

生产者将需要排序的消息发送到指定的MessageQueue;

消费者需要配置一个队列,一个线程消费;

只能保证局部有序,不能保证全局有序。

注意点

  1. Broker的数量就是Topic下的MessageQueue的最小数量,一般线上环境Broker都是多个,所以无法将MessageQueue的数量配置成1个。
  2. RocketMQTemplate不支持将消息发送到特定的队列,可以使用APIrocketMQTemplate#getProducer()获取原生生产者对象。

生产者

public class Producer {
    public static void main(String[] args) throws UnsupportedEncodingException {
        try {
            DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
//            producer.setNamesrvAddr("127.0.0.0:9876");
            producer.start();

            for (int i = 0; i < 10; i++) {
                int orderId = i;

                for(int j = 0 ; j <= 5 ; j ++){
                    Message msg =
                            new Message("OrderTopicTest", "order_"+orderId, "KEY" + orderId,
                                    ("order_"+orderId+" step " + j).getBytes(RemotingHelper.DEFAULT_CHARSET));
                    SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
                        @Override
                        public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                            Integer id = (Integer) arg;
                            int index = id % mqs.size();
                            return mqs.get(index);
                        }
                    }, orderId);

                    System.out.printf("%s%n", sendResult);
                }
            }

            producer.shutdown();
        } catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

消费者

@Component
@RocketMQMessageListener(
        consumerGroup = "${rocketmq.techbase.consumer.process-center-approval-group}",
        topic = "${rocketmq.techbase.consumer.process-center-approval-topic}",
        consumeMode = ConsumeMode.ORDERLY,
        nameServer = "${rocketmq.techbase.name-server}",
        secretKey = "${rocketmq.techbase.consumer.secret-key}",
        accessKey = "${rocketmq.techbase.consumer.access-key}"
)
public class OrderlyConsumer implements RocketMQListener<MessageExt>{}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值