• RabbitMQ四种交换机类型


    最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。本文用SpringBoot工程具体介绍四种交换机的使用。

    一、Direct Exchange

    需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。

        @Bean
        DirectExchange directExchange(){
            return new DirectExchange("direct_change");
        }
        @Bean
        Queue queue1(){
            return new Queue(Direct_QUEUE_NAME,true,false,false,null);
        }
    
        @Bean
        Queue queue2(){
            return new Queue(Direct_QUEUE_NAME2,true,false,false,null);
        }
    
        @Bean
        Binding binding(){
            return BindingBuilder.bind(queue1()).to(directExchange()).with("a");
        }
    
        @Bean
        Binding binding2(){
            return BindingBuilder.bind(queue2()).to(directExchange()).with("b");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    二、Fanout Exchange

    发送到交换机的消息会被转发到与该交换机绑定的所有队列上。消息广播。Fanout交换机转发消息是最快的。

        @Bean
        FanoutExchange fanoutExchange(){
            return new FanoutExchange("fanout_change");
        }
        @Bean
        Queue queue3(){
            return new Queue(Direct_QUEUE_NAME3,true,false,false,null);
        }
    
        @Bean
        Queue queue4(){
            return new Queue(Direct_QUEUE_NAME4,true,false,false,null);
        }
    
        @Bean
        Binding binding3(){
            return BindingBuilder.bind(queue3()).to(fanoutExchange());
        }
    
        @Bean
        Binding binding4(){
            return BindingBuilder.bind(queue4()).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

    三、Topic Exchange

    在路由模式的基础上,支持了对key的通配符匹配(星号以及井号),以满足更加复杂的消息分发场景。。“#” : 匹配一个或者多个
    “*”:匹配一个。abc.#会匹配所有abc开头的key

        @Bean
        TopicExchange topicExchange(){
            return new TopicExchange("topic_change");
        }
    
        @Bean
        Queue queue7(){
            return new Queue(Direct_QUEUE_NAME7,true,false,false,null);
        }
    
        @Bean
        Queue queue8(){
            return new Queue(Direct_QUEUE_NAME8,true,false,false,null);
        }
    
    
        @Bean
        Binding binding7(){
            return BindingBuilder.bind(queue7()).to(topicExchange()).with("abc.#");
        }
    
        @Bean
        Binding binding8(){
            return BindingBuilder.bind(queue8()).to(topicExchange()).with("#.d");
        }
    
    • 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

    四、Headers Exchanges

    不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。

    匹配规则x-match有下列两种类型:

    x-match = all :表示所有的键值对都匹配才能接受到消息

    x-match = any :表示只要有键值对匹配就能接受到消息

        @Bean
        HeadersExchange headersExchange(){
            return new HeadersExchange("head_change");
        }
    
    
       @Bean
        Queue queue5(){
            return new Queue(Direct_QUEUE_NAME5,true,false,false,null);
        }
    
        @Bean
        Queue queue6(){
            return new Queue(Direct_QUEUE_NAME6,true,false,false,null);
        }
    
    
      @Bean
        Binding binding5(){
            return BindingBuilder.bind(queue5()).to(headersExchange()).where("age").matches("12");
        }
    
        @Bean
        Binding binding6(){
            return BindingBuilder.bind(queue6()).to(headersExchange()).where("name").matches("luomo");
    
    • 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

    单元测试

    @SpringBootTest
    class DemoApplicationTests {
    
    
        @Autowired
        RabbitTemplate rabbitTemplate;
    
        @Test
        void contextLoads() {
            rabbitTemplate.convertSendAndReceive("direct_change","a","hello queue1");
            rabbitTemplate.convertSendAndReceive("direct_change","b","hello queue2");
        }
    
        @Test
        void fanoutExchange() {
            rabbitTemplate.convertSendAndReceive("fanout_change","","hello queue");
        }
    
    
        @Test
        void headerExchange() {
            Message build = MessageBuilder.withBody("hello luomo".getBytes()).setHeader("name", "luomo").build();
            rabbitTemplate.convertSendAndReceive("head_change","",build);
    
            Message message = MessageBuilder.withBody("hello ddd".getBytes()).setHeader("age", "12").build();
            rabbitTemplate.convertSendAndReceive("head_change","",message);
        }
    
    
      @Test
        void topicExchange() {
            rabbitTemplate.convertSendAndReceive("topic_change","abc.d","test");
        }
    }
    
    • 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

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Vue生命周期
    多进程编程(二):管道
    [ Linux ] 冯诺依曼体系结构 操作系统(OS)
    u盘删除的文件在哪里?u盘数据如何恢复?
    WSO2 EI 6.0.0 集群部署文档 - MySQL版
    【LeetCode】14、最长公共前缀
    Spring总结
    Qt实战案例(54)——利用QPixmap设计图片透明度
    CMAKE小知识
    基于STM32的物联网体感控制机械臂
  • 原文地址:https://blog.csdn.net/web13618542420/article/details/126113962