使用Spring Cloud Stream 驱动 RabbitMQ 代码示例

1、Spring Cloud Stream 官方文档

官方配置文档参考:

Spring Cloud Stream Reference Documentation

Spring Cloud Stream RabbitMQ Binder Reference Guide

说明:

在网上查找了许多关于 SpringCloudStream 的中文配置文档,但多数文档更新不及时。而且 SpringCLoudStream 最近的版本在使用上变化较大,老版本的资料已经失去了参考价值。

官方文档虽然是英文的,对多数国内的开发人员阅读会有些吃力,但好在资料都是最新的,而且现在的翻译软件这么方便,国内的多数开发人员也是有一些英文的阅读基础的,建议还是参考官方文档来测试。

特别说明:

文档中的配置说明中,基本上都是 驼峰命名,但我们在实际的使用过程中,在 yaml 配置文件中,都是使用 - 来分割使用。

比如:文档中的 配置名为 acknowledgeMode

但在 yaml 中 acknowledge-mode

2、示例代码

2.1 application.yml

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: admin
    virtual-host: /
  cloud:
    stream:
      binders:
        # 配置 Binder
        defaultRabbit:
          type: rabbit
          environment:
            spring:
              rabbitmq:
                host: 127.0.0.1
      default:
        binder: defaultRabbit
        consumer:
          max-attempts: 1  # 重试次数, 设置为 1 即不重试
      bindings:
        flowEndConsumer-in-0:
          group: queue  # queue
          destination: dap-oa.flowEnd  # exchange
        flowEndProducer-out-0:
          destination: dap-oa.flowEnd
      rabbit:
        #        default:
        #          acknowledge-mode: manual  # manual 手动确认
        #          dlq-ttl: 5000
        bindings:
          flowEndConsumer-in-0:
            consumer:
              binding-routing-key: flowEnd # 路由键
              exchange-type: topic  # 交换机类型
              # dlq-ttl: 5000 # 消息过期时间
              # acknowledge-mode: manual  # manual 手动确认  默认为 auto 自动确认
          flowEndProducer-out-0:
            producer:
              exchange-type: topic
              routing-key-expression: headers.routingKey # 根据 headers 中的 routingKey 参数,来确认路由到哪个 queue , "routingKey" 可自己命名
    function:
      definition: flowEndProducer;flowEndConsumer # 生产者和消费者必须在此配置,是能被自动识别

此配置内容,会在 rabbitMQ 中生成:

  • exchange : dap-oa.flowEnd
  • queue : dap-oa.flowEnd.queue
  • dap-oa.flowEnd.queue 与 dap-oa.flowEnd 绑定的路由键:flowEnd

交换机 exchange:

队列 queue:

2.2 生产者

方式一:

@Slf4j
@Configuration
public class ProducerDemo {

    @Bean
    public Supplier<Message<String>> flowEndProducer() {
        return new Supplier<Message<String>>() {
            @Override
            public Message<MsgData> get() {
                return MessageBuilder.withPayload("测试内容")
                .setHeader("routingKey", "flowEnd")     // 路由
                .build();
            }
        };
    }
}

方式二:

// 直接通过 StreamBridge 调用

private final StreamBridge streamBridge;

public void send() {
    streamBridge.send(RabbitConstant.FLOW_END_PRODUCER,
    MessageBuilder.withPayload("测试内容")
        .setHeader("routingKey", "flowEnd")
        .build());
}

2.2 消费者

@Slf4j
@Configuration
public class ConsumerDemo {

    @Bean
    public Consumer<Message<String>> flowEndConsumer() {
        return message -> {
            System.out.println("******************");
            System.out.println("At flowEndConsumer");
            System.out.println("******************");
            System.out.println("Received message " + message.getPayload());

            Channel channel = message.getHeaders().get(AmqpHeaders.CHANNEL, Channel.class);
            Long deliveryTag = message.getHeaders().get(AmqpHeaders.DELIVERY_TAG, Long.class);

            log.info("******************");
            log.info("channel:{}", channel);
            log.info("deliveryTag:{}", deliveryTag);
        };
    }
}
posted @ 2022-12-07 09:49  向宁的光  阅读(286)  评论(0编辑  收藏  举报