一.使用步骤
1.导入依赖
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.启动类
@SpringBootApplication
public class ApplicationStart {
public static void main(String[] args) {
SpringApplication.run(ApplicationStart.class);
}
}
3.yaml配置
这里的配置是针对2.2.1版本
rocketmq:
name-server: 127.0.0.1:9876
#生产者配置
producer:
#生产者组名字
group: "service-producer"
# 消息最大长度 默认 1024 * 1024 * 4 (4M)
max-message-size: 4194304
# 发送消息超时时间,默认 3000
send-message-timeout: 3000
# 发送消息失败重试次数,默认2
retry-times-when-send-failed: 2
# 异步消息发送失败重试次数
retry-times-when-send-async-failed: 2
#达到 4096 ,进行消息压缩
compress-message-body-threshold: 4096
consumer:
#消费者名字
group: "service-consumer"
#批量拉取消息数量
pull-batch-size: 10
message-model: CLUSTERING
selector-expression: "*"
server:
port: 8081
4.生产者
@RestController
public class ProducerController {
@Autowired
private RocketMQTemplate mqTemplate;
@RequestMapping("/send/{message}")
public String sendMessage(@PathVariable("message") String message){
// 创建一个消息
Message<String> msg = MessageBuilder.withPayload(message).build();
// 发消息
mqTemplate.send("topic-test:tags-test",msg);
return "发送成功";
}
}
5.消费者
@Component
@RocketMQMessageListener(
//消费者的名字
consumerGroup = "service-consumer",
//主题
topic = "topic-test",
//tags
selectorExpression = "tags-test",
//消息消费模式:默认是CLUSTERING集群,还支持BROADCASTING广播
messageModel = MessageModel.CLUSTERING)
//MessageExt:Message对象的子类
public class TestConsumer implements RocketMQListener<MessageExt> {
@Override
public void onMessage(MessageExt message) {
//这里拿到的消息 message.getBody 是byte[]格式。
if(message.getBody() == null ||message.getBody().length == 0)return;
//拿到消息:如果发送的消息是字符串,那么需要把byte[]转为字符串
String msg = new String(message.getBody(), StandardCharsets.UTF_8);
System.out.println("收到消息:" + msg);
}
}
二.一些生产者的消息发送方式
1.异步发送
// 异步发送
mqTemplate.asyncSend("topic-test:tags-test", message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println(sendResult);
System.out.println("发送成功");
}
@Override
public void onException(Throwable e) {
System.out.println("发送失败");
e.printStackTrace();
}
});
2.延迟发送
在SpringBoot中发送RocketMQ延迟消息只需要设置一个延迟等级即可
- api : public SendResult syncSend(String destination, Message<?> message, long timeout, int delayLevel) : delayLevel就是延迟等级
// 延迟发送
// 创建一个消息
Message<String> msg = MessageBuilder.withPayload(message).build();
mqTemplate.syncSend("topic-test:tags-test", msg, 2000, 3);
return "发送成功";
这里设置的等级是 3,对应的是 10S,也就是10s之后,消费者就可以收到该消息了。