引入依赖:
org.apache.rocketmq
rocketmq-spring-boot-starter
${rocketmq-spring-boot-starter.version}
编辑配置文件,NameServer服务地址等,可以添加更多详细配置以满足具体业务需求,生产者组一般不关注,消费者组则需要保证组内订阅关系的一致性,可在创建消费者时配置,通常每个微服务只有一组消费者。
rocketmq:
name-server: 192.168.101.128:9876
producer:
group: boot-producer-group
导入配置类,在SpringBoot3及其后续版本中,不会默认导入RocketMQ的配置类,可通过在启动类使用@Import导入或创建其配置类。
@Import(RocketMQAutoConfiguration.class)
生产者,通过RocketMQTemplate其API发送消息。
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Test
void testProducer() {
// 同步消息
rocketMQTemplate.syncSend("bootTestTopic", "我是boot的同步消息");
// 异步消息
rocketMQTemplate.asyncSend("bootTestTopic", "我是boot的异步消息", new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功!");
}
@Override
public void onException(Throwable throwable) {
System.out.println("发送失败!");
}
});
// 单向消息
rocketMQTemplate.sendOneWay("bootTestTopic", "我是boot的单向消息");
// 延迟消息,必须创建Message对象,延迟等级在发送参数中
Message message = MessageBuilder.withPayload("我是boot的延迟消息").build();
rocketMQTemplate.syncSend("bootTestTopic", message, 3000, 3);
// 顺序消息,在发送消息时通过参数直接传入hashKey,保证消息顺序在同一队列
List msgModels = Arrays.asList(
new MsgModel("qwer", 1, "下单"),
new MsgModel("qwer", 1, "短信"),
new MsgModel("qwer", 1, "物流"),
new MsgModel("zxcv", 2, "下单"),
new MsgModel("zxcv", 2, "短信"),
new MsgModel("zxcv", 2, "物流")
);
for (MsgModel msgModel : msgModels) {
rocketMQTemplate.syncSendOrderly("bootTestTopic", JSON.toJSONString(msgModel), msgModel.getOrderNumber());
}
// 携带Tag的消息
rocketMQTemplate.syncSend("bootTestTopic:tagA", "我是boot带tagA的消息");
// 携带key的消息,key携带在消息头中
Message msg = MessageBuilder
.withPayload("我是boot带key的消息")
.setHeader(RocketMQHeaders.KEYS, "asfdsdghfjgh") // 携带key
.build();
rocketMQTemplate.syncSend("bootTestTopic:tagA", msg);
}
消费者,添加@Component和@RocketMQMessageListener注解,注解中指定消费者的具体配置,实现RocketMQListener接口,接口范型指定方法具体的参数类型,方法中对消息进行消费,方法没有报错消费成功,报错则重试消费。
@Component
@RocketMQMessageListener(
topic = "bootTestTopic",
consumerGroup = "boot-test-consumer-group", // 消费者组,组内订阅关系一致性
consumeMode = ConsumeMode.CONCURRENTLY, // 消费模式,默认并发模式,消费顺序消息使用顺序模式
maxReconsumeTimes = 5, // 消费重试次数
selectorType = SelectorType.TAG, // 过滤类型,默认TAG
selectorExpression = "tagA || tagB" // 过滤表达式,默认*全部
)
public class BootSimpleMsgListener implements RocketMQListener {
/**
* 实现消费方法
* 如果范型指定了固定类型的参数,那么消息体的内容就是该方法的参数
* MessageExt是消息的所有内容
* 方法没有报错消费成功,报错就会重试
* @param message
*/
@Override
public void onMessage(MessageExt message) {
System.out.println(message.getKeys()); // 获取key
System.out.println(new String(message.getBody()));
}
}