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开源地 ...
随机推荐
- CF# 334 Lieges of Legendre
C. Lieges of Legendre time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- SQLite错误码
在SQLite中,执行SQL语句的sqlite3_exec()和sqlite3_prepare()两个核心方法的返回值都是一个整型数据,因此,当程序执行出现错误时,我们可以根据执行返回的整型数据来判断 ...
- BZOJ2758 : [SCOI2012]Blinker的噩梦
首先将包含关系建树. 方法是将每个图形拆成上半边和下半边,从左往右扫描线,用Splay从下到上维护扫描线上所有图形. 每次加入一个新的图形$x$的时候,看看它下方第一个图形$y$,如果$y$是上半边, ...
- 使用GDB 修改MySQL参数不重启
link:http://blog.chinaunix.net/uid-20785090-id-4016315.html mysql很多参数都需要重启才能生效,有时候条件不允许,可以使用gdb作为最后的 ...
- android-async-http cancelRequests
github地址:https://github.com/loopj/android-async-http 使用上:官方建议使用一个静态的AsyncHttpClient: 1.AsyncHttpClie ...
- ACM: NBUT 1646 Internet of Lights and Switches - 二进制+map+vector
NBUT 1646 Internet of Lights and Switches Time Limit:5000MS Memory Limit:65535KB 64bit IO Fo ...
- 洛谷 P1991 无线通讯网 Label:最小生成树 || 二分
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- CF #374 (Div. 2) C. Journey dp
1.CF #374 (Div. 2) C. Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...
- U-Boot命令大全(功能参数及用法)
U-Boot上电启动后,按任意键可以退出自动启动状态,进入命令行. U-Boot 2010.03 (Sep 25 2011 - 16:18:50) DRAM: 64 MB Flash: ...
- Maven_根据不同个环境打包, 获取不同的配置文件等等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...