[C# ]使用RabbitMQ的完整图解
# C# 使用RabbitMQ的完整图解## 1.前言
Message Queue消息队列,简称MQ,是一种应用程序对应用程序的通信方法,应用程序通过读写出入队列的消息来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此通信。
MQ是消费-生产者模型的一个典型代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。
## 2. 安装
>提示:以下的链接下载特别慢,建议到我的网盘下载,包括案例,速度特快(回复`rabbit`)
### 1. 下载RabbitMQ
(http://www.rabbitmq.com/download.html):http://www.rabbitmq.com/download.html
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126184156787.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
安装完RabbitMQ服务后,会在Windows服务中看到。如果没有Erlang运行环境,在安装过程中会提醒先安装Erlang环境
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126184512373.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
### 2. OTP
点击是就会直接跳转,或者[点击链接](http://www.erlang.org/downloads)进行下载
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126184753137.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_70)
下载完后进行暗安装![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126185105103.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
## 3.使用
打不开`web管理工具`的请看参考
>web管理工具的地址是:`http://localhost:15672`
>初始用户名:`guest`
>初始密码:`guest`
## 4.代码实现
#### 消息生产者
```
class Program
{
static void Main(string[] args)
{
try
{
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = Constants.MqHost;
factory.Port = Constants.MqPort;
factory.UserName = Constants.MqUserName;
factory.Password = Constants.MqPwd;
using (IConnection conn = factory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("MyFirstQueue", true, false, false, null);
while (true)
{
string customStr = Console.ReadLine();
RequestMsg requestMsg = new RequestMsg();
requestMsg.Name = string.Format("Name_{0}", customStr);
requestMsg.Code = string.Format("Code_{0}", customStr);
string jsonStr = JsonConvert.SerializeObject(requestMsg);
byte[] bytes = Encoding.UTF8.GetBytes(jsonStr);
//设置消息持久化
IBasicProperties properties = channel.CreateBasicProperties();
properties.DeliveryMode = 2;
channel.BasicPublish("", "MyFirstQueue", properties, bytes);
//channel.BasicPublish("", "MyFirstQueue", null, bytes);
Console.WriteLine("消息已发送:" + requestMsg.ToString());
}
}
}
}
catch (Exception e1)
{
Console.WriteLine(e1.ToString());
}
Console.ReadLine();
}
}
```
#### 消息消费者
```
class Program
{
static void Main(string[] args)
{
try
{
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = Constants.MqHost;
factory.Port = Constants.MqPort;
factory.UserName = Constants.MqUserName;
factory.Password = Constants.MqPwd;
using (IConnection conn = factory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("MyFirstQueue", true, false, false, null);
//输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
channel.BasicQos(0, 1, false);
Console.WriteLine("Listening...");
//在队列上定义一个消费者
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
//消费队列,并设置应答模式为程序主动应答
channel.BasicConsume("MyFirstQueue", false, consumer);
while (true)
{
//阻塞函数,获取队列中的消息
BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
byte[] bytes = ea.Body;
string str = Encoding.UTF8.GetString(bytes);
RequestMsg msg = JsonConvert.DeserializeObject<RequestMsg>(str);
Console.WriteLine("HandleMsg:" + msg.ToString());
//回复确认
channel.BasicAck(ea.DeliveryTag, false);
}
}
}
}
catch (Exception e1)
{
Console.WriteLine(e1.ToString());
}
Console.ReadLine();
}
}
```
## 5.总结
最后的运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126194910951.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
[消息生产者_代码GITHUB](https://github.com/PrideJoy/NetTemple/blob/master/MessageProducer/Program.cs)
`https://github.com/PrideJoy/NetTemple/blob/master/MessageProducer/Program.cs`
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126193636976.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
[消息消费者 _代码GITHUB](https://github.com/PrideJoy/NetTemple/blob/master/MessageRecipient/Program.cs)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021012619411587.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
## 6.项目说明
>关于仓库说明,`https://github.com/PrideJoy/NetTemple/`
>每一个项目都是自己亲自练习的
>这个项目是关于c#基本知识学习的练习,作为我入门的练手程序,自己学习的一个积累,如今共享出来,也希望对学习C#的朋友有点参考价值
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126194310476.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126194406716.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126194659384.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
如果觉得可以的话,点点关注不迷路
喜欢开源项目的话,可以点点看看(项目代码也放在里面啦,回复`rabbit`获取)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126195218487.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_70)
(微信公众号)分享最新的Net和Core相关技术以及实战技巧,更重要的是分享Net项目,不容错过的还有书籍,手写笔记等等。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230165308559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_0)
## 参考
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021012619250839.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
(https://www.jianshu.com/p/e041f5ed10c7)
(https://www.cnblogs.com/mq0036/p/11726733.html)
(https://www.jb51.net/article/122378.htm)
(https://blog.csdn.net/weixin_43997764/article/details/104848466)
(https://blog.csdn.net/zhangxiaojun211/article/details/100368642) 感谢分享 学习到了,感谢分享。 看不懂,但是感谢分享{:1_893:} 感谢分享经验 顶一下。 感谢分享
学习到了,感谢分享。 学习到了,感谢分享。 虽然不懂,但楼主分享精神可佳
页:
[1]
2