springcloud版本:2021.0.8
jdk版本:21
spring-cloud-starter-stream-rocketmq,跟随cloud版本
低版本中使用@EnableBinding、@StreamListener、@SendTo等实现消息的生产、消费功能,但在高版本会删除这些注解,后续就不能用了。
新的使用方式,两个示例:
1. 普通发送、接收消息
2. 消息传递,demo2生产者发送消息,demo2消费者(叫【数据转换者】可能更合适)转换后,再转发给demo3消费者
pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
application.yml
spring:
cloud:
# mq消息
stream:
default-binder: rocketmq
rocketmq:
binder:
access-key: xxxxx
secret-key: 123456
#客户端接入点
name-server: 192.168.1.2:9876
# 关闭消息跟踪
enable-msg-trace: false
bindings:
# 生产消费通道格式:方法名-{in|out}-下标
# 生产通道
demo1-out-0:
destination: demo1
contentType: application/json
group: magnetic-in
# 消费通道。
demo1-in-0:
destination: demo1
contentType: application/json
group: magnetic-in
consumer:
#最大重试次数(消费)
max-attempts: 3
# 重试初始间隔时间
back-off-initial-interval: 1000
# 重试时间递增乘数
back-off-multiplier: 2.0
demo2-out-0:
destination: demo2
contentType: application/json
group: demo2-in
# 转换者、下游消费者,用|隔开
demo2|demo3-in-0:
destination: demo2
contentType: application/json
group: demo2-in
function:
# 多个消费者需要在这里声明。以;隔开
definition: demo1;demo2|demo3
消费者定义:
@Slf4j
@Configuration
public class MqBean {
// demo1 单纯的消费者,方法名对应demo1-in-0的第一段
@Bean
public Consumer<DemoReqDTO> demo1() {
return reqDTO -> log.info("[消息方法1]处理消息:{}", JSON.toJSONString(reqDTO));
}
// 消息转换
@Bean
public Function<DemoReqDTO, DemoReqDTO> demo2() {
return reqDTO -> {
log.info("[消息方法2]处理消息:{}", JSON.toJSONString(reqDTO));
return reqDTO.setName(String.format("[%s]", reqDTO.getName()));
};
}
// 消费者demo3
@Bean
public Consumer<DemoReqDTO> demo3() {
return reqDTO -> log.info("[消息方法3]处理消息:{}", JSON.toJSONString(reqDTO));
}
}
Controller,手动发送消息示例
@Tag(name = "消息测试", description = "mq")
@RestController
@RequestMapping("/mq")
public class ProDemoController implements ReqUrlConstant {
@Resource
private StreamBridge bridge;
// 也可以用RocketMQTemplate,但不如StreamBridge通用
// @Resource
// private RocketMQTemplate rocketMQTemplate;
@Operation(summary = "发消息1")
@PostMapping("/send1")
@ApiOperationSupport(order = 1)
public Result<Void> send1(@Valid @RequestBody DemoReqDTO demoReqDTO) {
// 组装消息内容
Message<DemoReqDTO> message = MessageBuilder.withPayload(demoReqDTO)
.build();
bridge.send("demo1-out-0",message);
// rocketMQTemplate.send("demo1-out-0",message);
return Result.success();
}
@Operation(summary = "发消息2", description = "传递型消息处理示例")
@PostMapping("/send2")
@ApiOperationSupport(order = 2)
public Result<Void> send2(@Valid @RequestBody DemoReqDTO demoReqDTO) {
Message<DemoReqDTO> message = MessageBuilder.withPayload(demoReqDTO)
.build();
bridge.send("demo2-out-0",message);
return Result.success();
}
}
send1请求与结果:
send2请求与结果: