内容简介:发送消息,生产者 接收消息 消费者 RabbitMQ是Erlang语言开发prefetchCount限制每次发送给消费者的消息个数,等于1,消息者一个一个处理
发送消息,生产者 接收消息 消费者 RabbitMQ是Erlang语言开发
队列 Queue 先进先出
prefetchCount限制每次发送给消费者的消息个数,等于1,消息者一个一个处理
ExInclusive 只能被一个连接使用,连接关闭后,消息删除
auto deleted: 当最后一个使用者取消订阅时,删除 大于一个使用者 的队列
Arguments 可选的; 由插件和特定于代理的功能使用,例如消息TTL,队列长度限制等
Priorities 优先级,如果需要优先级队列,我们建议使用1到10之间。目前使用更多优先级将消耗更多资源(Erlang进程)。
一个消息一个 消费者,消费者处理完了,是手动告诉兔子 我处理完了,还是手动告诉兔子,兔子才会把消息删掉。
交换器,我称呼邮箱 Exchange 类似微信的公众号,你关注了Exchange,往这里发消息,订阅公众号的都能收到消息
一个消息 很多消费者,共享这个消息的。
邮箱有类型的,
fanout 广播
model.ExchangeDeclare(ExchangeName, "fanout");
先连接的消费者都会即时收到消息,后来启动的消费者打开是不会收到之前的。 你理解公众号就好理解了。
Direct 完全匹配的路由key,才会被接收
Topic 模糊匹配路由key,*一个单词,#任意数量字符
Head不管了,不怎么用。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
旧的博客,从这篇往后看 : http://www.ayjs.net/post/366.html
现在使用新的类库的新的写法去实现基本例子,官方是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队列不在了,已经被删除。
==================
总结,一个队列消费完了,不删除,也不能使用了,感觉就像一个记录存在那。
所以真实场景,删除好点。
上面例子 为了简洁起见,在很大程度上省略了诸如连接管理,错误处理,连接恢复,并发和度量收集之类的事。 这种简化的代码不应被视为生产就绪。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
推荐您阅读更多有关于“RabbitMQ,”的文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【每日笔记】【Go学习笔记】2019-01-04 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-02 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-07 Codis笔记
- vue笔记3,计算笔记
- Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记
- 【每日笔记】【Go学习笔记】2019-01-16 go网络编程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Real-Time Collision Detection
Christer Ericson / CRC Press / 2004-12-22 / USD 98.95
Written by an expert in the game industry, Christer Ericson's new book is a comprehensive guide to the components of efficient real-time collision detection systems. The book provides the tools and kn......一起来看看 《Real-Time Collision Detection》 这本书的介绍吧!