在 Spring Boot 中使用 RocketMQ 实现消息的顺序发送和消费,需要分别从消息生产者和消息消费者两个方面进行处理。下面将详细介绍实现步骤,并给出示例代码。
1. 引入依赖
首先,在pom.xml文件中添加 RocketMQ 的 Spring Boot Starter 依赖:
xml
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.3</version>
</dependency>
2. 配置 RocketMQ
在application.properties或application.yml中配置 RocketMQ 的相关信息:
properties
rocketmq.name-server=127.0.0.1:9876
rocketmq.producer.group=myProducerGroup
3. 顺序消息发送
3.1自定义队列选择器MessageQueueSelector,根据业务键选择队列
顺序消息发送需要将消息发送到指定的队列,并且同一业务逻辑的消息要发送到同一个队列中。以下是一个顺序消息发送的示例代码:
java
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class OrderMessageSender {
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendOrderMessage(String topic, String orderId, String messageBody) {
try {
Message message = new Message(topic, messageBody.getBytes());
// 自定义队列选择器,根据业务ID选择队列
SendResult sendResult = rocketMQTemplate.getProducer().send(message, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
String id = (String) arg;
int index = Math.abs(id.hashCode()) % mqs.size();
return mqs.get(index);
}
}, orderId);
System.out.println("消息发送成功,发送结果:" + sendResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2使用默认的消息选择器
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendOrderlyMessage(String topic, List<String> messages) {
for (int i = 0; i < messages.size(); i++) {
rocketMQTemplate.syncSendOrderly(topic, MessageBuilder.withPayload(messages[i]).build(), i % 4);
}
}
4. 顺序消息消费
顺序消息消费需要使用@RocketMQMessageListener注解,并将consumeMode设置为ConsumeMode.ORDERLY。以下是一个顺序消息消费的示例代码:
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
@Service
@RocketMQMessageListener(topic = "orderTopic", consumerGroup = "myConsumerGroup", consumeMode = org.apache.rocketmq.client.consumer.listener.ConsumeMode.ORDERLY)
public class OrderMessageConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("接收到顺序消息:" + message);
// 处理消息的业务逻辑
}
}