springboot3探索日记(4)—springcloud-stream使用

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请求与结果:

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值