198366809 发表于 2021-5-30 10:03:00

C# 消息队列之RabbitMQ

Message Queue消息队列,简称MQC#项目要利用RabbitMQ来获取实时数据的话,需要①安装RabbitMQ服务、②下载Erlang环境并安装、③引入RabbitMQ.client.dll动态库准备工作首先,我们访问官网【https://www.rabbitmq.com/】,点击Get Started。然后,网站会自动跳转到当前首页Get Started的锚点位置,如下图:https://p6.toutiaoimg.com/img/pgc-image/84c2460692ea4de5bdf6006e72ec9688~tplv-tt-shrink:640:0.image

Get Started锚点:https://p6.toutiaoimg.com/img/pgc-image/53034726f3744dc5a91c6119b26b2ee5~tplv-tt-shrink:640:0.image

然后我们点击DownLoad+Installation,进入到下载界面。在下载页面中,我们找到安装指南,然后在点击官网推荐的Windows系统的安装包,如下图:https://p26.toutiaoimg.com/img/pgc-image/1c2736490d8c44ceb84dcca58abe13f8~tplv-tt-shrink:640:0.image

现在,我们进入了Windows安装指南界面了。首先,我们看一下预览信息,如下图:https://p9.toutiaoimg.com/img/pgc-image/51ec6146cc08483d856fd90a8ee3dcfa~tplv-tt-shrink:640:0.image

在预览里,我们得知,安装RabbitMQ有两种方法,一种是使用Chocolatey安装,一种是使用官方安装包安装。Chocolatey是什么呢?随手百度一下,原来他是一个软件包管理工具,也就是说,Chocolatey是类似于Nuget的一种工具。由于Chocolatey的使用,我不是很熟悉,所以,这里选择使用官方安装包安装。点击【Using the official installer】,我们进入了【Using the official installer】对应的锚点,如下图。https://p3.toutiaoimg.com/img/pgc-image/d477d1122de34cb79d44cb29f30207fe~tplv-tt-shrink:640:0.image

在【Using the official installer】段落里找到有推荐标志的安装包,然后下载。下载完成后,我们可以得到这样一个安装包,如下图:https://p5.toutiaoimg.com/img/pgc-image/df107df3ae774044b9fe0dc66c3bbee3~tplv-tt-shrink:640:0.image

除了下载安装包,我们还会发现,在【Using the official installer】段落里,有提醒我们,RabbitMQ是有依赖的,依赖一个Erlang语言的框架(类似于C#语言的NetFramework)。我们可以发现,在依赖的段落里,官网非常坑的给出了三个链接网址,如下:supported version of Erlang:https://www.rabbitmq.com/which-erlang.htmlWindows installer:https://www.erlang.org/downloadsErlang Solutions:https://www.erlang-solutions.com/resources/download.html因为,我们是无法通过文字描述来判断,哪一个是真的依赖框架的下载地址,所以只好每个都点击进去看看。。。打开网址后发现,在后两个网址中都可以找到框架下载地址,但第二个地址明显更友好一点,所以我们在第二个网址内下载Erlang的框架。https://p6.toutiaoimg.com/img/pgc-image/382a88655efe452c8cf32236e3976461~tplv-tt-shrink:640:0.image

下载完成得到如下图文件:https://p6.toutiaoimg.com/img/pgc-image/a587f3464d104bc5950338dbcabf0681~tplv-tt-shrink:640:0.image

PS:这里下载的是OTP的22.1的版本,我的理解是Erlang等于C#语言,而OTP等于NetFramework。安装Erlang\OTP首先,我们运行otp_win64_22.1.exe,安装依赖框架Erlang\OTP。安装完成后,设置环境变量如下:https://p5.toutiaoimg.com/img/pgc-image/ac8a7f3fe8e64836ab705427413243aa~tplv-tt-shrink:640:0.image

然后运行CMD,输入erl,测试安装是否成功,如下图:https://p6.toutiaoimg.com/img/pgc-image/f705e099d4884a249abb6adb1c4a4245~tplv-tt-shrink:640:0.image

安装成功。安装rabbitmq-server安装完依赖后,我们接着安装rabbitmq-server-3.8.0.exe。【rabbitmq-server-3.8.0.exe】?从这个文件名上,我们发现了一个问题,那就是,我们即将安装的RabbitMQ,是一个服务端啊。什么?服务端?难道还有客户端???其实这也很好理解,想一下最开始我举的那个例子,消息队列是需要一个监听端口的服务端的,然后客户端向这个服务端发送请求。这样是不是就很好的理解RabbitMQ了呢:)----------------------------------------------------------------------------------------------------安装完RabbitMQ服务端后,我们还是启动CMD,用命令行来查看下安装状态。首先输入下面的命令,将路径定位到RabbitMQ的路径下:【CD /D C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.0\sbin】https://p9.toutiaoimg.com/img/pgc-image/1d722592911847d598ad7e7ec9b6c14d~tplv-tt-shrink:640:0.image

然后输入rabbitmqctl status查看状态。https://p6.toutiaoimg.com/img/pgc-image/8b03620023ef445c850ce0e4aace9556~tplv-tt-shrink:640:0.image

启动管理工具的命令行:rabbitmq-plugins enable rabbitmq_management。https://p6.toutiaoimg.com/img/pgc-image/65e420b931324e81833ec5b28a076375~tplv-tt-shrink:640:0.image

启动成功后,在浏览器输入地址http://127.0.0.1:15672/,进入管理页面,账户密码都是guest。https://p6.toutiaoimg.com/img/pgc-image/90c9e0f638e04d8fafe8c56c962d2af5~tplv-tt-shrink:640:0.image

C#里使用RabbitMQ开源类库非常简单,可以去官网下载一个.NET版本的RabbitMQ客户端类库,也可以直接在Nuget上搜索RabbitMQ,然后安装,如下图:https://p5.toutiaoimg.com/img/pgc-image/c74b3a9f759a447f8cd5141496db84c4~tplv-tt-shrink:640:0.image

https://p9.toutiaoimg.com/img/pgc-image/ad2c14fc5ec84515a553ef001f825b26~tplv-tt-shrink:640:0.image

到此,RabbitMQ服务端的环境配置好了,正常情况,这些配置应该在服务器进行,但我为了测试方便,就把服务端也安装在本机了,因此我下面调用RabbitMQ时,连接的主机IP都是localhost。实例代码:using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ConsoleApp7{    class Program    {      private static ManualResetEvent resetEvent = new ManualResetEvent(false);      [Obsolete]      static void Main(string[] args)      {            //生产者            ConnectionFactory factory = new ConnectionFactory();            factory.HostName = "127.0.0.1";            //默认端口            factory.Port = 5672;            using (IConnection conn = factory.CreateConnection())            {                using (IModel channel = conn.CreateModel())                {                  //在MQ上定义一个持久化队列,如果名称相同不会重复创建                  channel.QueueDeclare("MyRabbitMQ", true, false, false, null);                  Task.Run(() =>                        {                            while (true)                            {                              string message = string.Format("{0}", Console.ReadLine());//Console.ReadLine()为控制台输入的内容,我们可以用其他方式获取                              byte[] buffer = Encoding.UTF8.GetBytes(message);                              IBasicProperties properties = channel.CreateBasicProperties();                              properties.DeliveryMode = 2;                              channel.BasicPublish("", "MyRabbitMQ", properties, buffer);//入队                              Console.WriteLine("入队成功:" + message);                              resetEvent.Set();                            }                        });                  while (resetEvent.WaitOne(60 * 1000))                  {                        //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息                        channel.BasicQos(0, 1, false);                        Console.WriteLine("Listening...");                        //在队列上定义一个消费者                        QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);                        //消费队列,并设置应答模式为程序主动应答运行后在控制台输入字符串,之后就会有接收的字符串出来,,一般入队代码和出队代码是写在两个控制台,分别放两个主机上执行的,为了方便测试我放在了一起 !

mini0427 发表于 2021-5-30 10:03:00

感谢分享,佩服佩服!

JasonCao 发表于 2021-5-30 10:49:38

加油,加油,不要沉下去,我是最热贴

陈先生 发表于 2025-11-14 07:46:06

路过混个脸熟,顺便为优质内容打 call~

哎呦橘子酸 发表于 2025-11-14 08:08:35

来凑个热闹,为楼主增加点人气!

jzc2006jzc 发表于 2025-11-14 08:11:36

这波反向操作,我属实没想到!

fgacnn1314 发表于 2025-11-14 08:11:49

楼主辛苦啦,期待下一篇分享

syyx0314 发表于 2025-11-14 08:22:00

内容太顶了!疯狂点赞,已默默收藏~

1613221316 发表于 2025-11-14 08:24:58

救命!这回复笑到我捶桌,必须置顶~

15271942775 发表于 2025-11-14 08:29:35

楼主辛苦啦,期待下一篇分享!
页: [1] 2
查看完整版本: C# 消息队列之RabbitMQ