.Net下RabbitMQ消息队列 优先级ID设置

来源:互联网 发布:医疗数据公司 编辑:程序博客网 时间:2024/06/06 23:16

写在前面


RabbitMQ 3.5.0 及以上版本优先级队列插件已经集成到broker中,不需要自行下载安装。


开始


VS2013新建一个C#控制台项目,添加引用,添加引用RabbitMQ.Client.dll
新建一个类MyRabbitMq,具体代码如下

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO;using System.Threading;using RabbitMQ.Client;using System.Collections;namespace RabbitmqClient{    /// <summary>    /// P2P模式,即一个生产者一个消费者    /// </summary>    ///     public enum MessegePriority : byte    {         Low = 0,        Normal = 5,        High = 9     }    public class MyRabbitMq    {        private readonly ConnectionFactory rabbitMqFactory;        const string ExchangeName = "test.exchange";        const string QueueName = "my.queue";        /// <summary>        /// Declare priority queues using the x-max-priority argument        /// </summary>        internal static IDictionary<string, object> QueueArguments        {            get            {                IDictionary<string, object> arguments = new Dictionary<string, object>();                arguments["x-max-priority"] = 10;//定义队列优先级为10个级别                return arguments;            }        }        /// <summary>        /// 构造函数        /// </summary>        /// <param name="isLocal">队列是否在本机</param>        /// <param name="remoteAddress">不在本机,提供远程地址</param>        public MyRabbitMq(bool isLocal = true, string remoteAddress = "localhost")        {            if (isLocal)                rabbitMqFactory = new ConnectionFactory { HostName = "localhost" };            else                 rabbitMqFactory = new ConnectionFactory { HostName = remoteAddress };        }        /// <summary>        /// 队列初始化        /// </summary>        public void Register_durable_Exchange_and_Queue()        {            using (IConnection conn = rabbitMqFactory.CreateConnection())            using (IModel channel = conn.CreateModel())            {                channel.ExchangeDeclare(exchange: ExchangeName, type: "direct", durable: true, autoDelete: false, arguments: null);                //QueueArguments就是上面为优先级定义的这个dictionary                channel.QueueDeclare(queue: QueueName, durable: true, exclusive: false, autoDelete: false, arguments: QueueArguments);                channel.QueueBind(queue: QueueName, exchange: ExchangeName, routingKey: QueueName);            }        }        /// <summary>        /// 生产者,插入消息        /// </summary>        /// <param name="message">消息</param>        /// <param name="persistent">是否持久化</param>        /// <param name="priority">优先级</param>        /// <param name="msgId">消息ID</param>        public void SendMessage(string message, bool persistent = true, MessegePriority priority = MessegePriority.Normal, string msgId = "myid")        {            using (IConnection conn = rabbitMqFactory.CreateConnection())            using (IModel channel = conn.CreateModel())            {                var props = channel.CreateBasicProperties();                if (persistent)                {                    props.Persistent = true;  //持久化                 }                props.Priority = (byte)priority; //优先级                props.MessageId = msgId;  //消息ID                var msgBody = Encoding.UTF8.GetBytes(message);                channel.BasicPublish(exchange: ExchangeName, routingKey: QueueName, basicProperties: props, body: msgBody);                Console.WriteLine(" [x] Sent {0}", message);            }        }        /// <summary>        /// 消费者,取出消息        /// </summary>        /// <returns></returns>        public string GetMessage()        {            using (IConnection conn = rabbitMqFactory.CreateConnection())            using (IModel channel = conn.CreateModel())            {                BasicGetResult msgResponse = channel.BasicGet(queue: QueueName, noAck: true);                string msgBody = Encoding.UTF8.GetString(msgResponse.Body);                return msgBody;            }        }        /// <summary>        /// 一次都消费光,清空队列,没有消息会阻塞等        /// </summary>        /// <returns></returns>        public string Consume_messages_from_Queue_Subscription()        {            using (IConnection conn = rabbitMqFactory.CreateConnection())            using (IModel channel = conn.CreateModel())            {                var consumer = new QueueingBasicConsumer(channel);                channel.BasicConsume(QueueName, noAck: true, consumer: consumer);                var msgResponse = consumer.Queue.Dequeue(); //blocking                var msgBody = Encoding.UTF8.GetString(msgResponse.Body);                return msgBody;            }        }        public void Publish_5_messages_to_test_exchange()        {            using (IConnection conn = rabbitMqFactory.CreateConnection())            using (IModel channel = conn.CreateModel())            {                for (var i = 0; i < 5; i++)                {                    var props = channel.CreateBasicProperties();                    //props.SetPersistent(true);                    props.Persistent = true;                    string msg = "Hello, World!" + i;                    var msgBody = Encoding.UTF8.GetBytes(msg);                    channel.BasicPublish(ExchangeName, routingKey: QueueName, basicProperties: props, body: msgBody);                }            }        }    }}


using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace RabbitmqClient{    class Program    {        static void Main(string[] args)        {     //第二次测试             MyRabbitMq mymq = new MyRabbitMq(isLocal: true, remoteAddress: "");         mymq.Register_durable_Exchange_and_Queue();         mymq.SendMessage(message: "low", persistent:true, priority: MessegePriority.Low, msgId:"lowid");         mymq.SendMessage(message: "normal", persistent: true, priority: MessegePriority.Normal, msgId: "normal");         mymq.SendMessage(message: "high", persistent: true, priority: MessegePriority.High, msgId: "high");         Console.WriteLine(mymq.GetMessage());         Console.WriteLine(mymq.GetMessage());         Console.WriteLine(mymq.GetMessage());        }    }}


测试

第一次测试
访问http://localhost:15672/#/,用户名:guest,密码guest,登录后台管理终端,选“Queues” - “Get messages” 




第二次测试




遇到的问题

 inequivalent arg 'x-max-priority' for queue 'queue' in vhost '/': received the value '10' of type 'signedint' but current is none, class-id=50, method-id=10)

原因:已经有个同名的queue,两个queue的属性不一致(例如headers)。
解决办法:删除原来队列,或者修改队列名。

参考

http://www.rabbitmq.com/community-plugins.html
http://www.rabbitmq.com/priority.html
http://www.cnblogs.com/aarond/p/rabbitmq.html
https://github.com/squaremo/amqp.node/issues/165
1 0
原创粉丝点击