RocketMQ-SpringBoot整合RocketMQ

233 阅读2分钟

SpringBoot整合RocketMQ

Springboot提供了快捷操作RocketMQ的RocketMQTemplate对象。

1.引入依赖

注意依赖的版本需要和RocketMQ的版本相同。

<!-- RocketMQ依赖 -->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
<!-- springboot测试依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

2.编写配置⽂件

# 配置⽣产者组
rocketmq:
  producer:
    group: producer-group
  name-server: 172.21.244.73:9876

3.编写项目启动类

package com.ganjunhao;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
/**
 * @author ganjunhao
 * @date 2023/5/31 11:35
 */
@SpringBootApplication
public class RocketMQApplication {
    public static void main(String[] args) {
        SpringApplication.run(RocketMQApplication.class, args);
    }
}
​

4.创建生产者发送普通消息测试类

package com.ganjunhao;
​
import org.apache.rocketmq.client.producer.TransactionSendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.test.context.junit4.SpringRunner;
​
/**
 * @author ganjunhao
 * @date 2023/5/31 11:38
 */
@SpringBootTest(classes = RocketMQApplication.class)
@RunWith(SpringRunner.class)
public class RocketMQTest {
​
    @Autowired
    private RocketMQTemplate template;
​
    @Test
    public void send() throws InterruptedException {
        template.convertAndSend("ganjunhaoTopic", "ganjunhao的springboot日记");
        Thread.sleep(60000);
    }
}
​

5.创建普通消费者

package com.ganjunhao.listener;
​
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
​
/**
 * @author ganjunhao
 * @date 2023/5/31 11:37
 */
@Component
@RocketMQMessageListener(consumerGroup = "consumer-group", topic = "ganjunhaoTopic")
public class SanYouTopicListener implements RocketMQListener<String> {
​
    @Override
    public void onMessage(String msg) {
        System.out.println("处理消息:" + msg);
    }
​
}
​

上面为普通消息的生产与消费,

接下来将编写事务消息的生产与消费。

6.在测试类中发送事务消息

    @Test
    public void sendMessageInTransaction() throws Exception {
        String topic = "transactionTopic";
        String msg = "hello transaction spring boot rocketmq";
        String[] tags = new String[]{"TagA", "TagB", "TagC", "TagD", "TagE"};
        for (int i = 0; i < 10; i++) {
            //注意该message为org.springframework.messaging.Message
            Message<String> message = MessageBuilder.withPayload(msg).build();
            //topic和tag整合在⼀起,以":"隔开
            String destination = topic + ":" + tags[i % tags.length];
            //第⼀个destination为消息要发到的⽬的地,第⼆个destination为消费者携带的业务数据
            TransactionSendResult sendResult = template.sendMessageInTransaction(destination, message, destination);
            System.out.println("已发送事务消息:" + sendResult);
            Thread.sleep(1000);
        }
    }

7.创建事务消息监听类(消费者)

package com.ganjunhao.listener;
​
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.apache.rocketmq.spring.support.RocketMQUtil;
import org.springframework.messaging.Message;
import org.springframework.messaging.converter.StringMessageConverter;
​
/**
 * @author ganjunhao
 * @date 2023/6/3 15:41
 */
@RocketMQTransactionListener(rocketMQTemplateBeanName = "rocketMQTemplate")
public class TransactionListener implements RocketMQLocalTransactionListener {
    @Override
    public RocketMQLocalTransactionState
    executeLocalTransaction(Message msg, Object arg) {
        //获得业务参数中的数据
        String destination = (String) arg;
        //使⽤RocketMQUtil将spring的message转换成rocketmq的message
        org.apache.rocketmq.common.message.Message message =
                RocketMQUtil.convertToRocketMessage(new StringMessageConverter(), "utf-8", destination, msg);
        //获得消息中的业务数据tags
        String tags = message.getTags();
        if (StringUtils.contains(tags, "TagA")) {
            //提交本地事务
            System.out.println("TagA提交本地事务");
            return RocketMQLocalTransactionState.COMMIT;
        } else if (StringUtils.contains(tags, "TagB")) {
            //回滚
            System.out.println("TagB回滚本地事务");
            return RocketMQLocalTransactionState.ROLLBACK;
        } else {
            //中间状态
            System.out.println("中间状态");
            return RocketMQLocalTransactionState.UNKNOWN;
        }
    }
​
    @Override
    public RocketMQLocalTransactionState
    checkLocalTransaction(Message msg) {
        return null;
    }
}
​