tnblog
首页
视频
资源
登录

.netcore3.1 RabbitMq Fanout交换机

4920人阅读 2021/1/25 14:07 总访问:3465191 评论:0 收藏:0 手机
分类: RabbitMq

.netcore3.1 RabbitMq Fanout交换机

在前面我们有提到交换机但都是用的普通的交换机(direct),交换机在Rabbitmq中有4种可用类型:directtopicheadersfanout。而今天我要讲的是最后一个fanout交换机,它的作用可以用下面的一张图来说明。

如果你们公司要发新年的祝福语,一般会通过手机发短信给你发一条,然后邮件给你发一条,系统里面也可能会给你发一条。所以这就是fanout交换机的好处,都是同一条消息不同的队列处理相同的消息。

创建相关队列(手机与邮箱)

代码

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "47.98.187.188",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. // 创建交换机 普通类型
  14. channel.ExchangeDeclare("MyFanoutExchangeName", ExchangeType.Fanout,true,false);
  15. // 声明一个队列
  16. channel.QueueDeclare(
  17. queue: "MyFanoutPhone",
  18. durable: true,
  19. exclusive: false,
  20. autoDelete: false,
  21. arguments: null);
  22. // 声明一个队列
  23. channel.QueueDeclare(
  24. queue: "MyFanoutEmail",
  25. durable: true,
  26. exclusive: false,
  27. autoDelete: false,
  28. arguments: null);
  29. // 将队列与交换机绑定在一起
  30. channel.QueueBind("MyFanoutPhone", "MyFanoutExchangeName", string.Empty, null);
  31. channel.QueueBind("MyFanoutEmail", "MyFanoutExchangeName", string.Empty, null);
  32. Console.WriteLine("Finish");
  33. Console.ReadLine();
  34. }
  35. }

运行图片




创建2种消费端(手机和邮箱)

创建消费端

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "47.98.187.188",
  4. UserName = "bob",
  5. Password = "bob",
  6. VirtualHost = "/"
  7. };
  8. // 获取要取消息的队列的名称
  9. var QueueName = args[0];
  10. Console.WriteLine($"Queue Name: {QueueName}");
  11. // 创建一个链接
  12. using (var connection = factory.CreateConnection())
  13. {
  14. // 创建一个通道
  15. using (var channel = connection.CreateModel())
  16. {
  17. // one by one 处理
  18. channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
  19. // 创建消费实例
  20. var consumer = new EventingBasicConsumer(channel);
  21. // 事件在交付到使用者时触发。(消费处理事件)
  22. consumer.Received += (model, ea) =>
  23. {
  24. try
  25. {
  26. string _QueueName = QueueName;
  27. var body = ea.Body.ToArray();
  28. var message = Encoding.UTF8.GetString(body);
  29. Thread.Sleep(1000);
  30. if (QueueName == "MyFanoutPhone")
  31. {
  32. Console.BackgroundColor = ConsoleColor.Blue; //设置背景色
  33. Console.ForegroundColor = ConsoleColor.White; //设置前景色,即字体颜色
  34. Console.WriteLine("From MyFanoutPhone Message: {0}", message);
  35. // 否定确认,减少网络请求,提高性能
  36. channel.BasicAck(ea.DeliveryTag,multiple: true);
  37. }
  38. else
  39. {
  40. Console.BackgroundColor = ConsoleColor.Green;
  41. Console.ForegroundColor = ConsoleColor.DarkGreen;
  42. Console.WriteLine("From MyFanoutEmail Message: {0}", message);
  43. // 重新排队,减少网络请求,提高性能
  44. channel.BasicAck(ea.DeliveryTag, multiple: true);
  45. }
  46. }
  47. catch (Exception ex)
  48. {
  49. Console.WriteLine("【Error】:", ex.Message);
  50. channel.BasicNack(ea.DeliveryTag, multiple: true, requeue: true);
  51. }
  52. };
  53. // 绑定到队列中去
  54. channel.BasicConsume(queue: QueueName, autoAck: false, consumer: consumer);
  55. Console.ReadLine();
  56. }
  57. }

运行消费端

我们这里通过输入不同的参数去不同的队列中处理相同的消息。(开启两个窗体分别处理手机与邮箱)

  1. ./Worker.exe MyFanoutPhone
  2. ./Worker.exe MyFanoutEmail

添加消息

在创建队列的时候添加相关消息。

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "47.98.187.188",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. // 创建交换机 普通类型
  14. channel.ExchangeDeclare("MyFanoutExchangeName", ExchangeType.Fanout,true,false);
  15. // 声明一个队列
  16. channel.QueueDeclare(
  17. queue: "MyFanoutPhone",
  18. durable: true,
  19. exclusive: false,
  20. autoDelete: false,
  21. arguments: null);
  22. // 声明一个队列
  23. channel.QueueDeclare(
  24. queue: "MyFanoutEmail",
  25. durable: true,
  26. exclusive: false,
  27. autoDelete: false,
  28. arguments: null);
  29. // 将队列与交换机绑定在一起
  30. channel.QueueBind("MyFanoutPhone", "MyFanoutExchangeName", string.Empty, null);
  31. channel.QueueBind("MyFanoutEmail", "MyFanoutExchangeName", string.Empty, null);
  32. var properties = channel.CreateBasicProperties();
  33. properties.Persistent = true;
  34. channel.BasicPublish(
  35. exchange: "MyFanoutExchangeName",
  36. routingKey: string.Empty,
  37. basicProperties: properties,
  38. body: Encoding.UTF8.GetBytes("Happy New Year")
  39. );
  40. Console.WriteLine("Finish");
  41. Console.ReadLine();
  42. }
  43. }

运行发布端



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

rabbitmq官网上六大版块之二(Direct类型交换机通过routingKey分类型输出)

其实rabbitmq,老师都说得差不多了,下面是老师的连接。http://www.tnblog.net/aojiancc2/article/UserCategory/134官网教...

rabbitmq六大版块之三(Fanout类型交换机相同数据多逼格处理)

Fanout类型交换机的特点是:同样的数据分发给每一个自己所绑定的队列,每个队列可以按照自己的需求对数据进行不同的处理【...

rabbitmq中Header类型交换机的处理(and与or的处理)

headers类型交换机是通过 muliple attributes 代替 routing key.x-match [all/any]all: 所有地方header头信息必须匹配any:...

mq交换机的各种类型

《1》Message TTL (1) Queue TTL =》 给队列中的所有消息限定一个时间 (2) Message TTL =》 给队列中指定的消息限定一个时...

.netcore3.1 RabbitMq Topics交换机

.netcore3.1 RabbitMq Topics交换机[TOC] Topic Exchange介绍 发送到topic交换机的消息不能具有任意的 routing_key -它必...

.netcore3.1 RabbitMq Header交换机

.netcore3.1 RabbitMq Header交换机[TOC] 标头交换机指在用于在多个属性上路由,这些属性比路由键更容易表示为消息标头...

路由器与交换机的概念和区别

前言:各位看官老爷,大家早上好 俺是小付童鞋 今天和大家浅谈一下路由和交换机之间的连续。如有讲解错误的地方还请各位大佬...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial("_分部页")第二种:@{ Html.RenderPartial("分部页");}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...
这一世以无限游戏为使命!
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术