当前位置:   article > 正文

RabbitMQ四种交换机类型_mq交换机类型

mq交换机类型

最新版本的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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/708380
推荐阅读
相关标签
  

闽ICP备14008679号