当前位置:网站首页 / C#开发 / 正文

AY C# RabbitMQ 2019 微笔记2

时间:2018年12月04日 | 作者 : aaronyang | 分类 : C#开发 | 浏览: 2037次 | 评论 0

发送消息,生产者  接收消息 消费者   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

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

image.png

查看下,发送的消息只能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

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

image.png打开管理手动删除

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

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

image.png

生产时候,持久化false。

image.png

重启服务

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队列不在了,已经被删除。


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

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

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




上面例子 为了简洁起见,在很大程度上省略了诸如连接管理,错误处理,连接恢复,并发和度量收集之类的事。 这种简化的代码不应被视为生产就绪。




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




推荐您阅读更多有关于“RabbitMQ,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音:wpfui 工作wpf,兴趣学习flutter

目前在合肥市某公司上班,已经厌弃,如果你的公司看的上我,加我QQ私聊

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表