pringboot rocketmq消息顺序发送和消费

343 阅读1分钟

在 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.propertiesapplication.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);
        // 处理消息的业务逻辑
    }
}