开发者学堂课程【RocketMQ知识精讲与项目实战(第一阶段):顺序消息发送者】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/702/detail/12383
顺序消息发送者
内容介绍
一、前提
二、实现
三、回顾
一、前提
一个订单的顺序流程是:创建、付款、推送、完成。订单号相同的消息会被先后发送
到同一个队列中,消费时,同一个 Orderld 获取到的肯定是同一个队列。
同一个人在进行订单消息消费时,要保证顺序的一致性。这是我们的需求。
二、实现
创建实体类 orderstep,这个类用它来创建、模拟订单数据,有两个属性,一个是订单id,一个是订单突出。
Buildorders 为我们提供了静态方法,方便去构建静态结合方法,这时有三个订单:
Public staticList buildorders(
//1039L 创建 付款 推送 完成
//1065L 创建 付款
//7235L 创建 付款
不管发送几个消息,必须保证在消费时针对一个订单消费顺序是一致的
先编写消息生产者
创建 producer
发消息流程和之前是一致的,基本代码如下:
package com.theima.mq.rocketmq.order;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
public class Producer (
public static void main(String[] args)throws Exception
//1.创建消息生产者 producer, 并制定生产者组名DefaultMOProducer producer= new DefaultMQProducer( producerGroup:"group1");
//2.指定Nameserver地址producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");
//3.后动 producer
producer.start();
发送订单集合消息内容
//构建消息集合List ordersteps= OrderStep.buildOrders();
/发送消息for (int i=0;icordersteps.size();i++)(
String body = ordersteps.get(i)+"";
Message message = new Message( topic"orderTopic",tags:
"Order",keys: "i"+i,body.getBytes(Ol);
参数一:消息对象
参数二:消息队列的选择器
参数三:选择队列的业务标识(订单ID)
producer.send(msg, new MessageQueueSelector()
@override
public MessageQueue select(List mqs, Message msg,
object arg) (
return null;
),orderId);
此时消息内容编写完毕。
orderId 从当前消息订单中来。
ordersteps.get(i.getorderidb
;//这就是我们给他的订单id
//根据订单 id,应该怎么选择?
SendResult sendResult = producer.send(message, new
MessageQueueSelector()(
@param mqs:队列集合
@param msg: 消息对象
@paramarg: 业务标识的参数
@return
//对应队列,订单选择
@override
public MessageQueueselect(List mqs, Message msg, object arg)
long orderId =(long) arg;
long index = orderId % mqs.size();
return mqs.get((int) index);
), ordersteps.get(i).getOrderId());
System.out.println
("发送结果:"+sendResult);
//一切都完成时,停止
Producer:shutdown
三、回顾
创建 producer,再发送消息,获得了消息订单的集合,
去辨认每个订单消息。
再去构建了一个消息对象,在发送消息的时候注意:用了三个参数的 send 方法,其中,第二个参数是消息队列的选择器,根据消息的业务标识去选择,第三个参数把消息业务标识传递了过去。
根据订单 id 对所有消息队列的分析,确定了队列对象,直接发送。下一次再来订单时,只要订单 id 一样,最终选择的队列也一样,保证了一个订单进入固定的一个队列中去。这时,消息的生产者编写就实现完了。