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开源地 ...
随机推荐
- 在WPF下快速生成线的方法
如果线较多时,在画布中用Path或Line生成时会比较慢.用DrawingVisual可以快速生成,这个在之前我的博客中已经提到.但在类库形式下生成的无法看到,保存成Image后再加入图层后成功显示. ...
- java获取日期
/* * 获取昨天日期 方法一,这个方法好像有点慢 */Date dt = new Date(); Calendar cal = Calendar.getInstance();cal.add(Cale ...
- HDU 2838 (DP+树状数组维护带权排序)
Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...
- NOIP欢乐模拟赛 T1 解题报告
小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...
- SRM 595 DIV1 250
挺简单的组合把. #include <cstdio> #include <cstring> #include <iostream> #include <vec ...
- URAL 1152. False Mirrors(DP)
题目链接 理解了题意之后,就不难了..状态压缩+暴力. #include <cstring> #include <cstdio> #include <string> ...
- 开篇&TexturePacker打出图集给UGUI使用
开篇: 前段时间,网上流出了一套手游源码,本想着把服务器端搭一下,给自己认识小伙伴们调试着把这套源码学习一下.于是就买一个阿里云服务器,可是花了几天时间,就是run不起来了啊.还好网上已经有人搭出来了 ...
- bug:clang: error: no input files
1.clang: error: no input files这个问题一般是因为你删除或者移动了某一个文件,但是在你的编译资源里面( project > target > Build Pha ...
- linux vi 删除多行的方法
dd 删除一行 d$ 删除以当前字符开始的一行字符 ndd 删除以当前行开始的n行 dw 删除以当前字符开始的一个字 ndw 删除以当前字符开始的n个字 D 与d$同义 d) 删除到下一句的开始 d} ...
- mysql相似于oracle的to_char() to_date()方法
mysql日期和字符相互转换方法, date_format(date,'%Y-%m-%d') -------------->oracle中的to_char(); str_to_date(dat ...