• SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.23 SpringBoot 整合 RabbitMQ(direct 模式)


    SpringBoot

    【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

    SpringBoot 开发实用篇

    5 整合第三方技术

    5.23 SpringBoot 整合 RabbitMQ(direct 模式)
    5.23.1 AMQP

    现在我们已经把RabbitMQ 装上了

    之前我们做ActiveMQ 的时候

    默认是p2p 模型

    在这里插入图片描述

    在这里插入图片描述

    而在AMQP 中

    在这里插入图片描述

    5.23.2 整合 RabbitMQ

    【导入坐标】

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-amqpartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    按照协议名导入的

    在这里插入图片描述

    【配置】

    rabbitmq:
      host: localhost
      port: 5672
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    【实现】

    在这里插入图片描述

    在这里插入图片描述

    先把之前做的 ActiveMQ 实现的注掉

    【配置类】

    package com.dingjiaxiong.service.impl.rabbitmq.direct.config;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.DirectExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * ClassName: RabbitConfigDirect
     * date: 2022/10/22 21:29
     *
     * @author DingJiaxiong
     */
    
    @Configuration
    public class RabbitConfigDirect {
    
        //存储消息的消息队列的对象
        @Bean
        public Queue directQueue(){
    
            return new Queue("direct_queue"); //是否持久化、是否连接专用、是否自动删除【后面其实有三个boolean参数,默认值是tff】
        }
    
        //还可以再来个队列,让它绑在同一个交换机上
        @Bean
        public Queue directQueue2(){
            return new Queue("direct_queue2"); //是否持久化、是否连接专用、是否自动删除【后面其实有三个boolean参数,默认值是tff】
        }
    
        //消息队列不能直接使用,需要使用一个交换机去绑定它
        @Bean
        public DirectExchange directExchange(){
            return new DirectExchange("directExchange");
        }
    
        //做消息队列与交换机的绑定关系
        @Bean
        public Binding bindingDirect(){
            return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
        }
    
        //做消息队列与交换机的绑定关系
        @Bean
        public Binding bindingDirect2(){
            return BindingBuilder.bind(directQueue2()).to(directExchange()).with("direct2");
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    实现类

    package com.dingjiaxiong.service.impl.rabbitmq.direct;
    
    import com.dingjiaxiong.service.MessageService;
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    /**
     * ClassName: MessageServiceRabbitmqDirectImpl
     * date: 2022/10/22 21:25
     *
     * @author DingJiaxiong
     */
    
    @Service
    public class MessageServiceRabbitmqDirectImpl implements MessageService {
    
        @Autowired
        private AmqpTemplate amqpTemplate;
    
        @Override
        public void sendMessage(String id) {
    
            System.out.println("待发送短信的订单已纳入处理队列(rabbitmq direct),id " + id);
            amqpTemplate.convertAndSend("directExchange","direct",id);
    
        }
    
        @Override
        public String doMessage() {
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    做一个自动监听

    package com.dingjiaxiong.service.impl.rabbitmq.direct;
    
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * ClassName: MessageListener
     * date: 2022/10/22 21:40
     *
     * @author DingJiaxiong
     */
    
    @Component
    public class MessageListener {
    
        //收一个消息
        @RabbitListener(queues = "direct_queue")
        public void receive(String id){
    
            System.out.println("已完成短信发送业务(rabbitmq direct),id:" + id);
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    有了这个监听就不用去手动消费了

    OK, 直接开启服务器测试

    生产一个

    在这里插入图片描述

    这个就是listener 自动处理的

    看看控制台

    在这里插入图片描述

    可以看到已经有两个消息队列了

    来自我们初始化时,配置类中

    在这里插入图片描述

    这两个东西

    稍微修改一下

    把监听类放到一个包里

    在这里插入图片描述

    将其复制一个2

    package com.dingjiaxiong.service.impl.rabbitmq.direct.listener;
    
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * ClassName: MessageListener
     * date: 2022/10/22 21:40
     *
     * @author DingJiaxiong
     */
    
    @Component
    public class MessageListener2 {
    
        //收一个消息
        @RabbitListener(queues = "direct_queue")
        public void receive(String id){
    
            System.out.println("已完成短信发送业务(rabbitmq direct two),id:" + id);
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    现在就有两个监听, 而且都监听的是同一个队列

    直接启动看看效果

    在这里插入图片描述

    我一共发了四次

    可以看到它俩是轮流着在对消息进行处理

    就是这样,回顾一下

    • 导入SpringBoot整合RabbitMQ坐标

    在这里插入图片描述

    • 配置RabbitMQ (采用默认配置)

    在这里插入图片描述

    • 定义消息队列(direct)

    在这里插入图片描述

    • 定义消息队列(direct)

    在这里插入图片描述

    在这里插入图片描述

    • 生产与消费消息(direct)

    在这里插入图片描述

    • 使用消息监听器对消息队列监听(direct)

    在这里插入图片描述

    • 使用多消息监听器对消息队列监听进行消息轮循处理(direct)

    在这里插入图片描述

    5.23.3 小结
    1. SpringBoot整合RabbitMQ直连交换机模式【direct】
  • 相关阅读:
    【ONE·R || R与C++混合编程简单介绍 】
    运营︱内容营销怎么做?
    川西旅游网系统-前后端分离(前台vue 后台element UI,后端servlet)
    前端JavaScript中异步的终极解决方案:async/await
    在mybatis-plus项目中自带要编写sql语句,@select注解的使用
    如何分析判断一篇文章是不是chatgpt写的
    面试官直言:有没有 Framework 的项目经验?
    阿曼市场最全开发攻略,看这一篇就够了
    探索云原生数据库技术:构建高效可靠的云原生应用
    数据存储方式——KVELL:快速持续键值存储的设计与实现
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/127994296