AY C# RabbitMQ 2019 微笔记 (2)

AY C# RabbitMQ 2019 微笔记

一个消息一个 消费者,消费者处理完了,是手动告诉兔子 我处理完了,还是手动告诉兔子,兔子才会把消息删掉。



交换器,我称呼邮箱 Exchange 类似微信的公众号,你关注了Exchange,往这里发消息,订阅公众号的都能收到消息

一个消息  很多消费者,共享这个消息的。

邮箱有类型的,

 fanout 广播

model.ExchangeDeclare(ExchangeName, "fanout");

先连接的消费者都会即时收到消息,后来启动的消费者打开是不会收到之前的。 你理解公众号就好理解了。


Direct 完全匹配的路由key,才会被接收

Topic 模糊匹配路由key,*一个单词,#任意数量字符

Head不管了,不怎么用。



====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

旧的博客,从这篇往后看 :


现在使用新的类库的新的写法去实现基本例子,官方是Core或者.NET Framework 4.5.1+

建立2个控制台,分别 引用 rabbitmq.client

使用稳定版5.1

image.png

生产者  MQ.Product1

测试 AyTestMQ


DEMO1  Hello Word   以前旧文章

发送方:

var factory = new ConnectionFactory() { HostName = "localhost",UserName="ay",Password="123456",Port=5672 }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); string message = "Hello World!"; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body); Console.WriteLine(" [x] Sent {0}", message); } Console.WriteLine(" Press [enter] to exit.");

查看下,发送的消息只能byte[] 类型,如果是类,找个二进制序列化

image.png

有个hello队列了,这种处理 1个消息只能一个消费者

image.png

如果你失败了,你的兔子 队列的 所在的硬盘空间不够了,至少需要50M 的硬盘空间


接收方 最新版本换成事件方式了

需要引入

using RabbitMQ.Client;

using RabbitMQ.Client.Events;

这2个空间了


在AyTestMQ项目里面 写法

using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AyTestMQ { class Program { static void Main(string[] args) { var factory = new ConnectionFactory() { HostName = "localhost", UserName = "ay", Password = "123456", Port = 5672 }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }; channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } Console.ReadKey(); } } }

这里Received跟以前不一样了,以前的阻塞方式


测试:

 启动生产者

启动消费者

由于设置

image.png

所以消费完没有删除,生产消息,也是没有自动删除

打开管理手动删除

=========================加深一些属性的印象====================

重新运行生产端,查看记录

image.png

生产时候,持久化false。

重启服务

image.png

刷新没有了。

image.png

把durable改为true,然后重新生产,

image.png

ready是1  总数是1,然后重启兔子服务,刷新web管理,ready是0了,虽然持久化,但是我感觉不能消费了。

image.png

进行消费测试

image.png

果然没有消息,但是消息下面此刻有个消费者了。

image.png

这个消息不是持久化了吗。。我也不太清楚了。  有人说要和exchange挂钩,好了。

特殊测试,一个消息只会被正确处理一次,即使web管理上存在,也是读取不了处理。


===================================

测试自动删除,手动把队列删了

生产者

 channel.QueueDeclare(queue: "hello",

                                     durable: true,

                                     exclusive: false,

                                     autoDelete: false,

                                     arguments: null);

消费者

channel.QueueDeclare(queue: "hello",

                                     durable: true,

                                     exclusive: false,

                                     autoDelete: true,

                                     arguments: null);

直接给我崩溃了

image.png



我再改

生产者

 channel.QueueDeclare(queue: "hello",

                                     durable: true,

                                     exclusive: false,

                                     autoDelete: true,

                                     arguments: null);


消费者

 channel.QueueDeclare(queue: "hello",

                                     durable: true,

                                     exclusive: false,

                                     autoDelete: true,

                                     arguments: null);

貌似两个改的一样了。哦,我明白了,两个要一致,感觉约定一样。

消费者可以拿到数据了。不关闭控制台,还没执行到using后面那段

打开web管理

queue队列还在,ready已经是0了,

关闭控制台,执行完,释放 连接

刷新web管理

queue队列不在了,已经被删除。


==================

总结,一个队列消费完了,不删除,也不能使用了,感觉就像一个记录存在那。

所以真实场景,删除好点。




内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygdwx.html