一个消息一个 消费者,消费者处理完了,是手动告诉兔子 我处理完了,还是手动告诉兔子,兔子才会把消息删掉。
交换器,我称呼邮箱 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
生产者 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[] 类型,如果是类,找个二进制序列化
有个hello队列了,这种处理 1个消息只能一个消费者
如果你失败了,你的兔子 队列的 所在的硬盘空间不够了,至少需要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跟以前不一样了,以前的阻塞方式
测试:
启动生产者
启动消费者
由于设置
所以消费完没有删除,生产消息,也是没有自动删除
打开管理手动删除
=========================加深一些属性的印象====================
重新运行生产端,查看记录
生产时候,持久化false。
重启服务
刷新没有了。
把durable改为true,然后重新生产,
ready是1 总数是1,然后重启兔子服务,刷新web管理,ready是0了,虽然持久化,但是我感觉不能消费了。
进行消费测试
果然没有消息,但是消息下面此刻有个消费者了。
这个消息不是持久化了吗。。我也不太清楚了。 有人说要和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);
直接给我崩溃了
我再改
生产者
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队列不在了,已经被删除。
==================
总结,一个队列消费完了,不删除,也不能使用了,感觉就像一个记录存在那。
所以真实场景,删除好点。