.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
- .Net下RabbitMQ消息队列 优先级ID设置
- .Net下RabbitMQ消息队列的使用
- rabbitmq结合spring实现消息队列优先级
- .net下的RabbitMQ和MSMQ消息队列
- C#.NET使用消息队列RabbitMQ
- RabbitMQ之队列优先级
- centos下安装RabbitMQ消息队列
- php RabbitMQ消息队列
- RabbitMQ消息队列
- RabbitMQ(消息队列)
- 消息队列-rabbitMQ
- amq消息队列-rabbitMQ
- RabbitMQ消息队列一
- RabbitMQ消息队列介绍
- 【消息队列技术】RabbitMQ
- RabbitMQ消息队列
- 浅析消息队列 RabbitMQ
- RabbitMQ消息队列
- Java--JavaWeb使用commons-dbutils简化数据库操作
- Leercode 35 Search Insert Position
- 从一个链表channelHead中删除和channelToDeleteHead中相同的元素
- ScrollView判断滑动到底部和顶部
- source insight 中文注释为乱码解决
- .Net下RabbitMQ消息队列 优先级ID设置
- CocoaPods安装和使用教程
- mv删除包含隐藏文件的所有文件
- C++中substr、find、refind函数的用法
- TCP/IP详解,卷1:协议,第八章:Traceroute程序
- Centos 7 安装VNC步骤
- 欢迎使用CSDN-markdown编辑器
- linux中的权限控制
- css3 写checkbox 标签单选框和实现类似于多选框的样式改写