首页 > 代码库 > RabbitMQ五:生产者--队列--多消费者
RabbitMQ五:生产者--队列--多消费者
一、生成者-队列-多消费者(前言)
上篇文章,我们做了一个简单的Demo,一个生产者对应一个消费者,本篇文章就介绍 生产者-队列-多个消费者,下面简单示意图
P 生产者 C 消费者 中间队列
需求背景:工厂某部门需要生产n个零件,部门下面有2个小组,每个小组需要生产n/2个
公平派遣
每个小组的情况下,当所有奇怪的信息都很重,甚至信息很轻的时候,一个工作人员将不断忙碌,另一个工作人员几乎不会做任何工作。那么,RabbitMQ不知道什么,还会平均分配消息。
这是因为当消息进入队列时,RabbitMQ只会分派消息。它不看消费者的未确认消息的数量。它只是盲目地向第n个消费者发送每个第n个消息。
下面就由我们撸代码实现,这一需求::::
二、代码
P 生产者代码:::
static void Main(string[] args) { using (var channel = HelpConnection.GetConnection().CreateModel()) { //声明队列 channel.QueueDeclare("firstQueue", true, false, false, null); //声明路由 channel.ExchangeDeclare("firstExchange", "direct", true, false, null); //绑定 建立关系 channel.QueueBind("firstQueue", "firstExchange", "firstQueue_Exchange"); //内容的基本属性 var properties=channel.CreateBasicProperties(); //设置消息内容持久化 properties.Persistent = true; int j = 0; for (int i = 0; i < 100; i++) { var msg = Encoding.UTF8.GetBytes("生产者-队列-多个消费者" + i); channel.BasicPublish(exchange: "firstExchange", routingKey: "firstQueue_Exchange", basicProperties: properties, body: msg); j = i; Console.WriteLine( i); } Console.WriteLine("添加成功" + j + "条"); Console.ReadKey(); } }
成功添加100条
C 消费者代码:::
/// <summary> /// /// </summary> /// <param name="args"></param> static void Main(string[] args) { using (var channel = HelpConnection.GetConnection().CreateModel()) { //声明队列 channel.QueueDeclare("firstQueue", true, false, false, null); //声明路由 channel.ExchangeDeclare("firstExchange", "direct", true, false, null); //绑定 建立关系 channel.QueueBind("firstQueue", "firstExchange", "firstQueue_Exchange"); //公平分发 同一时间只处理一个消息 channel.BasicQos(0, 1, true); var conSumer = new EventingBasicConsumer(channel); conSumer.Received += (moede, e) => { var body = e.Body; var msg = Encoding.UTF8.GetString(body); Console.WriteLine("显示结果:"+msg); //进行交付,确定此消息已经处理完成 // channel.BasicAck( e.DeliveryTag, false); }; //确认收到消息 进行消费 channel.BasicConsume("firstQueue", true, conSumer);//false 手动应答;true:自动应答 Console.ReadKey(); } }
效果图
三、总结
本章总结注意几点:::
1、即使RabbitMQ重新启动,task_queue队列也不会丢失。现在我们需要将我们的消息标记为持久性 - 将IBasicProperties.SetPersistent设置为true。
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
2、公平分发同一时间只处理一个消息
channel.BasicQos(0,1,false)
- 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
- 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。
RabbitMQ五:生产者--队列--多消费者
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。