草庐IT

【微服务专题之】.Net6中集成消息队列-RabbitMQ中直接路由模式

【趣编程】.NET 2023-03-28 原文


前文回顾
【微服务专题之】.Net6下集成消息队列上-RabbitMQ

【微服务专题之】.Net6下集成消息队列2-RabbitMQ

RabbitMQ中直接路由模式

https://mp.weixin.qq.com/s?__biz=Mzg5MTY2Njc3Mg==&mid=2247484258&idx=1&sn=aa9e4a6d71d141353a115c15aede8869&chksm=cfc8ab59f8bf224fdaf2f5b728cc03b25987c5460c2cd386c301ba126aba2fc485bd351e4419&token=2109866031&lang=zh_CN#rd

路由模式就是生产者与消费者之间基于交换机通信的时候,生产者指定路由发送数据,消费者绑定路由接收数据。这个与前文讲解的发布/订阅模式有一定的区分,发布订阅模式只要绑定了交换机的队列(queue)都会收到生产者通过交换机发送过来的数据,而路由模式增加了一个指定路由的设置,会声明发送到交换机下的哪个路由,而接受的消费者只有绑定了队列并且声明了该路由才会接受到数据。

代码演示
生产者代码:

1public static void Send(IModel channel)
2        {
3            channel.ExchangeDeclare( "hello-direct-exchange",ExchangeType.Direct);
4            var count = 0;
5            while (true)
6            {
7                Thread.Sleep(1000);
8                // 发送的消息
9                string message = $"Hello World {count}";
10                var body = Encoding.UTF8.GetBytes(message);
11                var body2 = Encoding.UTF8.GetBytes(message+"body2");
12
13                // 基本发布 不指定交换
14                channel.BasicPublish(exchange: "hello-direct-exchange",
15                                     // 路由键   就是队列名称
16                                     routingKey: "route1",
17                                     // 基础属性
18                                     basicProperties: null,
19                                     // 传递的消息体
20                                     body: body);
21
22                channel.BasicPublish(exchange: "hello-direct-exchange",
23                                     // 路由键   就是队列名称
24                                     routingKey: "route2",
25                                     // 基础属性
26                                     basicProperties: null,
27                                     // 传递的消息体
28                                     body: body2);
29                count++;
30                Console.WriteLine(" [x] sent {0}", message);
31            }
32        }

消费者代码

1public static void Receive(IModel channel)
2        {
3            channel.ExchangeDeclare("hello-direct-exchange", ExchangeType.Direct);
4            channel.QueueDeclare(queue: "hello-direct-queue",
5                        durable: true,
6                        exclusive: false,
7                        autoDelete: false,
8                        arguments: null);
9            channel.QueueBind("hello-direct-queue", "hello-direct-exchange", "route1");
10            channel.QueueBind("hello", "hello-direct-exchange", "route2");
11
12            // 创建一个消费者基本事件
13            var consumer = new EventingBasicConsumer(channel);
14            consumer.Received += (model, ea) =>
15            {
16                var body = ea.Body.ToArray();
17                var message = Encoding.UTF8.GetString(body);
18                Console.WriteLine(" [x] Received {0}", message);
19            };
20            channel.BasicConsume(queue: "hello-direct-queue",
21                                 // 自动确认
22                                 autoAck: true,
23                                 consumer: consumer);
24
25            channel.BasicConsume(queue: "hello",
26                                 // 自动确认
27                                 autoAck: true,
28                                 consumer: consumer);
29
30            Console.WriteLine(" Press [enter] to exit.");
31            Console.ReadLine();
32        }

效果展示

PS:代码详解见视频~如需源码,请加VX: qubiancheng666

有关【微服务专题之】.Net6中集成消息队列-RabbitMQ中直接路由模式的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  7. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  8. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  9. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  10. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

随机推荐