AY C# RabbitMQ 2019 微笔记2

栏目: ASP.NET · 发布时间: 5年前

内容简介:发送消息,生产者  接收消息 消费者   RabbitMQ是Erlang语言开发prefetchCount限制每次发送给消费者的消息个数,等于1,消息者一个一个处理

发送消息,生产者  接收消息 消费者   RabbitMQ是Erlang语言开发

上篇博客

队列 Queue 先进先出

prefetchCount限制每次发送给消费者的消息个数,等于1,消息者一个一个处理

ExInclusive 只能被一个连接使用,连接关闭后,消息删除

auto deleted: 当最后一个使用者取消订阅时,删除  大于一个使用者 的队列

Arguments 可选的; 由插件和特定于代理的功能使用,例如消息TTL,队列长度限制等

Priorities 优先级,如果需要优先级队列,我们建议使用1到10之间。目前使用更多优先级将消耗更多资源(Erlang进程)。

AY C# RabbitMQ 2019 微笔记2

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

交换器,我称呼邮箱 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

AY C# RabbitMQ 2019 微笔记2

生产者  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.");

AY C# RabbitMQ 2019 微笔记2

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

AY C# RabbitMQ 2019 微笔记2

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

AY C# RabbitMQ 2019 微笔记2

如果你失败了,你的兔子 队列的 所在的硬盘空间不够了,至少需要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跟以前不一样了,以前的阻塞方式

测试:

启动生产者

启动消费者

AY C# RabbitMQ 2019 微笔记2

由于设置 AY C# RabbitMQ 2019 微笔记2

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

AY C# RabbitMQ 2019 微笔记2 打开管理手动删除

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

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

AY C# RabbitMQ 2019 微笔记2

生产时候,持久化false。

AY C# RabbitMQ 2019 微笔记2

重启服务

AY C# RabbitMQ 2019 微笔记2

刷新没有了。

AY C# RabbitMQ 2019 微笔记2

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

AY C# RabbitMQ 2019 微笔记2

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

AY C# RabbitMQ 2019 微笔记2

进行消费测试

AY C# RabbitMQ 2019 微笔记2

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

AY C# RabbitMQ 2019 微笔记2

这个消息不是持久化了吗。。我也不太清楚了。  有人说要和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);

直接给我崩溃了

AY C# RabbitMQ 2019 微笔记2

我再改

生产者

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,”的文章


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ajax修炼之道

Ajax修炼之道

(美)哥特兰、高伯瑞斯、艾米亚 / 徐锋,胡冰 / 电子工业出版社 / 2006-4 / 29.8

Ajax将静态Web页面转变为充满交互的应用。现在您不需要牺牲Web应用程序部署的简单性,就可以将“胖”客户端应用程序部署到客户端。不过对于很多人业说,Ajax看起来很难。这就是我们撰写本书的原因。作为实践的指导,本书揭开了Ajax神秘的面纱,教您如何以简单的方式使用Ajax。本书内容覆盖了DHTML、Javascript和闻名已久的XmlHttp Request回调技术的基础知识。您将了解如何将......一起来看看 《Ajax修炼之道》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具