• RabbitMQ的交换机(原理及代码实现)


    1.交换机类型

    • Fanout Exchange(扇形)
    • Direct Exchange(直连)
    • opic Exchange(主题)
    • Headers Exchange(头部)

    2.Fanout Exchange

    2.1 简介

    Fanout 扇形的,散开的; 扇形交换机

    投递到所有绑定的队列,不需要路由键,不需要进行路由键的匹配,相当于广播、群发;
    如下图所示
    在这里插入图片描述
    P代表provider提供者,X代表exchange交换机,第三部分代表队列

    2.2 代码示例

    2.2.1 扇形交换机与队列

    定义交换机主要由3部分组成,

    • 1.定义交换机
    • 2.定义队列
    • 3.绑定交换机
    @Configuration
    public class RabbitConfig {
        //rabbitmq三部曲
        //1.定义交换机
        @Bean
        public FanoutExchange fanoutExchange(){
            return new FanoutExchange("exchange.fanout");
        }
        //2.定义队列
        //此处定义两个队列
        @Bean
        public Queue queueA(){
            return new Queue("queue.fanout.a");
        }
        @Bean
        public Queue queueB(){
            return new Queue("queue.fanout.b");
        }
        //3.绑定交换机
        @Bean
        public Binding bindingA(FanoutExchange fanoutExchange,Queue queueA){
            //将队列A绑定到扇形交换机
            return BindingBuilder.bind(queueA).to(fanoutExchange);
        }
        @Bean
        public Binding bindingB(FanoutExchange fanoutExchange,Queue queueB){
            //将队列A绑定到扇形交换机
            return BindingBuilder.bind(queueB).to(fanoutExchange);
        }
    }
    
    • 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

    2.2.2 模拟provider发送消息

    发送消息模拟

    @Component
    @Slf4j
    public class MessageService {
        @Resource
        private RabbitTemplate rabbitTemplate;
    
        public void senMsg(){
            //定义消息
            String msg="hello world";
            //发消息
            Message message= new Message(msg.getBytes());
            rabbitTemplate.convertAndSend("exchange.fanout","",message);
            log.info("消息发送完毕,发送时间为:{}", new Date());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.2.3 接受扇形交换机信息

    3.Direct Exchange

    根据路由路由键(Routing Key)精确匹配(一模一样)进行路由消息队列;
    与扇形交换机不同的是,直连交换机必须要绑定key
    在这里插入图片描述

    3.2代码示例

    @Configuration
    public class RabbitConfig {
        //rabbitmq三部曲
        //1.定义交换机
        @Bean
        public DirectExchange directExchange(){
            return ExchangeBuilder.directExchange("exchange.direct").build();
        }
        //2.定义队列
        //此处定义两个队列
        @Bean
        public Queue queueA(){
            return new Queue("queue.direct.a");
        }
        @Bean
        public Queue queueB(){
            return new Queue("queue.direct.b");
        }
        //3.绑定交换机
        @Bean
        public Binding bindingA(DirectExchange directExchange,Queue queueA){
            //将队列A绑定到扇形交换机
            return BindingBuilder.bind(queueA).to(directExchange).with("error");
        }
        @Bean
        public Binding bindingB1(DirectExchange directExchange,Queue queueB){
            //将队列A绑定到扇形交换机
            return BindingBuilder.bind(queueB).to(directExchange).with("error");
        }
        @Bean
        public Binding bindingB2(DirectExchange directExchange,Queue queueB){
            //将队列A绑定到扇形交换机
            return BindingBuilder.bind(queueB).to(directExchange).with("info");
        }
        @Bean
        public Binding bindingB3(DirectExchange directExchange,Queue queueB){
            //将队列A绑定到扇形交换机
            return BindingBuilder.bind(queueB).to(directExchange).with("warning");
        }
    }
    
    • 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

    4. Topic Exchange

    通配符匹配,相当于模糊匹配;

    #匹配多个单词,用来表示任意数量(零个或多个)单词
    *匹配一个单词(必须有一个,而且只有一个),用.隔开的为一个单词

    5.Headers Exchange

    基于消息内容中的headers属性进行匹配;

    用的比较少

  • 相关阅读:
    C++11——lambda表达式
    es索引的性能优化配置
    web前端期末大作业——基于Bootstrap响应式汽车经销商4S店官网21页
    小程序和前台开发软件定制的相关信息|APP网站搭建
    初学者学习JS很吃力怎么办?到底该如何学习JS?
    Java 中if else、多重if、switch效率对比详细讲解
    Linux中SSHD_CONFIG文件详细注解,便于配置
    基于Golang语言GoFrame+Vue+ElementUI后台管理系统框架
    关于原型链
    【Java并发编程】Synchronized关键字实现原理
  • 原文地址:https://blog.csdn.net/qq_43471945/article/details/134041816