上篇文章,咱们作了一个简单的Demo,一个生产者对应一个消费者,本篇文章就介绍 生产者-队列-多个消费者,下面简单示意图测试
需求背景:工厂某部门须要生产n个零件,部门下面有2个小组,每一个小组须要生产n/2个spa
每一个小组的状况下,当全部奇怪的信息都很重,甚至信息很轻的时候,一个工做人员将不断忙碌,另外一个工做人员几乎不会作任何工做。那么,RabbitMQ不知道什么,还会平均分配消息。code
这是由于当消息进入队列时,RabbitMQ只会分派消息。它不看消费者的未确认消息的数量。它只是盲目地向第n个消费者发送每一个第n个消息。blog
下面就由咱们撸代码实现,这一需求::::队列
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条路由
/// <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(); } }
效果图(特地创建好几个项目,同事启动进行测试)文档
本章总结注意几点:::博客
一、即便RabbitMQ从新启动,task_queue队列也不会丢失。如今咱们须要将咱们的消息标记为持久性 - 将IBasicProperties.SetPersistent设置为true。string
var properties = channel.CreateBasicProperties();it
properties.Persistent = true;
二、公平分发同一时间只处理一个消息
channel.BasicQos(0,1,false)