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;
}
}