如何在SpringBoot工程中使用RocketMQ
1.安装RocketMQ(省略)
2.在工程中引入依赖
<!--RocketMQ相关-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.6.0</version>
</dependency>
- 生产者yml配置rockermq
# 配置生产者
rocketmq:
name-server: 虚拟机ip:9876
producer:
group: producerdemo
- 消费者yml配置rockermq
#配置nameserver
rocketmq:
name-server: 虚拟机ip:9876
3.生产者发送消息
//注入RocketMQTemplate
@Autowired
private RocketMQTemplate template;
//参数1:topic 必须 消息主题
//参数2:消息内容
//参数3:超时时间 单位毫秒,不设置默认是3秒
rocketMQTemplate.syncSend("testTopic", "message", 1000);
4.消费者消费消息
- 创建监听消息的类
@component // 注册到spring容器
// RocketMqMwssageListener是一个消费者,通过订阅来消费消息
// topic 监听哪个主题。必须指定消费者组consumGroup
@RocketMqMwssageListener(topic = "testTopic", consumGroup = "consumer1")
// 实现接口注意泛型与发送的消息类型一致
public class DemoListener implements RocketMqListener<String> {
/**
* 一旦监听的topic有消息时就会自己回调这个方法
* 这个方法是被spring封装了的
* 如果成功,返回确认给broker
* 如果失败, 重试3次
* @param message 消息内容 Hello RocketMQ
*/
@Override
public void onMessage(String message) {
System.out.println("消费者消费了: " + message);
}
}
5.顺序消息
- Producer端确保消息顺序唯一要做的事情就是将消息路由到特定的队列,在RocketMQ中,通过MessageQueueSelector来实现分区的选择。
@Test
public void testOrderlyMsg(){
// 1. 消息被发送时保持顺序 有序的订单, 3,4,5 共3个订单
List<Order> orderList = Order.buildOrders();
// 设置消费队列选择器,消息存储时选择队列
//2. 同一个订单要进入同一个队列
rocketMQTemplate.setMessageQueueSelector(new MessageQueueSelector() {
/**
* @param mqs 消息队列集合 4个
* @param msg 消息内容
* @param arg hashKey p3: 唯一标识 order.getId().toString() 就是订单的 id
* @return
*/
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
String orderIdStr = (String) arg;
// 1.订单id
Long orderId = Long.valueOf(orderIdStr);
// 2. 使用订单id求余,除数=队列的个数
int idx = orderId.intValue() % mqs.size();
// 3. 余数就是存入的队列
MessageQueue selectedMQ = mqs.get(idx);
// 4. 返回选中的队列
return selectedMQ;
}
});
for (Order order : orderList) {
// 有序发送 按orderList顺序来发
//1.消息被发送时保持顺序
// p1: topic, p2: 消息内容, p3: 订单的唯一标识, 默认使用轮循的方式(4个队列)
rocketMQTemplate.syncSendOrderly("orderlyTopic", order.getDesc(),order.getId().toString());
}
}
- 消费者,注解增加 consumeMode = ConsumeMode.ORDERLY属性
//consumeMode = ConsumeMode.ORDERLY 消费的模式 ORDERLY 同步顺序消费
@RocketMQMessageListener(topic = "orderlyTopic", consumerGroup = "orderlyConsumer" , consumeMode = ConsumeMode.ORDERLY)
7.延迟消息
//p1: topic
//p2: 消息内容,Message对象
//p3: 发送时超时时间
//p4: 延迟级别 默认18级 3级:延迟10s
// messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
rocketMQTemplate.syncSend("delayTopic", msg,10000, 3);
8.集群消息
/**
1. 集群模式,一个消息只会被一个消费者消费
*/
@Test
public void testClustering(){
for (int i = 1; i <= 20; i++) {
rocketMQTemplate.convertAndSend("ClusteringTopic","消息 " + i);
}
}
- 消费者,创建多个消费者监听同一个topic,并且索格消费者属于同一个消费者组,注解增加messageModel = MessageModel.CLUSTERING属性,消费者之间不会消费重复的消息。
// messageModel = MessageModel.CLUSTERING 消息模式为集群
@RocketMQMessageListener(topic = "ClusteringTopic", consumerGroup = "ClusterConsumerGroup", messageModel = MessageModel.CLUSTERING)
9.广播消息
- 广播模式是所有的消费者都可以收到消息
/**
1. 广播模式,每个消息都会被多个消费者消费
*/
@Test
public void testBroadcasting(){
rocketMQTemplate.convertAndSend("BroadcastingTopic2","消息 ");
}
- 修改消费者的消息类型选项,同一个消费者组中所有成员都消费消息
messageModel = MessageModel.BROADCASTING```