NetCore RabbitMQ高级特性 持久化 及 消息优先级
十年河东,十年河西,莫欺少年穷
学无止境,精益求精
上一节介绍了RabbitMQ定向模式,本篇介绍Rabbitmq 的消息确认机制
我的系列博客:
NetCore RabbitMQ 简介及兔子生产者、消费者 【简单模式,work工作模式,竞争消费】
kafka、Rabbitmq、EasyNetQ NetCore 源码下载
先从一个方法说起,如下:
QueueDeclareOk QueueDeclare(string queue, bool durable, bool exclusive, bool autoDelete, IDictionary<string, object> arguments);
queue 队列名称
durable 是否持久化队列
exclusive 是否为单消费者队列,为True时,只能由单一消费者消费
autoDelete 是否自动删除队列,当消费者全部断开时,队列自动删除
arguments 其他属性,例如消息的声明周期,队列的存活时间等,如下:
x-expires | 队列的存活时间 | Number[毫秒] |
x-message-ttl | 消息的存活时间 | Number[毫秒] |
x-single-active-consumer | 表示队列是否是单一消费者 | Bool |
x-max-length | 队列可容纳的消息的最大条数 | Number【字节】 |
x-max-length-bytes | 队列可容纳的消息的最大字节数 | Number |
x-max-priority | 队列的优先级 | Number |
x-overflow | 队列中的消息溢出时,如何处理这些消息.要么丢弃队列头部的消息,要么拒绝接收后面生产者发送过来的所有消息. | String |
x-dead-letter-exchange | 溢出的消息需要发送到绑定该死信交换机的队列 | String |
x-dead-letter-routing-key | 溢出的消息需要发送到绑定该死信交换机,并且路由键匹配的队列 | String |
x-queue-mode | 默认懒人模式 lazy | String |
x-queue-version | 版本 | Number |
x-queue-master-locator | 集群相关设置,Master接点 | String |
持久化
持久化包括交换机的持久化、队列的持久化,消息的持久化
创建交换机时,声明交换机的持久化:
//durable 是否持久化 //void ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete, IDictionary<string, object> arguments); channel.ExchangeDeclare(Ename, ExchangeType.Direct, true, false, null);
创建队列时,声明队列的持久化
//durable 是否持久化 //arguments 队列的其他参数 诸如优先级 过期时间等 //QueueDeclareOk QueueDeclare(string queue, bool durable, bool exclusive, bool autoDelete, IDictionary<string, object> arguments); channel.QueueDeclare(QnameName, true, false, false, arguments);
消息的持久化,发生消息之前,声明消息持久化
var messages = "MyHello,RabbitMQ"; // var properties = channel.CreateBasicProperties(); properties.Priority = 9;//消息的优先级 值越大 优先级越高 0~9 properties.ContentType = "text/plain";//消息的内输出格式 properties.Persistent = true; //开启消息持久化 channel.BasicPublish(Ename, routingKey, properties, Encoding.UTF8.GetBytes(messages + "_" + i)); //发送消息
优先级
队列的优先级
Dictionary<string, object> arguments = new Dictionary<string, object>(); ////队列优先级最高为10,不加x-max-priority的话,计算发布时设置了消息的优先级也不会生效 arguments.Add("x-max-priority", 10); channel.QueueDeclare(QnameName, true, false, false, arguments);
注意,如果队列没有设置优先级,不加x-max-priority的话,计算发布时设置了消息的优先级也不会生效、、
消息的优先级
var properties = channel.CreateBasicProperties(); properties.Priority = 9;//消息的优先级 值越大 优先级越高 0~9
最后,以一个实例来结束本篇博客:

using RabbitMQ.Client; using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace RabbitMqProducer { class Program { static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory(); factory.HostName = "127.0.0.1"; //主机名 factory.UserName = "guest";//使用的用户 factory.Password = "guest";//用户密码 factory.Port = 5672;//端口号 factory.VirtualHost = "/"; //虚拟主机 factory.MaxMessageSize = 1024; //消息最大字节数 using (var connection = factory.CreateConnection()) { //rabbitMQ 基于信道进行通信,因此,我们需要实例化信道Channel using (var channel = connection.CreateModel()) { string Ename = "MyExChange"; //durable 是否持久化 //void ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete, IDictionary<string, object> arguments); channel.ExchangeDeclare(Ename, ExchangeType.Direct, true, false, null); //声明广播的队列 string QnameName = "MyQueue"; Dictionary<string, object> arguments = new Dictionary<string, object>(); ////队列优先级最高为10,不加x-max-priority的话,计算发布时设置了消息的优先级也不会生效 arguments.Add("x-max-priority", 10); channel.QueueDeclare(QnameName, true, false, false, arguments); string routingKey = "MyroutingKey"; // // channel.QueueBind(QnameName, Ename, routingKey); var messages = "MyHello,RabbitMQ"; // var properties = channel.CreateBasicProperties(); properties.Priority = 9;//消息的优先级 值越大 优先级越高 0~9 properties.ContentType = "text/plain";//消息的内输出格式 properties.Persistent = true; //开启消息持久化 channel.BasicPublish(Ename, routingKey, properties, Encoding.UTF8.GetBytes(messages)); //发送消息 } } Console.Read(); } } }
@陈大六的博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2017-07-25 C# 异步上传图片案例