C# 消息队列
阅读目录
1. 消息队列是什么?
2. 常见的消息队列框架有哪些?
3. MSMQ介绍
4. RabbitMQ介绍
消息队列是什么
简单的理解就是将消息添加一个队列中,使用时在从这个队列中取出来。那么消息什么?队列又是什么呢?
消息:说白了就是交互的内容,可以是文字、图片、视频等等。
队列:一种先进先出的存储格式。
消息队列提供保证消息传递,高效的路由、安全和基于优先级的消息。它可以用来实现需要高性能的异步和同步场景的解决方案。
常见的消息队列框架有哪些?
业内有很多种消息队列框架和中间件,目前使用过的只有RabbitMQ和微软的MSMQ,接下来重点介绍这两种。
MSMQ介绍
Window系统下自带了微软自家的消息队列框架——MSMQ,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。
一、安装MSMQ
首先,看看是否已经启用MSMQ服务,打开服务窗体,如果能如找到MSMQ服务,说明已经启用,如下图:

如果没有看到该服务,点击 控制面板-打开或关闭Windows功能,选中MSMQ项,再点击“确定”按钮即可启用MSMQ服务,如下图:

二、支持类型
MSMQ 支持两种类型的消息: XML 和二进制。
三、示例代码
using System;
using System.Messaging; namespace QiDaShengDemo
{
class Program
{
static void Main(string[] args)
{
MessageQueue messageQueue = null;
//判断指定的路径是否存在“消息队列”队列,如果存在直接初始化,并设置好说明
//否则在指定的路径中创建“消息队列”
if (MessageQueue.Exists(@".\Private$\MyQueues"))
{
messageQueue = new MessageQueue(@".\Private$\MyQueues");
messageQueue.Label = "Testing Queue";
}
else
{
messageQueue = MessageQueue.Create(@".\Private$\MyQueues");
messageQueue.Label = "New Create Queue";
} //发送对象到消息队列中,并设置好标签
messageQueue.Send("First ever Message is sent to MSMQ", "Title");
//设置消息类型
messageQueue.Formatter = new XmlMessageFormatter(new string[] { "System.String" }); foreach (Message msg in messageQueue)
{
string readMessage = msg.Body.ToString();
Console.WriteLine(readMessage);
}
messageQueue.Purge(); Console.Read();
}
}
}
RabbitMQ介绍
RabbitMQ是一个非常流行的消息队列框架,使用简单,能够使用于当前所有主要的操作系统,并且是开源的,目前最新的版本为3.6.5。
RabbitMQ安装
卸载历史版本
如果本地之前已经安装过Erlang(一种编程语言)虚拟机,,要先卸载。
安装RabbitMQ Server
首先,要先下载 Erlang Windows Binary File,下载之后安装即可。
然后,在下载rabbitmq-server-3.6.5.exe,下载之后点击安装即可,这样RabbitMQ Server就安装成功了,安装成功之后在“开始”菜单可以看到如下信息:

如上图所示,我们可以重新安装、移除、开始、停止 RabbitMQ 服务。
RabbitMQ示例
简单的进程通讯,一个Producer发送一条message到消息队列中,一个Consumer从消息队列中接收到这条message。

新建一个控制台程序,发送端示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RabbitMQ.Client; namespace RabbitMQ.Send
{
class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName="localhost"};
using (var connection = factory.CreateConnection())
using (var channel=connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive:false,
autoDelete:false,
arguments:null
); string message = "Hello world qds!";
var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange:"",
routingKey:"hello",
basicProperties:null,
body:body
); Console.WriteLine(" [x]send {0}",message);
} Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
新建一个控制台程序,接收端示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RabbitMQ.Client;
using RabbitMQ.Client.Events; namespace RabbitMQ.Receive
{
class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName="localhost"};
using (var connection = factory.CreateConnection())
using (var channel=connection.CreateModel())
{
channel.QueueDeclare(queue:"hello",
durable:false,
exclusive:false,
autoDelete:false,
arguments:null
); var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model,ea) => {
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
}; channel.BasicConsume(queue: "hello",
noAck: true,
consumer:consumer
); Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
}
两个工程编程成功之后,先执行RabbitMQ.Send.exe,再执行RabbitMQ.Receive.exe,
结果如下:

想了解更多,可参考RabbiMQ官网:http://www.rabbitmq.com/
参考:
[1].http://www.cnblogs.com/tenghoo/archive/2009/11/05/1596456.html
[2].http://www.cnblogs.com/danielWise/archive/2011/02/28/1966808.html
[3].http://www.cnblogs.com/gossip/p/4373547.html
[4].http://www.cnblogs.com/shanyou/archive/2012/10/27/2742979.html
C# 消息队列的更多相关文章
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
- Netty构建分布式消息队列实现原理浅析
在本人的上一篇博客文章:Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇 中,重点向大家介绍了AvatarMQ主要构成模块以及目前存在的优缺点.最后以一个生产者.消费者传递消息的例子, ...
- C#分布式消息队列 EQueue 2.0 发布啦
前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地 ...
随机推荐
- bzoj1008 [HNOI2008]越狱
1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5099 Solved: 2207 Description 监狱有 ...
- Kalman滤波器原理和实现
Kalman滤波器原理和实现 kalman filter Kalman滤波器的直观理解[1] 假设我们要测量一个房间下一刻钟的温度.据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为 ...
- SQL: enable sa Account in SQL Server
Link: http://sudeeptaganguly.wordpress.com/2010/04/20/how-to-enable-sa-account-in-sql-server/ 引用: Wh ...
- BZOJ4444 : [Scoi2015]国旗计划
首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...
- BZOJ3414 : Poi2013 Inspector
二分答案,没有出现过的时刻没有用,可以进行离散化. 首先如果某个时刻出现多个人数,那么肯定矛盾. 然后按时间依次考虑,维护: $t$:剩余可选人数. $s$:现在必定有的人数. $cl$:往左延伸的人 ...
- Hadoop建立IPC连接和数据读写
建立IPC连接 IPC Client通过调用getConnection获取IPC连接,具体流程图如下: 服务器端的IPC连接代码分散在Listener和Server.Connection中. List ...
- [Sdoi2014]旅行 题解
题目大意: 给出一个n个点的数,和m次操作.每个点有颜色和权值. 每次操作分4种 1:修改一个点的颜色 2:修改一个点的权值 3:询问从x到y的路径上,和x相同颜色的点的权值和(保证x,y同颜色) 4 ...
- 【BZOJ】2876: [Noi2012]骑行川藏
题意 给出\(s_i, k_i, v_i', E\),满足\(\sum_{i=1}^{n} k_i s_i ( v_i - v_i' )^2 \le E, v_i > v_i'\),最小化$ \ ...
- jquery dialog open后,服务器端控件失效的快速解决方法
jquery dialog为我们提供了非常漂亮实用的对话框,比单调的alert.confirm.prompt好用很多. 在使用jquery与.net共同开发时,直接调用jquery dialog的op ...
- PL/SQL查询oracle数据库对象
dictionary 全部数据字典表的名称和解释,它有一个同义词dict,dict_column 全部数据字典表里字段名称和解释 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: se ...