.netcore3.1 RabbitMq 讲讲相关方法 电脑版发表于:2021/1/29 15:05 ![](https://img.tnblog.net/arcimg/hb/585b0f1ffa7f4c2095baa20c175b32a0.png) >#.netcore3.1 RabbitMq 讲讲相关方法 [TOC] QueueDeclare方法 ------------ tn>这是一个创建队列的方法,参数以及参数描述由下图所示: | 参数名 | 参数描述 | | ------------ | ------------ | | durable | 持久化操作。【mnesiz:数据库中会有专门的表去保存我们的队列申明】 | | exclusive | 排外。当前定义的队列是`connection`共享的,其他的`connection`是访问不到的... | | autoDelete | 自动删除 | | passive | 消极 | | arguments | 传入一些相关参数 | >### durable持久化 tn>我们先来创建一个非持久化队列来进行一个演示 ```csharp channel.QueueDeclare("NoDurable", false, false, false, null); ``` ![](https://img.tnblog.net/arcimg/hb/f2984024f6854f959763b2abc1840bea.png) tn>之后我们进行重启`rabbitmq`,然后我们就发现队列已经被删除了 ![](https://img.tnblog.net/arcimg/hb/446c1a218d9f441c8aa8fc789a5df4f7.png) ![](https://img.tnblog.net/arcimg/hb/5e6afd7c23f84c8ba9f70a8f9328f8a5.png) >### exclusive 排外 tn>一般`connection`是高成本的,因为`TCP`需要经过三次握手才可以连接得上,而在一个`connection`中是可以创建无数多个`channel`的。而`exclusive`为`true`也是随着`connection`的释放而释放,并且其他`connection`是不可以访问这个队列的。举个例子: ```csharp var factory = new ConnectionFactory() { HostName = "47.98.187.188", UserName = "bob", Password = "bob" }; // 创建一个链接 using (var connection = factory.CreateConnection()) { // 创建一个通道 using (var channel = connection.CreateModel()) { // 创建持久化队列 channel.QueueDeclare("NoExclusive", false, true, false, null); // 这里我们先看完UI后再回车,让连接失效 Console.ReadLine(); } } ``` ![](https://img.tnblog.net/arcimg/hb/40f9033a488042f3ae1d17001614c553.png) tn>然后回车 ![](https://img.tnblog.net/arcimg/hb/30ec2f1fc9ac4d9f910f1a0f3f479d9b.png) >### autoDelete 自动删除 ```csharp channel.QueueDeclare("AutoDelete", false, false, true, null); ``` ![](https://img.tnblog.net/arcimg/hb/0f9a4f9dcd8c4bb6a99fd44fe3c8f989.png) tn>接着我们用一个消费端去消费该队列,并迅速的将消费端关闭,代码与UI过程如下: ```csharp var factory = new ConnectionFactory() { HostName = "47.98.187.188", UserName = "bob", Password = "bob" }; // 创建一个链接 using (var connection = factory.CreateConnection()) { // 创建一个通道 using (var channel = connection.CreateModel()) { var consumer = new EventingBasicConsumer(channel); // 事件在交付到使用者时触发。(消费处理事件) consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); Thread.Sleep(1000); channel.BasicAck(ea.DeliveryTag, multiple: false); }; // 绑定到队列中去 channel.BasicConsume(queue: "AutoDelete", autoAck: false, consumer: consumer); Console.ReadLine(); } } // 消费端结束 ``` ![](https://img.tnblog.net/arcimg/hb/f788cb6db48e46bea163e7af417c1c0c.png) ![](https://img.tnblog.net/arcimg/hb/9274537688ac4ebfb3650656fc1de4d0.png) QueueDeclarePassive方法 ------------ tn>检测队列是否存在。如果不存在就报错,就拿刚刚的`AutoDelete`来举个例子。 ```csharp channel.QueueDeclarePassive("AutoDelete"); ``` ![](https://img.tnblog.net/arcimg/hb/ac4d6bb7b9954e3c9d01b8dc8549f651.png) QueueDeclareNoWait方法 ------------ tn>与`QueueDeclare`方法是差不多的,区别在于一个同步获取创建的结果,一个异步不返回结果,从底层源代码来说,这个方法所执行的步骤比`QueueDeclare`少 ![](https://img.tnblog.net/arcimg/hb/a534d8ee69c24fbe9f4894e20f97b1c7.png) ![](https://img.tnblog.net/arcimg/hb/75c81b95bb37461b871e69fbd1d518aa.png) tn>最后有一些`Exchange`与`Queue`的一些方法的意思类似,只不过一个是交换机,一个是队列的区别。