RabbitMQ七:交换机类型Exchange Types--Fanout 介绍

前言

最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

其中之前我们用过Direct exchange,Direct直接翻译过来就是"直接的,直的",在我们之前的案例中基本都是Direct类型。

其一:Direct Exchange – 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。

如果一个队列绑定到该交换机上要求路由键 “key”,则只有被标记为“key”的消息才被转发,只会转发key。 Direct在前面案例中已经有案例,我们就不做重点了。

其二: Fanout Exchange – 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。 (最实际开发中遇到的案例:你注册某网站,对方会给你邮箱和短信发送同样的内容.......)话不多说,今天的主角就是 Fanout Exchange,英语翻译(fanout :分列)

其三,其四,请看下回讲解,哈哈哈.....,

进入场景:::需求,某网站注册成功,同时给手机端和邮箱发同样的消息,(备注:代码中我会采用,一次性发100条消息,也是为了跟上篇文章作比较)

代码

发布端:

案例简述(比如:注册成功会有发送一百条同样的消息,这里是为了跟上篇文章做比较)

  /// <summary>
        /// fanout实现   模拟场景: 客户注册某某网站,消息提醒同一条消息,分别发送给短息和邮件方
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            using (var channel = HelpConnection.GetConnection().CreateModel())
            {
  //声明一个fanout类型的Exchange channel.ExchangeDeclare(
"fanoutExchange", "fanout", true, false, null); for (int i = 0; i < 100; i++) { var reamker = i % 2 == 0 ? "sms" : "emai"; var msg = Encoding.UTF8.GetBytes("内容:发送内容,我最帅" + i.ToString()); Console.WriteLine("内容:发送内容,"+i); //不需要指定routingkey,指定了也没用.因为交换机是fanout类型 channel.BasicPublish("fanoutExchange",string.Empty, null, msg); } } Console.WriteLine("发布成功"); Console.ReadKey(); }

效果图:

消费端

模拟场景:发布端已经发布100条数据,我们消费端模拟,当你输入登录邮箱的时候能看到发送的消息,你查看手机短信页面的时候查看到发送的消息;

        /// <summary>
        ///   消费者 fanout实现   模拟场景: 客户注册某某网站,消息提醒同一条消息,分别发送给短息和邮件方
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("请选择登陆:1邮箱,2短信?");
                var readline = Console.ReadLine();
                //邮箱短信
                if (readline == "1" || readline == "2")
                {
                    var queueName = readline == "1" ? "sms" : "emai";
                    using (var channel = HelpConnection.GetConnection().CreateModel())
                    {
                        channel.QueueDeclare(queueName, true, false, false, null);
                        channel.ExchangeDeclare("fanoutExchange", "fanout", true, false, null);
                        //不需要指定routingkey,指定了也没用.因为交换机是fanout类型
                        channel.QueueBind(queueName, "fanoutExchange", string.Empty, null);
                        var consumer = new EventingBasicConsumer(channel);
                        consumer.Received+=(mode,e)=>{
                           var msg=Encoding.UTF8.GetString(e.Body);
                           Console.WriteLine(queueName + "显示结果:" + msg);
                        };
                        channel.BasicConsume(queueName,true,consumer);
                       Console.ReadKey();
                    }
                }
                else
                {
                    Console.WriteLine("输入有误,请重新输入!!");
                }
            }
        }

效果图,

操作简述,由于队列消息我们在客户端创建的,所以,你启动消费端,输入邮箱和邮件的时候才能创建队列,之前案例中也有类似的demo,当然第一次创建的时候,肯定会把发布者第一发布的消息给消费了,当你发布第二次消息的时候,我们就能看消费者中代码创建的(100条)消息。整个过程最好你把代码敲一遍,很自然就能理解整个过程。

 

 

 

 

总结

 我感觉这是Demo中学习运用,还需要在具体的实际项目中实践,一些代码如何去封装适合的场景,让我们一起写博文分享中前进吧;

 

  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
  • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。

转载于:https://www.cnblogs.com/lrzr/p/7358845.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用RabbitMQ绑定交换机类型可以通过以下步骤进行: 1. 创建一个Exchange声明类,通过注解@Exchange声明交换机,指定交换机名称、类型、是否持久化等属性。 ```java @Configuration public class ExchangeConfig { @Bean public Exchange directExchange() { return ExchangeBuilder.directExchange("direct.exchange") .durable(true) .build(); } @Bean public Exchange fanoutExchange() { return ExchangeBuilder.fanoutExchange("fanout.exchange") .durable(true) .build(); } @Bean public Exchange topicExchange() { return ExchangeBuilder.topicExchange("topic.exchange") .durable(true) .build(); } @Bean public Exchange headersExchange() { return ExchangeBuilder.headersExchange("header.exchange") .durable(true) .build(); } } ``` 2. 在RabbitMQ配置文件中配置交换机绑定关系,将Exchange声明类中定义的交换机与队列进行绑定。 ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / listener: simple: acknowledge-mode: manual template: mandatory: true publisher-returns: true publisher-confirm-type: correlated listener: simple: default-requeue-rejected: false bindings: direct-binding: destination: direct.queue exchange: direct.exchange routing-key: direct fanout-binding: destination: fanout.queue exchange: fanout.exchange topic-binding: destination: topic.queue exchange: topic.exchange routing-key: topic.* headers-binding: destination: headers.queue exchange: header.exchange headers: key: value ``` 在以上配置中,我们定义了四个交换机类型并分别绑定了队列,其中direct-binding使用了routing-key,topic-binding使用了通配符*,headers-binding使用了headers参数。 这样,在Spring Boot应用中就可以使用RabbitMQ进行消息的发送和接收了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值