城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

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

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

半导体量检测设备行业研究迎国产替代最佳机遇(报告出品方作者:东吴证券,周尔双、黄瑞连)一、晶圆厂逆周期大规模扩产,半导体设备需求维持高位大陆晶圆厂逆周期扩产,半导体设备需求维持高位相较半导体设计、封测环节,……为什么中国家庭很少使用空调取暖?到了冬季,空调就都闲置了为什么中国家庭很少使用空调取暖?到了冬季,空调就都闲置了在夏天的时候路过小区楼下,就能够听见空调外机嗡嗡在转的声音,基本上每家的空调都在处于工作的状态。而在冬天的时……华硕ROG魔方幻路由器上市三频万兆,2199元预售华硕ROG推出的新款魔方幻路由器现在已经上市,这是ROG品牌首款Mesh路由器,专门针对游戏玩家打造的无线分布式网络。经优化后,该三频WiFi6系统可提供超快的下载速度、低延迟……天冷了,推荐这6道菜要常吃,强身健体,简单又下饭大家好,我是懒惰的小厨娘又到了跟大家分享美食的时刻了,你们都吃了吗?小雪过后,天气是越来越冷了,在这个时候,我们就需要少吃一些生冷刺激的食物,尤其是女孩子,冰淇淋这……这篇文章堪比大报作品,厉害了我的同学!顶住,无畏风雨大朋友高复班学员范诗琴中国女排一次又一次创造奇迹,这自然离不开她们不放弃、能顶住的精神,离不开她们有不服输的劲儿,不管怎样也得顶住。顶住是一种态度和责……选购冰箱不用再眼花缭乱,一种保鲜技术完美适用于全品类食材!冰箱的保鲜功能一直是消费者的最关心的核心功能之一,一款冰箱的保鲜技术先进实用与否,在很大程度上决定了它的销量和口碑。为此,各厂商纷纷推出各式各样的独家保鲜技术,诸如零度保鲜技术……挖地钻井1万米!除了石油,地底科学家还发现了据中国石化微信公众号12月28消息,中国石化宣布深地工程再获突破,公司部署在四川盆地的风险探井元深1井顺利完钻,完钻井深8866米,创下新的钻井深度纪录。此前,中国石化的仁探1……金州勇士队卫冕冠军应该警醒起来了,季后赛大门都开始摇摇欲坠球队更衣室问题:新赛季作为卫冕冠军勇士并没有过得特别如意,替补阵容大换血(参考之前讲过)球队管理层对于接替水花追人员培养方面与球队现状背道而驰,导致赛季初期战绩一度联盟垫……RabbitMQ官方NET教程(三)发布订阅上一篇博客中,我们实现了工作队列,并且我们的工作队列中的一个任务只会发给一个工作者,除非某个工作者未完成任务意外被杀死,会转发给另外的工作者。在这部分中,我们会做一些完全不同的……最火辣球迷克罗地亚小姐又有新造型!红白挂脖胸衣外穿,太火30岁的克罗地亚小姐伊万娜,在短短十几天时间内,ins粉丝从原来的几十万涨到了现在的240万,在卡塔尔人气暴涨,彻底了一个大网红。伊万娜坐在看台上,都有穿着白袍戴着头巾的卡塔尔……信托知多少?聊起资本圈里的大佬几乎都有关于信托的传奇故事说起信托,你是不是有这种感觉,它很耳熟,但你却知之甚少,既神秘又陌生,但凡聊起资本圈里的大佬,几乎都有关于信托的传奇故事。比如贾跃亭用信托神奇地摆脱了20亿美金的债务;刘强东,……走,去乐山这些书店逛逛!书店是一个城市的梦在精神层面承载着另一个出口寒冷的冬日,适合做一些暖洋洋的事情。比如走进一间静谧的书店、点一杯冒着热气的咖啡、翻开一本有趣的书,度过一段温暖而悠闲的……
洛川传承红色革命精神打造爱国教育课堂小米11系列主板坏了不要慌,不用花钱,不过有几点值得注意国米10巴萨技术统计巴萨七成控球率输掉比赛,恰恰全场最佳外星人存在吗?供应改善,11月索尼PS5在美销量激增45丁俊晖拼了!明年1月连战3站大赛,剑指2目标,为中国斯诺克正天生苦相的7位女星,自带愁眉苦脸丧气样,影响事业发展男篮名单调整!吴前正式归回,辽篮3人落选,杜锋继续信任赵继伟58岁的我终于明白一个道理人生下半场,比的是心态,拼的是健康美丽的杀手紧身胸衣原来危害那么大友谊永不变,相互常思念骨传导耳机是智商税吗,骨传导耳机该不该入手呢
哪里有卖橄榄(腌制橄榄在哪里买才能买到)看看捷途X90是不是想买捷途X90PLUS罗非鱼又叫什么鱼?生日可以穿黑色的衣服吗?参加别人的生日可以穿黑色的衣服吗?野外千疮百孔的榆树疙瘩经过细心养护也Axure8。0小案例:电动机原型松下空气净化器怎么样松下空气净化器特点详细介绍老人怎么使用益智算盘锻炼来例假吃什么(例假来时吃什么最好)路遥《人生》读书笔记与心得感悟董事造句用董事造句大全店铺首页群入口装修教程

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁