上一章我们讲了队列( Queue),这一章我们讲Message Queue消息队列,简称MQ。

定义:

  MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发)。MQ是一种应用程序对应用程序的通信方法。

应用程序通过读写入队和出队的消息来通信,无需专用连接来链接它们。

消息传递是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,一般应用于远程过程调用的技术。

排队指的是应用程序通过队列来通信。应用队列避免接收和发送数据的同时进行。

特点:

  MQ是消费者-生产者模型的代表。一端往消息队列中写入消息,另一端可以读取或者订阅队列中的消息。

MQ遵循的是AMQP协议(高级消息队列协议:使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能)的具体实现和产品。

应用:

  在使用MQ时,我们不需要实时的返回信息。获取信息和返回信息进行异步处理。

例如:在项目中,我们需要从汽车系统中利用CAN总线实时的获取汽车的相关信息,但是没有必要给汽车返回信息。

如,获取汽车的轮胎气压,但是我们不需要给汽车一个返回的信息或结果。

C#项目要利用RabbitMQ来获取实时数据的话,需要先安装客户端的库文件:RabbitMQ.Client.dll,下面有提到。

备用下载路径:

链接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw 
提取码:6962


写在前面:

这个就需要安装RabbitMQ服务、下载Erlang环境并安装、引入RabbitMQ.client.dll动态库。下面有官网可以下载相应的内容。

我这个使用windows 64位的,我这里整理安装程序在百度网盘,官网打开Erlang很慢的去我百度网盘下载

链接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw
提取码:6962


安装

需要安装RabbitMQ服务:

官网下载地址:http://www.rabbitmq.com/download.html

下载完成后一直点击下一步即可。

如果没有Erlang环境会弹出下面的提示:

下载Erlang环境并安装,安装时一直点下一步即可

地址:http://www.erlang.org/downloads

如果打开网页慢或者打不开的,去下载我整理也行,不过我的是windows 64的。

链接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw 
提取码:6962

安装完成后我们需要配置环境变量,如下:

点击【计算机】右键,属性,高级系统设置,高级,环境变量,

新建一个系统变量。

输入

变量名:ERLANG_HOME,

变量值:C:\Program Files\erl9.3

变量值是你刚刚安装Erlang的路径

然后在找到环境变量里面的Path,点击编辑,在变量值的最后面加上  ;%ERLANG_HOME%\bin;,记得有分号(英文分号)

安装成功后会在服务中看到该服务。.

然后安装RabbitMQ,也是一直点击下一步即可,

到这里后就准备工作做完了,接下来我们就编写代码。

有的童鞋不知道为什么需要安装RabbitMQ服务和Erlang环境,我这里简单普及一下,详细的请百度一下。

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。

所有主要的编程语言均有与代理接口通讯的客户端库。

.


 代码实例:

为了讲解效果更佳,我们新建两个控制台应用程序MessageQueueClient(生产者)和MessageQueueServer(消费者),

不要急着建立,看下面的代码依次建立。

生产者 :

新建控制台应用程序MessageQueueClient,引用动态文件库RabbitMQ.Client.dll,可以去百度下载一个,上面的网盘路径里面有。

入队代码编写:

using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MessageQueueClient
{
class Program
{
static void Main(string[] args)
{
//生产者
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = "127.0.0.1";
//默认端口
factory.Port = ;
using (IConnection conn = factory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("MyRabbitMQ", true, false, false, null);
while (true)
{
string message = string.Format("{0}", Console.ReadLine()); //Console.ReadLine()为控制台输入的内容,我们可以用其他方式获取
byte[] buffer = Encoding.UTF8.GetBytes(message);
IBasicProperties properties = channel.CreateBasicProperties();
properties.DeliveryMode = ;
channel.BasicPublish("", "MyRabbitMQ", properties, buffer); //入队
Console.WriteLine("入队成功:" + message);
}
}
}
}
}
}

控制台入队操作,控制台这一步可以结合实际代码需求进行入队。

这里就入队成功了,接下来我们出队,也就是读取数据,这里和readis有点像,我们之前安装的RabbitMQ服务就是在这里用到了。

生产者 :

新建控制台应用程序MessageQueueServer,引用动态文件库RabbitMQ.Client.dll,可以去百度下载一个,上面的网盘路径里面有。

出队代码编写:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MessageQueueServer
{
class Program
{
static void Main(string[] args)
{
//消费者
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = "127.0.0.1";
//默认端口
factory.Port = ;
using (IConnection conn = factory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("MyRabbitMQ", true, false, false, null); //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
channel.BasicQos(, , false); Console.WriteLine("Listening..."); //在队列上定义一个消费者
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
//消费队列,并设置应答模式为程序主动应答
channel.BasicConsume("MyRabbitMQ", false, consumer); while (true)
{
//阻塞函数,获取队列中的消息
BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
byte[] bytes = ea.Body;
string str = Encoding.UTF8.GetString(bytes); Console.WriteLine("读取队列消息:" + str.ToString());
//回复确认
channel.BasicAck(ea.DeliveryTag, false);
}
}
}
}
}
}

运行代码,读取队列里面的内容,遵循先入先出原则。

这样队列的数据就读取到了。

总结:

这是一个简单的消息队列的应用,写的比较粗浅,具体需要结合实际应用项目编写。

另外感谢大家的支持^_^

C# Queue与RabbitMQ的爱恨情仇(文末附源码):Q与MQ消息队列简单应用(二)的更多相关文章

  1. Menu与ActionBar的爱恨情仇

    最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...

  2. web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决

    [问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...

  3. 注解:大话AOP与Android的爱恨情仇

    转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...

  4. 除了love和hate,还能怎么表达那些年的“爱恨情仇”?

    实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...

  5. 对json的爱恨情仇

    本文回想了对json的爱恨情仇. C++有风险,使用需慎重. 本文相关代码在:http://download.csdn.net/detail/baihacker/7862785 当中的測试数据不在里面 ...

  6. String、StringBuilder、StringBuffer的爱恨情仇

    第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ...

  7. [转帖]探秘华为(一):华为和H3C(华三)的爱恨情仇史!

    探秘华为(一):华为和H3C(华三)的爱恨情仇史! https://baijiahao.baidu.com/s?id=1620703498823290828&wfr=spider&fo ...

  8. Tidyverse|数据列的分分合合,爱恨情仇

    Tidyverse|数据列的分分合合,爱恨情仇 本文首发于“生信补给站”Tidyverse|数据列的分分合合,一分多,多合一 TCGA数据挖掘可做很多分析,前期数据“清洗”费时费力但很需要. 比如基因 ...

  9. pytorch和tensorflow的爱恨情仇之基本数据类型

    自己一直以来都是使用的pytorch,最近打算好好的看下tensorflow,新开一个系列:pytorch和tensorflow的爱恨情仇(相爱相杀...) 无论学习什么框架或者是什么编程语言,最基础 ...

随机推荐

  1. mysql踩坑记录之limit和sum函数混合使用问题

    问题复盘本次复盘会用一个很简单的订单表作为示例. 数据准备订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( `i ...

  2. 植物大战僵尸游戏的开发(python)

    装备东西: 搭建好python环境, 四张图片,(背景图片,炮弹图片,僵尸图片,豌豆图片),就ok了  没有安装pygame的需要进行安装  pip install pygame 参考视频 # 植物大 ...

  3. python基础一 day9 函数升阶(2)

    def max(a,b): return a if a>b else bprint(max(1, 2)) # 函数进阶# a = 1# def func():# print(a)# func() ...

  4. Chrome浏览器商店安装的插件保存到本地

    Chrome自67版本开始,不能从第三方下载插件拖动安装,要么就是以前的方法安装修改为zip格式,会有报错(报错如下图),强迫症肯定忍不了报错的:按照网上说法,是第三方插件的压缩算法和Chrome商店 ...

  5. Perl monks 的 快速回复

    on Jun 20, 2019 at 11:39 UTC ( #11101620=perlquestion: print w/replies, xml ) Need Help?? jimyokl ha ...

  6. Openjudge-2815-城堡问题

    对于这道题目来说的话,我们的思路是这样的,我们首先把数据读进来,然后把color数组清零. 我们的思路是这样的的,给每一个房间设置一个对应的color数组,然后color数组里面填满不同的数字,每一种 ...

  7. (1) openssl基础概念

    1.1 背景知识 对称加密     :加密解密使用同一密钥,加解密速度快.随着人数增多,密钥数量急增n(n-1)/2. 非对称加密 :使用公私钥配对加解密,速度慢.公钥是从私钥中提取出来的,一般拿对方 ...

  8. MySQL学习点滴 --分区表

    写在前面:笔者之前也有一些MySQL方面的笔记,其中部分内容来自极客时间中丁奇老师的课程.后经园友提醒,这个做法确实不太好.之后我仍会继续更新一下MySQL方面的学习记录,在自己理解之后用自己的方式记 ...

  9. 2018 GDCPC 省赛总结

    第二次参加省赛了,对比上年连STL都不会的acm入门者来说, 今年是接触acm的第二年. 首先要说的是今年的省赛比上年人数多了很多, 闭幕式200多支队伍坐满了整个礼堂还要站着不少人,所以今年的竞争其 ...

  10. DEV Express

    记录在使用DEV Express中遇到的所有问题及解决方案 问题1:将Dev11升级到Dev14 解决方案:将解决方案中原有Dev引用删除,重新添加必须的Dev14引用,问题解决: 问题2:LC.ex ...