当前位置:必发365电子游戏 > 操作系统 > 在写队列工厂第二篇文章的时候
在写队列工厂第二篇文章的时候
2019-12-19

此次和名门三进三出的是RabbitMQ队列的用法,前风度翩翩篇作品队列工厂之(MSMQ卡塔尔(英语:State of Qatar)中在陈述的时候已经搭建了简短工厂,因而本章内容是在其上述扩张的子项不再过多解说工厂的代码了;RabbitMQ应该是当今网络集团音信队列用的最多的大器晚成种之大器晚成吧,看看招徕邀约基本都会有那几个单词的产出,她比较前豆蔻年华篇分享的MSMQ来讲配置更三种化,安装步骤数两个都大概吧,最大不同MSMQ是windows捆绑的劳动差相当的少只可以在windows上行使,而Rabbit现如今运转帮衬的体系比比较多;在写队列工厂第二篇小说的时候,其实代码已经都变成了近日队列工厂饱含犹如下队列(必发365电子游戏,msmq,redis,rabbitmq),你可以去下载源码和测量试验用例:QueueReposity-队列工厂;希望大家可以中意,也意在各位多多"扫码扶植"和"推荐"谢谢!

 

» RabbitMQ安装和调控台

**» 封装RabbitMQ队列的读和写**

**» 队列工厂之RabbitMQ测量试验用例**

 

下边敬业的来享受:

» RabbitMQ安装和调控台

要说RabbitMQ的安装,首先我们要下载对应服务器操作系统的RabbitMQ安装文件,因为她有对应不一样操作系统的设置版本,那点要求潜心;作者本地Computer系统是win7(属于windows卡塔尔(قطر‎所以去官方网址下载安装包: on rabbitmq.com下载,点击“windows”就可以下载:

必发365电子游戏 1

一时一刻新星版本地址:

平淡无奇自个儿都以跻身那几个分界面包车型客车Installation Guides节点后-》With installer (recommended卡塔尔(قطر‎,此时步入的是windows系统所需的扶持文书档案吧,相通可以选拔版本下载;步入该分界面包车型大巴显要目标是内需下载一个Erlang Windows的安装文件(更加深层原因:RabbitMq运转重视于Erlang语言),点击Erlang Windows Binary File步向下载分界面,然后选拔你操作系统对应的本子,若是您也是windows陆拾肆位的可以直接用那些地方下载:

这时候八个必需的东西已经下载实现,先安装erlang语言的exe,再安装rabbitmq-server-3.6.6.exe;有刚最早接触RabbitMQ的敌人会问为何要求Erlang的支撑,因为他正是Erlang开采出来的,Erlang语言是豆蔻梢头种通用的面向并发的编制程序语言,特地用来编排遍及式的意气风发种语言;当你安装前边说的特别erlang安装包后,您Computer早前菜单中就有Erlang开采编辑器,临时间你能够用来练练手,就近年来来讲这种语言单词日常出未来五星级大商铺的爱才如命中,中型Mini型平日未有,只怕也因为超少中型小型型集团会提到到现身的原由吗;到这里安装就完了了,下面要求经过命令行实施一些发令,由于RabbitMQ配置很多这里本人捡一定会用到的多少个来演示,别的实际能够参照官方文书档案:

首先找到安装rabbitmq的目录并步入rabbitmq_server-3.6.6找到sbin文件夹-》按住Shift+鼠标右键sbin文件夹-》在那处张开命令窗体-》参谋那几个地点 enable rabbitmq_management -》录入到刚刚展开的cmd窗体中:

必发365电子游戏 2

那一个是展开rabbitmq微机的吩咐,那时你能够在您浏览器中录入 通过游客账号踏入rabbitmq的监察和控制后台:

url:

Username:guest

Password:guest

此时要是你看见如下图的分界面,那恭喜您成功了,搭建RabbitMQ服务成功了:

必发365电子游戏 3

因为Rabbit不光有队列,还恐怕有任何的路由,交流机等成效,所以能看出大多的计算或描述,这里大家只用到Queues的选项,点击步入Queues分界面能观望没有任何的数码,不过有叁个Add queue的开关,这些调整台允许你手动增加多少个体系数据,当然那不是大家明日的话题:

必发365电子游戏 4

下边包车型大巴guest已经够咋们测量试验使用了,至于剩余的哪些管理员账号或密码等操作的装置能够去看这几个:

rabbitmqctl操作的文书档案:

plugins操作文书档案:

 

**» 封装RabbitMQ队列的读和写**

在C#中应用RabbitMQ官方网站列举了三种艺术,这里自身接纳间接使用其提供的RabbitMQ.Client的nuget包,就现阶段以此nuget来讲4.0.0及以上版本一定要NETFramework 4.5.1及以上版本或netcore版本才同意利用,作者这里用的是Framework4.5框架所以引用了此版本的nuget包:

Install-Package RabbitMQ.Client -Version 3.6.6

引用过后就是往前边讲的连串工厂填写代码,首先继承统大器晚成都部队署文件读取类 PublicClass.ConfClass<QRabbitMQ> ,然后完结 IQueue 接口,这里封装了RabbitMq常用的多少个操作方法,具体代码:

 1  /// <summary>
 2     /// RabbitMq
 3     /// </summary>
 4     public class QRabbitMQ : PublicClass.ConfClass<QRabbitMQ>, IQueue
 5     {
 6         private IConnection con = null;
 7 
 8         public void Create()
 9         {
10             if (string.IsNullOrWhiteSpace(this.ApiUrl) || string.IsNullOrWhiteSpace(this.ApiKey)) { throw new Exception("创建RabbitMq队列需要指定队列:HostName和Port"); }
11 
12             try
13             {
14                 var factory = new ConnectionFactory() { HostName = this.ApiUrl, Port = Convert.ToInt32(this.ApiKey) };
15                 con = con ?? factory.CreateConnection();
16             }
17             catch (Exception ex)
18             {
19                 throw new Exception(ex.Message);
20             }
21         }
22 
23         public long Total(string name = "Redis_01")
24         {
25             if (con == null) { throw new Exception("请先创建队列连接"); }
26             using (var channel = con.CreateModel())
27             {
28                 return channel.MessageCount(name);
29             }
30         }
31 
32         public Message Read(string name = "RabbitMQ_01")
33         {
34             if (con == null) { throw new Exception("请先创建队列连接"); }
35             if (string.IsNullOrWhiteSpace(name)) { throw new Exception("name不能为空"); }
36 
37             var message = new Message();
38             message.Label = name;
39             message.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
40             using (var channel = con.CreateModel())
41             {
42                 var baseResult = channel.BasicGet(name, true); //true:获取后删除队列   false:不删除  
43                 if (baseResult == null) { return message; }
44                 var body = baseResult.Body;
45                 message.Body = Encoding.UTF8.GetString(body); 
46             }
47             return message;
48         }
49 
50         public bool Write(string content, string name = "RabbitMQ_Queue01")
51         {
52             if (con == null) { throw new Exception("请先创建队列连接"); }
53             if (string.IsNullOrWhiteSpace(content) || string.IsNullOrWhiteSpace(name)) { throw new Exception("content和name不能为空"); }
54 
55             using (var channel = con.CreateModel())
56             {
57                 channel.QueueDeclare(name, false, false, false, null);
58                 var body = Encoding.UTF8.GetBytes(content);
59 
60                 channel.BasicPublish(string.Empty, name, null, body);
61                 return true;
62             }
63         }
64 
65         public void Dispose()
66         {
67             if (con != null)
68             {
69                 con.Close();
70                 con.Dispose();
71                 con = null;
72             }
73         }
74     }

代码主要利用流程是:创造(Create卡塔尔国-》读(Read卡塔尔国|写(Write卡塔尔-》释放(Dispose卡塔尔(英语:State of Qatar);有了切实可行的RabbitMq完结类,那么在工厂中直接通过泛型映射来博取该达成类的靶子:

 1 /// <summary>
 2     /// ==================
 3     /// author:神牛步行3
 4     /// des:该列工厂开源,包括队列有MSMQ,RedisMQ,RabbitMQ
 5     /// blogs:http://www.cnblogs.com/wangrudong003/
 6     /// ==================
 7     /// 队列工厂
 8     /// </summary>
 9     public class QueueReposity<T> where T : class,IQueue, new()
10     {
11         public static IQueue Current
12         {
13             get
14             {
15                 return PublicClass.ConfClass<T>.Current;
16             }
17         }
18     }

在写队列工厂第二篇文章的时候。 

**» 队列工厂之RabbitMQ测验用例**

由此地点配置情形和包裹本人的法子,这里写了二个简单易行的测验用例,分为Server(参与音讯队列卡塔尔国和Client(获取音讯队列卡塔尔(英语:State of Qatar),首先来看Server端的代码:

 1  /// <summary>
 2     /// 队列服务端测试用例
 3     /// </summary>
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             //Redis_Server();
 9 
10             RabbitMQ_Server();
11 
12             //MSMQ_Server();
13         }
14         private static void RabbitMQ_Server()
15         {
16             //实例化QMsmq对象
17             var mq = QueueReposity<QRabbitMQ>.Current;
18 
19             try
20             {
21                 Console.WriteLine("Server端创建:RabbitMQ实例");
22                 mq.Create();
23 
24                 var num = 0;
25                 do
26                 {
27                     Console.WriteLine("输入循环数量(数字,0表示结束):");
28                     var readStr = Console.ReadLine();
29                     num = string.IsNullOrWhiteSpace(readStr) ? 0 : Convert.ToInt32(readStr);
30 
31                     Console.WriteLine("插入数据:");
32                     for (int i = 0; i < num; i++)
33                     {
34                         var str = "我的编号是:" + i;
35                         mq.Write(str);
36                         Console.WriteLine(str);
37                     }
38                 } while (num > 0);
39             }
40             catch (Exception ex)
41             {
42             }
43             finally
44             {
45                 Console.WriteLine("释放。");
46                 mq.Dispose();
47             }
48             Console.ReadLine();
49         }
50     }

因此:创建(Create卡塔尔-》读(Read卡塔尔(قطر‎|写(Write卡塔尔-》释放(Dispose)的流程来利用我们的队列工厂,认为挺轻松的,这个时候大家运营下那一个Server端,然后录入参数:

必发365电子游戏 5

本条时候就往RabbitMq队列中参与了11条数据,大家通过她的后台去找刚才增加的类别:

必发365电子游戏 6

能够见到大家恰恰插入的行列总量和称号,假如您想相中间具体内容,能够点击名字“mq_01”进入某贰个行列的分界面,往上边拉滚动条找到“Get messages”选项,默许查看Messages是1大家改进为10,再点击get messages就可见看到如下图大家刚刚插入的具体内容了:

必发365电子游戏 7

截图有一点长哦,不亮堂dudu会不会怪作者哈哈,到这里能观看队列插入是打响的,然后大家来经过client端花费队列,具体代码:

 1  /// <summary>
 2     /// 队列客户端测试用例
 3     /// </summary>
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             //RedisMQ_Client();
 9 
10             RabbitMQ_Client();
11 
12             //MSMQ_Client();
13         }
14 
15         private static void RabbitMQ_Client()
16         {
17             //实例化QMsmq对象
18             var mq = QueueReposity<QRabbitMQ>.Current;
19             try
20             {
21                 Console.WriteLine("Client端创建:RabbitMQ实例");
22                 mq.Create();
23 
24                 while (true)
25                 {
26                     try
27                     {
28                         var total = mq.Total();
29                         if (total > 0) { Console.WriteLine("队列条数:" + total); }
30 
31                         var result = mq.Read();
32                         if (result.Body == null) { continue; }
33                         Console.WriteLine(string.Format("接受队列{0}:{1}", result.Label, result.Body));
34                     }
35                     catch (Exception ex)
36                     { Console.WriteLine("异常信息:" + ex.Message); }
37                 }
38             }
39             catch (Exception ex)
40             {
41                 throw ex;
42             }
43             finally
44             {
45                 Console.WriteLine("释放。");
46                 mq.Dispose();
47             }
48         }
49     }

再来咋们运维exe看下效果:

必发365电子游戏 8

此刻刚好投入队列中的数据就读抽取来了,此时大家再看Rabbitmq调整台,get messages已经收获不出去具体的内容音讯了,因为这么些顾客端花费了数额,队列中的数据自动撤消了,至于是还是不是想息灭数据那个装置在代码:

1 var baseResult = channel.BasicGet(name, true); //true:获取后删除队列   false:不删除  

如上对封装RabbitMQ的代码分享和条件搭建批注,希望能给你带给好的帮扶,多谢阅读;