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开源地 ...
随机推荐
- iOS之07-三大特性之多态 + NSString类
多态 1.没有继承就没有多态 2.代码体现:父类类型的指针指向子类对象 类的创建: #import <Foundation/Foundation.h> // 动物 @interface A ...
- ccc 多点触控2
经过不断的思考发现,如果是两个sprite都添加触控的时候,往往直接成单点触控, 但是如果是两个node的时候在node上面点击就会变成多点触控的形式 cc.Class({ extends: cc.C ...
- BZOJ3946 : 无聊的游戏
首先把所有串拼起来,后插入的串在前面,得到一个大串. 那么任意时刻,每个串是由这个大串的若干个不相交的子串从左到右拼接而成. 用线段树维护每个串,每个节点维护一个标记,表示区间内的串要加上什么前缀. ...
- js 四舍五入保留二位小数
1. 最笨的办法....... [我就怎么干的.........] function get() { var s = 22.127456 + ""; var str = s.sub ...
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...
- 解决JS浮点数(小数)计算加减乘除的BUG
在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.1000000000000000000000000001(28位小数).0.10000000000000000000000000 ...
- hdu1272 小希的迷宫
Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...
- 简单图解设置MYSQL可以通过其他机器远程访问,开启远程访问权限
开始,运行---cmd,然后cd到mysql.exe目录,然后照着下图红色框中输入 注意: 1.MySQL 5.7查询时候应该输入select host,user,authentication_str ...
- 【BZOJ】1532: [POI2005]Kos-Dicing
题意 \(n\)个人\(m\)场比赛\((1 \le n \le 10000, 0 \le m \le 10000)\),给出每场比赛的两个选手,求赢得最多的人最少赢的场数. 分析 二分最多人赢的场数 ...
- 【noiOJ】p7914(..)
08:不重复地输出数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n个数,从小到大将它们输出,重复的数只输出一次.保证不同的数不超过500个. 输入 ...