RabbitMQ-整合Spring cloud Stream

1. 核心概念图示

  1. 基础架构
    在这里插入图片描述
    在这里插入图片描述

2. 基础概念

  1. Barista接口:用来定义通道类型和通道名称,通道名称是作为配置用,通道类型则决定了app会使用这个通道进行发送消息还是从中接收消息。包含了:@Output:输出注解,用于定义发送消息的接口;@Input:输入注解,用于定义消息的消费者接口;@StreamListener:用于定义监听方法的注解。缺点: 无法实现可靠性消息投递,会存在少量的消息丢失的问题。

3. 配置RabbitMQ

  1. 选择合适的Spring cloud和对应的Spring Boot版本。
    在这里插入图片描述

  2. POM文件配置

<!-- Spring Boot版本 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
</parent>

<!-- Spring Cloud版本 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- Spring Cloud Stream和RabbitMQ -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    <version>1.3.4.RELEASE</version>
</dependency>

4. 生产端配置

  1. application.yml文件配置
spring:
  application:
    name: Stream-rabbitMq-producer
  cloud:
    stream:
      binders:
        output-channel:
          destination: exchange-1 #交换机
          group: queue-1 #队列
          binder: rabbit_cluster #集群环境
        rabbit_cluster: # 集群配置<这个属性对应上方的binder>
          type: rabbit # 指定MQ类型, 也可以换成RocketMQ等
          environment:            
          	spring:
              rabbitmq:
                address: 192.168.11.32:5672
                username: guest
                password: guest
                virtual-host: /
server:
  port: 9000
  servlet:    context-path: /producer

  1. 代码编写发送端
// 定义发送channel.
public interface BaristaOutput {

    String OUTPUT_CHANNEL = "output_channel";

    @Output(value = BaristaOutput.OUTPUT_CHANNEL)    
    MessageChannel logOutPut();
}


@EnableBinding(BaristaOutput.class) // 绑定消息发送的通道配置
@Service
public class RabbitMqSender {
    @Autowired
    private BaristaOutput baristaOutput;

    public String sendMessage(Object message, Map<String, Object> properties) throws Exception {        try {
            MessageHeaders headers = new MessageHeaders(properties);
            Message<Object> sendMessage = MessageBuilder.createMessage(message, headers);
            boolean sendStatus = baristaOutput.logOutPut().send(sendMessage);
            System.out.println("=========sending==========");
            System.out.println("发送数据:" + message + ", status: " + sendStatus);
        } catch (Exception e) {            System.out.println("==========error==========");
            throw new RuntimeException(e);
        }
        return null;
    }
}

5. 生产端配置

  1. application.yml文件配置
spring:
  application:
    name: Stream-rabbitMq-cusumer
  cloud:
    stream:
      binders:
        input_channel:
          destination: exchange-1 #交换机 应和producer的exchange一致
          group: queue-1 #队列 应和producer的exchange一致
          binder: rabbitmq-cluster #集群环境
          consumer: # 消费端配置
            concurrency: 1  # 默认监听数
            requeue-rejected: false # 是否重回队列
            acknowledge-mode: MANUAL # 手工签收
            recovery-interval: 3000 # 3s重连
            durable-subscription: true #持久化订阅
            max-concurrency: 5 # 最大监听数
        rabbitmq-cluster: # 集群配置<这个属性对应上方的binder>
          type: rabbit # 指定MQ类型, 也可以换成RocketMQ等
            environment:              
              spring:
                rabbitmq:
                  address: 192.168.11.32:5672
                  username: guest
                  password: guest
                  virtual-host: /


server:
  port: 9001
  servlet:    context-path: /cusumer
  1. 代码编写消费端
// 消费端channel
public interface BaristaInput {

    String INPUT_CHANNEL = "input_channel";

    @Input(value = BaristaInput.INPUT_CHANNEL)    
    SubscribableChannel logInPut();
}



@EnableBinding(BaristaInput.class) // 绑定消息接收的通道配置
@Service
public class RabbitMqReceiver {
    @StreamListener(value = BaristaInput.INPUT_CHANNEL)
    public void receiverMessage(Message message) throws IOException {
        // 获取channel, 需要使用channel进行ACK
        Channel channel = (Channel) message.getHeaders().get(AmqpHeaders.CHANNEL);

        // 获取DELIVERY_TAG
        Long deliveryTag = (Long) message.getHeaders().get(AmqpHeaders.DELIVERY_TAG);

        System.out.println("收到的消息: " + message);
        System.out.println("===========");

        channel.basicAck(deliveryTag, false);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【2021年,将Spring全家桶系列课程进行Review,修复顺序等错误。进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并新增高级的Spring Security等内容,通过手把手一步步教你从零开始学会应用Spring,课件将逐步进行上传,敬请期待】 本课程是Spring案例精讲课程的第四部分Spring CloudSpring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Spring Cloud的核心知识点:注册中心、服务提供者与消费者、服务的调用OpenFeign、Hystrix监控、服务网关gateway、消息驱动的微服务Spring Cloud Stream、分布式集群、分布式配置中心的案例介绍, 快速掌握Spring Cloud的核心知识,快速上手,为学习及工作做好充足的准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring CloudSpring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验  【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值