范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

RabbitMQ官方NET教程(三)发布订阅

  上一篇博客中,我们实现了工作队列,并且我们的工作队列中的一个任务只会发给一个工作者,除非某个工作者未完成任务意外被杀死,会转发给另外的工作者。在这部分中,我们会做一些完全不同的事情 - 我们会向多个消费者传递信息。这种模式被称为"发布/订阅"。
  为了说明这个模式,我们要建立一个简单的日志记录系统。它将包括两个程序 - 第一个将发出日志消息,第二个将接收并打印它们。
  在我们的日志系统中,每一个运行的接收者程序都会收到日志。这样我们就可以实现一个接收者将接收到的数据写到硬盘上,与此同时,另一个接收者把接收到的消息展现在屏幕上。
  本质上来说,就是已发布的日志消息将被广播到所有接收者。 转发器(Exchanges)
  前面的博客中我们主要的介绍都是发送者发送消息给队列,接收者从队列接收消息。下面我们会引入Exchanges,展示RabbitMQ的完整的消息模型。
  让我们快速了解我们在以前的教程中介绍的内容: 生产者是发送消息的用户应用程序。 队列是存储消息的缓冲区。 消费者是接收消息的用户应用程序。
  RabbitMQ中的消息传递模型的核心思想是,生产者从不将任何消息直接发送到队列。实际上,生产者通常甚至不知道是否将消息传递到任何队列。
  相反,生产者只能将信息发送到 exchange  。交换是一件非常简单的事情。一方面,它收到来自生产者的消息,另一方将它们推送到队列。交换机必须准确知道接收到的消息如何处理。应该追加到特定队列吗?应该追加到很多队列吗?或者应该丢弃。其规则由exchange   类型定义。
  有几种交换类型可用: direct, topic, headers 和fanout。 我们将重点关注最后一个 - fanout。 我们创建一个这种类型的 exchange  ,并称它为logs  :channel.ExchangeDeclare("logs", "fanout");
  fanout交换器非常简单。 正如您可以从名称猜出,它只是将所有收到的消息广播到所有知道的队列。 这正是我们需要的记录器。 列出交换机
  要列出服务器上的交换机,您可以运行有用的rabbitmqctl: sudo rabbitmqctl list_exchanges
  在这个列表中会有一些 amq.*  交换和默认(未命名)交换。 这些是默认创建的,但是不太可能需要使用它们。默认交换
  在本教程的前面部分,我们对交换没有任何了解,但仍然能够将消息发送到队列。 这是可能的,因为我们使用默认交换,我们通过空字符串 ("")  标识。
  回想一下我们之前发布的消息: var message = GetMessage(args); var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "",                          routingKey: "hello",                          basicProperties: null,                          body: body);
  第一个参数是交换的名称。 空字符串表示默认或无名交换:消息通过路由Key指定的名称路由到队列(如果存在)。
  现在,我们可以发布到我们命名的交换机: var message = GetMessage(args); var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "logs",                      routingKey: "",                      basicProperties: null,                      body: body); 临时队列(Temporary queues)
  前面我们使用的是具有指定名称的队列(记得 hello  和task_queue  ?)。 能够命名队列对我们而言至关重要 - 我们需要将工作者指向同一个队列。 当您想要在生产者和消费者之间共享队列时,给队列一个名字很重要。
  但是我们的日志系统我们并不关心队列的名称。 我们希望接收到所有的日志消息,而不仅仅是它们的一部分。 而且我们也只对当前正在传递的数据的感兴趣。 要解决我们的需,要做两件事情。
  首先,每当我们连接到Rabbit,我们需要一个新的空的队列。 为此,我们可以创建一个具有随机名称的队列,或者甚至更好 - 让服务器为我们选择一个随机队列名称。
  其次,一旦消费者与Rabbit断开,队列应该被自动删除。
  在.NET客户端中,当我们没有为 queueDeclare()  提供参数时,我们创建了一个不可持续的,独占的,自动删除的队列,其中包含一个生成的名称:var queueName = channel.QueueDeclare().QueueName;
  此时,queueName包含一个随机队列名称。 例如,它可能看起来像amq.gen-JzTY20BRgKO-HjmUJj0wLg。 绑定(Bindings)
  我们已经创建了一个扇出交换和一个队列。 现在我们需要告诉交换机发送消息到我们的队列。 交换和队列之间的关系称为绑定(binding)。 channel.QueueBind(queue: queueName,                   exchange: "logs",                   routingKey: "");
  从现在开始, logs   交换器将追加消息到我们的队列。列出绑定
  你可以列出现有的绑定: rabbitmqctl list_bindings 完整的例子
  发出日志消息的生产者程序与上一个教程并没有太大的区别。 最重要的变化是我们现在想将消息发布到我们的 logs  交换器,而不是无名的。 发送时需要提供一个routingKey  ,但是对于fanout   交换来说,它的值被忽略。 这里是EmitLog.cs  文件的代码:using System; using RabbitMQ.Client; using System.Text;  class EmitLog {     public static void Main(string[] args)     {         var factory = new ConnectionFactory() { HostName = "localhost" };         using(var connection = factory.CreateConnection())         using(var channel = connection.CreateModel())         {             channel.ExchangeDeclare(exchange: "logs", type: "fanout");              var message = GetMessage(args);             var body = Encoding.UTF8.GetBytes(message);             channel.BasicPublish(exchange: "logs",                                  routingKey: "",                                  basicProperties: null,                                  body: body);             Console.WriteLine(" [x] Sent {0}", message);         }          Console.WriteLine(" Press [enter] to exit.");         Console.ReadLine();     }      private static string GetMessage(string[] args)     {         return ((args.Length > 0)                ? string.Join(" ", args)                : "info: Hello World!");     } }
  如你所见,建立连接后,我们声明交换。 此步骤是必须的,因为禁止发布到不存在的交换机。
  如果没有任何队列绑定到交换机,消息将丢失,但是对我们来说没关系; 如果没有消费者正在收听,我们可以放心地放弃信息。
  ReceiveLogs.cs  的代码:using System; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text;  class ReceiveLogs {     public static void Main()     {         var factory = new ConnectionFactory() { HostName = "localhost" };         using(var connection = factory.CreateConnection())         using(var channel = connection.CreateModel())         {             channel.ExchangeDeclare(exchange: "logs", type: "fanout");              var queueName = channel.QueueDeclare().QueueName;             channel.QueueBind(queue: queueName,                               exchange: "logs",                               routingKey: "");              Console.WriteLine(" [*] Waiting for logs.");              var consumer = new EventingBasicConsumer(channel);             consumer.Received += (model, ea) =>             {                 var body = ea.Body;                 var message = Encoding.UTF8.GetString(body);                 Console.WriteLine(" [x] {0}", message);             };             channel.BasicConsume(queue: queueName,                                  noAck: true,                                  consumer: consumer);              Console.WriteLine(" Press [enter] to exit.");             Console.ReadLine();         }     } }
  按照教程一的安装说明生成 EmitLogs  和ReceiveLogs  项目。
  如果要将日志保存到文件,只需打开控制台并键入: cd ReceiveLogs dotnet run > logs_from_rabbit.log
  如果您希望在屏幕上看到日志,则产生一个新的终端并运行: cd ReceiveLogs dotnet run
  当然,要发射日志类型: cd EmitLog dotnet run
  使用 rabbitmqctl list_bindings  ,您可以验证代码是否按照我们想要的方式创建绑定和队列。 运行两个ReceiveLogs.cs程序时,您应该看到如下所示:sudo rabbitmqctl list_bindings # => Listing bindings ... # => logs    exchange        amq.gen-JzTY20BRgKO-HjmUJj0wLg  queue           [] # => logs    exchange        amq.gen-vso0PVvyiRIL2WoV3i48Yg  queue           [] # => ...done.
  对结果的解释很简单:来自交换机 logs   的数据转到具有服务器分配名称的两个队列。 这正是我们的意图。

法尔14158封盖山东三分球37投7中惜败新疆送对手6连胜北京时间1月7日15时,202223赛季CBA常规赛第二阶段,新疆队10095力克山东队夺取6连胜。山东队输掉此役后则遭遇4连败。此役,新疆队三分球30投14中,山东队三分球37投中华优秀传统文化系列谈丨浓墨重彩的妆容,何以诠释千变万化的戏曲美戏曲妆容写真近年来甚为流行。然而,人们或许不知道戏曲妆容曾几经变化,最终才淬炼成代表中华优秀传统文化的一门绝活,淋漓尽致地诠释戏曲之美。本期艺术,让我们聚焦戏曲妆容之道。编者梨园本梦幻西游1。10维护解读,自走棋玩法开测梦幻西游1。10维护解读,自走棋玩法开测每周例行维护解读,本周的内容较多,一个一个来。1春季活动开测。节日活动,除了环式小副本这些老几样,今年还多了一个擂台赛。这个擂台赛是1月13传统文化与情感文明素养协同孕育56岁周记(十三)第275周小糯米身体运动智能发展元旦骑新车到商业中心道德经与家庭教育之十二道德经第三十二章讲守道宾物。守道管理天下,就如一切河川溪水都归流于江海,使万物自然宾服。质朴的道看似小且无热雪相约燃擎磐石磐石市第七届冰雪文化节暨五冶杯冰雪汽车拉力赛开幕银装素裹莲花山,雪待如蝶翩翩起舞。充分发挥磐石冰雪资源优势,拓展冰雪产业,打造冰雪旅游品牌,1月8日,磐石市第七届冰雪文化节暨五冶杯冰雪汽车拉力赛开幕。本次活动以热雪相约,燃擎磐石张天爱晒海边度假照,长腿吸睛,身材火辣丰满傲人!头条创作挑战赛张天爱晒最新美照,只见她长发披肩,穿一身黑白相间休闲套装来到海边漫步度假游玩。她举起双手,秀出丰满傲人的曲线和身材,真的是火辣性感又迷人。海水波涛汹涌,波澜起伏,张天红星美凯龙拟改嫁厦门国企建发股份厦门国资上市公司建发股份(600153)1月8日晚公告,公司正在筹划通过现金方式协议收购红星美凯龙控股集团有限公司(以下简称红星控股)持有的美凯龙不超过30的股份。本次交易完成后,沪媒申花部分队员相继发烧,将会缺席足协杯14决赛次回合比赛直播吧1月7日讯足协杯14决赛第二回合今日开战,上海申花将对阵沧州雄狮。据翼翼申辉微信公众号消息,申花部分队员相继发烧将会缺席今天的比赛。在首回合比赛中,申花51战胜对手占得先机,中国人寿四家驻深机构亮相深圳金博会!重点展示最新成果来源读特1月9日,第十六届深圳国际金融博览会(以下简称金博会)在会展中心开幕,中国人寿保险(集团)公司旗下寿险财险广发银行和海外公司四家成员单位的驻深机构联合参展,这是该公司以驻深原神第三张角色主题OST即将上线原神第三张角色主题OST即将上线点击链接httpsy。qq。comn3clientpagesreservev2index。html?id1875前往QQ音乐平台预约闪耀的群星3Th北滘机器人谷智造产业园再添深圳力量,可信华成智造基地进驻顺德机器人产业集群,再添深圳力量。1月8日,佛山北滘机器人谷智造产业园内,深圳可信华成通信科技有限公司(下称可信华成)签约进驻海创大族机器人智造城。可信华成将打造自动化装备多轴机器
突发!千亿旭辉官宣暴雷被评为示范性民营房企的旭辉,是业内公认的优等生。不管是总资产,还是销售金额,旭辉都是行业中的排头兵,不过最近旭辉却始料不及地遭遇了一场暴雷风波!11月1日,旭辉发布公告称,自今年1恢复自由身,中天城投会好吗?中天金融与佳源创盛终于还是分手了。10月27日,随着中天金融一纸公告,佳源创盛89亿元收购中天城投100股权的交易正式终止。虽然这笔交易从一开始就不被看好,且引发很多猜测。但是,当政企携手,共话机遇!泰州市台办主任张彧一行调研合富集团11月1日,泰州市台办主任张彧一行莅临合富集团调研交流,与合富医疗控股股份有限公司董事长合富(中国)医疗科技股份有限公司总经理王琼芝就深化多领域合作等事宜进行了会谈。泰州市台办李晓海外投资收购日资企业注意事项随着一带一路的深入和近期日元贬值等因素,中国对邻国日本的关注度在不断升温,除在日本成立公司以外,考虑收购日资企业的中国企业家也在增加。由于日资企业往往拥有出众的技术能力优秀的员工较北京环球度假区首次实现季度盈利美心红酒小镇将打造夜游IP项目北京环球度假区首次季度盈利近日,环球影城母公司Comcast集团公布第三季度财报,第三季度集团实现总营收298。49亿美元,同比去年微降1。5调整后的EBITDA(税息折旧及摊销前10000斤高粱,理论上能酿多少酒?利润大不大?酿酒师说出事实走在农村大集上,总会遇到有人摆个小摊,吆喝着纯正好喝的散酒,一斤15块钱,欢迎适饮!想必不少爱酒人士都喝过吧?这类酒并非正规酒企产酒,而是民间酿酒师亲手酿造的。由于这类酒酿酒成本低入冬前,少吃猪肉鱼肉,多吃3种低嘌呤食物,手脚不痛营养高大家好,我是四季!现在生活条件变好后,大多数人开始大吃大喝,像我爸就是这样子,隔三差五就去喝酒,久而久而尿酸就会偏高,经常手脚疼痛难受,后来我就建议他多吃蔬菜,通过温补把尿酸降低。勇士官宣新援伤情!浓眉有新情况,科尔是个好人,纳什胜率最高NBA常规赛已经打完了两周,各支球队是啥样子,想必大家都看在眼里。有的球队拿到超高胜率,有的球队则是让人很惊喜。都以为他们要摆烂,结果开局并没有这么做。那么近期有哪些值得关注的信息数读韩国三季度乘用车出口同比涨三成,新能源汽车出口创纪录文懂车帝原创李德喆懂车帝原创行业据韩联社消息,当地时间10月31日,韩国海关发布额最新数据显示,韩国今年第三季度乘用车出口量达到59。4万辆,同比增长26。8出口额同比增加30。1华为起诉美国企业专利侵权,中国电子科技产业在专利围猎中觉醒文金石近日,细心网友发现华为公司新增了一条开庭公告,案由是侵害发明专利权纠纷,被告为美国亚马逊公司。国外公司向中国科技公司挥舞专利大棒的新闻不绝于耳,可如今,中国企业似乎已经有实力12年后再看一脱成名的赵铭,一夜爆红后的背后经不起推敲都说,娱乐圈是个神奇的地方。有人打拼多年不见起色,有人却因为偶然的机会火出天际。赵铭就是这样一个演员。提起她,可能你没有印象。但她却被网友调侃贡献了让子弹飞三分之一的票房。剧中有一