.NET6使用RabbitMQ
什么是RabbitMQ
RabbitMQ(Rabbit Message Queue)是一个开源的,基于AMQP(Advanced Message Queuing Protocol)协议的完整的可复用的企业级消息队,RabbitMQ可以实现点对点,发布订阅等消息处理模式。
环境和版本
系统:Window10
Erlang:24.2.1(下载地址:https://www.erlang.org/downloads)
RabbitMQ:3.9.13(下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.13/rabbitmq-server-3.9.13.exe)
项目框架:.NET 6
一、安装Erlang
1、 访问Erlang官网,因此示例使用的是Windows环境,所以下载Windows 64-bit版本
2、双击安装Erlang
3、选择安装路径,然后全部点击下一步等待安装完成即可。
4、安装完后配置系统的环境变量(我的电脑->右键->属性->高级系统设置),环境变量配置完成后,需要重启电脑,然后windows+R,输入cmd,再输入erl,看到版本号就说明erlang安装成功了。
新建一个变量名:ERLANG_HOME
;值为安装路径。点击确定
在path最后加上:%ERLANG_HOME%\bin
二、安装RabbitMQ
1、下载安装包,点击安装
安装完成后在安装路径下面存在想要的文件夹。
2、找到RabbitMQ安装文件夹下的的sbin目录,然后在目录上直接输入cmd然后回车
3、输入rabbitmqctl status(此页面代表运行正常)
4、启动服务端
5、通过:http://localhost:15672进行访问,若15672端口号无法访问,可进入RabbitMQ安装文件夹下的的sbin目录,然后在目录上直接输入cmd,然后回车,输入命令rabbitmq-plugins enable rabbitmq_management命令进行处理。即可成功。
15672:控制台端口号
5672:应用访问端口号
6、访问控制台(默认密码:guest/guest)
三、.Net6中使用RabbitMQ
1、新建一个控制台项目,安装nuget包
2、事例代码 2-1:
// See https://aka.ms/new-console-template for more information using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Collections; using System.Text; namespace RabbitMQ { class SendClass { static void Main(string[] arg) { string strASC = "ASC KA-20(TSC Technical Services Company"; Console.Write(strASC.Substring(0,10)); Hashtable hashtable = new Hashtable(); IConnectionFactory factory = new ConnectionFactory//创建连接工厂对象 { HostName = "127.0.0.1",//IP地址 Port = 5672,//端口号 UserName = "guest",//用户账号 Password = "guest"//用户密码 }; IConnection con = factory.CreateConnection();//创建连接对象 IModel channel = con.CreateModel();//创建连接会话对象 string name = "demo"; //声明一个队列 channel.QueueDeclare( queue: name,//消息队列名称 durable: false,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。 exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除. autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是:致少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除. arguments: null //设置队列的一些其它参数 ); //创建生产者对象 string str = string.Empty; do { Console.WriteLine("输入生产者发送内容:"); str = Console.ReadLine(); //消息内容 byte[] body = Encoding.UTF8.GetBytes(str); //发送消息 channel.BasicPublish("", name, null, body); Console.WriteLine("成功发送消息:" + str); } while (str.Trim().ToLower() != "esc"); //告诉Rabbit每次只能向消费者发送一条信息,再消费者未确认之前,不再向他发送信息 channel.BasicQos(0, 1, false); //创建消费者对象 var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { Thread.Sleep(1000); byte[] message = ea.Body.ToArray();//接收到的消息 Console.WriteLine("消费者接收到消息为1:" + Encoding.UTF8.GetString(message)); }; consumer.Received += (model, ea) => { Thread.Sleep(2000); byte[] message = ea.Body.ToArray();//接收到的消息 Console.WriteLine("消费者接收到消息为2:" + Encoding.UTF8.GetString(message)); }; //消费者开启监听 channel.BasicConsume(name, true, consumer); Console.ReadKey(); channel.Dispose(); con.Close(); channel.Close(); } } }
执行成功后会在RabbitMQ的控制台管理工具中看到消息
2-2:一次读取消息
// See https://aka.ms/new-console-template for more information using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Collections; using System.Text; namespace RabbitMQ { class SendClass { static void Main(string[] arg) { string strASC = "ASC KA-20(TSC Technical Services Company"; Console.Write(strASC.Substring(0,10)); Hashtable hashtable = new Hashtable(); IConnectionFactory factory = new ConnectionFactory//创建连接工厂对象 { HostName = "127.0.0.1",//IP地址 Port = 5672,//端口号 UserName = "guest",//用户账号 Password = "guest"//用户密码 }; IConnection con = factory.CreateConnection();//创建连接对象 IModel channel = con.CreateModel();//创建连接会话对象 string name = "demo"; //声明一个队列 channel.QueueDeclare( queue: name,//消息队列名称 durable: false,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。 exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除. autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是:致少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除. arguments: null //设置队列的一些其它参数 ); //创建生产者对象 string str = string.Empty; do { Console.WriteLine("输入生产者发送内容:"); str = Console.ReadLine(); //消息内容 byte[] body = Encoding.UTF8.GetBytes(str); //发送消息 channel.BasicPublish("", name, null, body); Console.WriteLine("成功发送消息:" + str); } while (str.Trim().ToLower() != "esc"); //告诉Rabbit每次只能向消费者发送一条信息,再消费者未确认之前,不再向他发送信息 channel.BasicQos(0, 1, false); //创建消费者对象 var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { try { var message = ea.Body; Console.WriteLine("接收到信息为:" + Encoding.UTF8.GetString(message.ToArray())); if (Encoding.UTF8.GetString(message.ToArray()).Contains("50")) { throw new Exception("模拟异常"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { ((EventingBasicConsumer)model).Model.BasicAck(ea.DeliveryTag, multiple: false); } }; //consumer.Received += (model, ea) => //{ // Thread.Sleep(1000); // byte[] message = ea.Body.ToArray();//接收到的消息 // Console.WriteLine("消费者接收到消息为1:" + Encoding.UTF8.GetString(message)); //}; //consumer.Received += (model, ea) => //{ // Thread.Sleep(2000); // byte[] message = ea.Body.ToArray();//接收到的消息 // Console.WriteLine("消费者接收到消息为2:" + Encoding.UTF8.GetString(message)); //}; //消费者开启监听 channel.BasicConsume(name, true, consumer); Console.ReadKey(); channel.Dispose(); con.Close(); channel.Close(); } } }
2-3:循环读取消息
// See https://aka.ms/new-console-template for more information using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Collections; using System.Text; namespace RabbitMQ { class SendClass { static void Main(string[] arg) { string strASC = "ASC KA-20(TSC Technical Services Company"; Console.Write(strASC.Substring(0, 10)); Hashtable hashtable = new Hashtable(); IConnectionFactory factory = new ConnectionFactory//创建连接工厂对象 { HostName = "127.0.0.1",//IP地址 Port = 5672,//端口号 UserName = "guest",//用户账号 Password = "guest"//用户密码 }; IConnection con = factory.CreateConnection();//创建连接对象 IModel channel = con.CreateModel();//创建连接会话对象 string name = "demo"; //声明一个队列 channel.QueueDeclare( queue: name,//消息队列名称 durable: false,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。 exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除. autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是:致少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除. arguments: null //设置队列的一些其它参数 ); //创建生产者对象 string str = string.Empty; do { Console.WriteLine("输入生产者发送内容:"); str = Console.ReadLine(); //消息内容 byte[] body = Encoding.UTF8.GetBytes(str); //发送消息 channel.BasicPublish("", name, null, body); Console.WriteLine("成功发送消息:" + str); } while (str.Trim().ToLower() != "esc"); //告诉Rabbit每次只能向消费者发送一条信息,再消费者未确认之前,不再向他发送信息 channel.BasicQos(0, 1, false); //创建消费者对象 var consumer = new EventingBasicConsumer(channel); //读取消息总数 var declear_queue_Count = channel.MessageCount("demo"); string[] strAccount = { "张三", "李四", "王麻子", "王五" }; consumer.Received += (model, ea) => { for (int j = 0; j < strAccount.Length; j++) { byte[] message = ea.Body.ToArray();//接收到的消息 Console.WriteLine(strAccount[j] + "接收消息:" + Encoding.UTF8.GetString(message)); } }; //消费者开启监听 channel.BasicConsume(name, true, consumer); Console.ReadKey(); channel.Dispose(); con.Close(); channel.Close(); } } }
到此,Windows10搭建本地RabbitMq 服务端以及.Net6中的使用就算是成功了,由于时间关系,仅仅只测试了基本的消息类型,一对一的简单模式,其他的Work模式、发布订阅模式、路由模式、Topic模式及RPC模式后面在慢慢补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!