RabbitMQ四:生产者--队列--消费者
2017-08-04 18:01 小白admin 阅读(1311) 评论(2) 编辑 收藏 举报AMQP协议的梳理和名词解析
建议先把上篇AMQP协议先看一遍,理解一下,由于用XMind绘图,电脑屏幕比较小,不能截取全部,如果想要全图和源代码,请下面留言.......
可以点击图片,打开到新的页面查看,文字会清晰一点。。。。。
实例一:生产者-队列-消费者
P(Producer):生产者,意味着发送;
Queue:队列,本质上是一个无限的缓冲区,可以储存尽可能多的信息;
C(Consumer):消费者,等待并接收消息。
代码
简述:三部分,创建连接对象的公共帮助类库,一个发布者,一个消费者
MQConnnection代码单独封装一个类库:::
public class HelpConnection { private static IConnection Connection; public static IConnection GetConnection() { if (Connection == null) { //创建连接工厂 var factory = new ConnectionFactory() { //计算机名称,账号,密码, HostName = "localhost", UserName = "zhangguangpo", Password = "guangpo1992", RequestedHeartbeat = 60, AutomaticRecoveryEnabled = true //要启用自动连接恢复 }; //创建连接 Connection = factory.CreateConnection(); return Connection; } return Connection; } }
发布者:::
/// <summary> /// 案例一::: 生产者--队列--消费者 /// </summary> /// <param name="args"></param> static void Main(string[] args) { //创建一个渠道,会话 using (var channel = HelpConnection.GetConnection().CreateModel()) { //参数:队列名称,是否持久,是否独家,自动删除,参数 //QueueDeclare(string queue,durable true,exclusive false,autoDelete false, IDictionary<string, object> arguments); //声明一个队列 channel.QueueDeclare("hello", true, false, false, null); string message = "Hello World 1"; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish("", "hello", null, body); Console.WriteLine("发布成功!!!"); Console.ReadKey(); } }
消费者:::
(1)获取个人消息(“拉API”) 要检索单个消息,请使用IModel.BasicGet。
static void Main(string[] args) { using (var channel = HelpConnection.GetConnection().CreateModel()) { //参数:队列名称,是否持久,是否独家,自动删除,参数 //QueueDeclare(string queue,durable true,exclusive false,autoDelete false, IDictionary<string, object> arguments); //在消费者的类里面为什么会再次声明队列(channel.QueueDeclare())呢?-- 因为接收方可能会在发送方启动前启动,这是出于保险起见。 channel.QueueDeclare("hello", true, false, false, null); #region 获取个人消息(“拉API”) //要检索单个消息,请使用IModel.BasicGet。返回的值是BasicGetResult的实例,可以从中提取头信息(属性)和消息体: //noAck 可理解 是个消息标记,True:消息读取自动排除,下次不会读取到;false 消息没有排除,一直存在, var result = channel.BasicGet("hello", True); if (result == null) { Console.WriteLine("暂时没有消息"); } else { var msg = Encoding.UTF8.GetString(result.Body); Console.WriteLine(msg); } //确认收到消息 // channel.BasicAck(result.DeliveryTag, false); #endregion Console.ReadKey(); } }
(2)通过订阅检索邮件(“推送API”)
static void Main(string[] args) { using (var channel = HelpConnection.GetConnection().CreateModel()) { #region 通过订阅检索邮件(“推送API”) //创建基于该队列的消费者,绑定事件 //我们即将告诉服务器将队列中的消息传递给我们。由于它将异步地推送我们的邮件,所以我们提供一个回调。 //那就是EventingBasicConsumer.Received事件处理程序。 var consumer = new EventingBasicConsumer(channel); string msg = ""; consumer.Received += (model, e) => { var body = e.Body; //消息主体 msg = Encoding.UTF8.GetString(e.Body); Console.WriteLine("显示消息:" + msg); }; //启动消费者 必须调用 IModel.BasicAck来确认您已成功接收并处理该消息: channel.BasicConsume(queue: "hello", //队列名 noAck: true, //false:手动应答;true:自动应答 consumer: consumer); #endregion Console.ReadKey(); } }
显示效果:一样一样的
- 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
- 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。