一、MSMQ简介

MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式、松散连接的消息通讯应用程序的开发工具。

MSMQ与XML Web Services和.Net Remoting一样,是一种分布式开发技术。但是在使用XML Web Services或.Net Remoting组件时,Client端需要和Server端实时交换信息,Server需要保持联机。MSMQ则可以在Server离线的情况下工作,将Message临时保存在Client端的消息队列中,以后联机时再发送到Server端处理。

MSMQ的实现原理

消息的发送者把自己想要发送的信息放入一个容器,然后把它保存到一个系统公用空间的消息队列中,本地或异地的消息接收程序再从该队列中取出发给它的消息进行处理。

消息队列是一个公用存储空间,它可以存在于内存中或物理文件中,因此,消息以两种方式发送,即快递方式和可恢复模式。MSMQ机制类似QQ消息传递机制。下图演示了MSMQ的实现原理。


安装

默认情况下安装操作系统是不安装消息队列的,你可以在控制面板中找到添加/删除程序,然后选择添加/删除Windows组件一项,然后选择应用程序服务器,双击它进入详细资料中选择消息队列一项进行安装。

如果服务没有自动启动,需要启动服务:

两个概念

一个是消息Message:Message是通信双方需要传递的消息,它可以是文本、图片、视频等。消息包含发送和接收者的标识,只有指定的用户才能取得消息。

另一个是队列Queue:用来保存消息的存储空间,消息对列分为3类:

  1. 公共队列:MachineName\QueueName
    能被别的机器所访问,如果你的多个项目中用到消息队列,那么你可以把队列定义为公共队列
  2. 专用队列:MachineName\Private$\QueueName
    只针对于本机的程序才可以调用的队列,有些情况下为了安全起见定义为私有队列。
  3. 日志队列:MachineName\QueueName\Journal$

MicroSoft.Message.Queue常用的方法:

  • Create方法:创建使用指定路径的新消息队列。
  • Delete方法:删除现有的消息队列。
  • Existe方法:查看指定消息队列是否存在。
  • GetPublicQueues方法:在“消息队列”网络中定位消息队列。
  • Send方法:发送消息到指定的消息队列。
  • GetAllMessages()方法:得到队列中的所有消息。
  • Receive/BeginReceive方法:检索指定消息队列中最前面的消息,并将其从该队列中移除
  • Peek/BeginPeek方法:查看某个特定队列中的消息队列,但不从该队列中移出消息。。
  • Purge方法:清空指定队列的消息。

二、服务端

首先,实现服务器端。创建一个控制台项目,添加System.Messaging引用,因为消息队列的类全部封装在System.Messaging.dll程序集里。

服务器端代码需要注意的是,公共队列只能在域环境中创建,如果个人电脑没有加入域环境,则不能创建公共队列。

if (!MessageQueue.Exists(@".\MYFIRSTMSMQ"))
{
using (MessageQueue mq = MessageQueue.Create(@".\MYFIRSTMSMQ"))//创建一个公共消息队列
{
mq.Label = "myFirstMSMQ";
Console.WriteLine("已经创建了一个公共队列{0}", mq.Label);
Console.WriteLine("公共队列{0}的路径为{1}", mq.Label, mq.Path);
mq.Send("MSMQ 消息", "今天又学到个有趣的知识");
}
}
foreach (MessageQueue mq in MessageQueue.GetPublicQueues())//获取所有公共队列,发送消息
{
mq.Send("发送公共消息队列" + DateTime.Now.ToLongTimeString(), "今天又学到个有趣的知识");
Console.WriteLine("公有消息已经送到{0}", mq.Path);
} if (!MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))
{
using (MessageQueue mq = MessageQueue.Create(@".\Private$\MYFIRSTMSMQ"))//创建一个私有消息队列
{
mq.Label = "myFirstPrivateMSMQ";
Console.WriteLine("已经创建了一个私有队列{0}", mq.Label);
Console.WriteLine("私有队列{0}的路径为{1}", mq.Label, mq.Path);
mq.Send("MSMQ 私有队列消息" + "今天又学到个有趣的知识");
}
} if (MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))
{
MessageQueue mq = new MessageQueue(@".\Private$\MYFIRSTMSMQ");//找到私有队列,发送消息 mq.Send("发送私有消息队列" + DateTime.Now.ToLongTimeString() + "今天又学到个有趣的知识");
Console.WriteLine("私有消息已经送到{0}", mq.Path);
}

三、客户端

服务器端把消息发送到共享的消息队列中,然后,客户端从这个共享的消息队列中取出消息进行处理。

if (MessageQueue.Exists(@".\MYFIRSTMSMQ"))// 获取公共消息队列
{
using (MessageQueue mq = new MessageQueue(@".\MYFIRSTMSMQ"))//创建消息队列对象
{
mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//设置消息队列的格式化器,还有BinaryMessageFormatter,ActiveXMessageFormatter等
foreach (Message msg in mq.GetAllMessages())
{
Console.WriteLine("接收到的消息是:{0}", msg.Body);
}
Message firstmsg = mq.Receive();
Console.WriteLine("收到的第一条消息为:{0}", firstmsg.Body);
}
} if (MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))// 获取私有消息队列
{
using (MessageQueue mq = new MessageQueue(@".\Private$\MYFIRSTMSMQ"))
{
//....
}
}

WCF之MSMQ消息队列的更多相关文章

  1. 跟我一起学WCF(1)——MSMQ消息队列

    一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能 ...

  2. 微软MSMQ消息队列的使用

    首先在windows系统中安装MSMQ 一.MSMQ交互 开发基于消息的应用程序从队列开始.MSMQ包含四种队列类型: 外发队列:消息发送到目的地之前,用它来临时存储消息. 公共队列:在主动目录中公布 ...

  3. 【转】MSMQ消息队列安装

    一.Windows 7安装.管理消息队列1.安装消息队列   执行用户必须要有本地 Administrators 组中的成员身份,或等效身份.   具体步骤:    开始—>控制面板—>程 ...

  4. MSMQ消息队列安装

    一.Windows 7安装.管理消息队列1.安装消息队列   执行用户必须要有本地 Administrators 组中的成员身份,或等效身份.   具体步骤:    开始—>控制面板—>程 ...

  5. 【6】.net msmq消息队列实例

    1.msmq消息队列windows环境安装 控制面板---->程序和功能---->启用或关闭Windows程序---->Microsoft Message Queue(MSMQ)服务 ...

  6. WCF分布式开发必备知识(1):MSMQ消息队列

    本章我们来了解下MSMQ的基本概念和开发过程.MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一 ...

  7. WCF MSMQ消息队列与离线操作

    消息队列类型 公共队列:整个网络中的节点都可以访问到 专用队列:本地计算机,知道路径者可以访问 管理队列:包含确认在给定“消息队列”网络中的发送的消息回执的消息 相应队列:返回给发送程序的相应信息

  8. MSMQ消息队列 用法

    引言 接下来的三篇文章是讨论有关企业分布式开发的文章,这三篇文章筹划了很长时间,文章的技术并不算新,但是文章中使用到的技术都是经过笔者研究实践后总结的,正所谓站在巨人的肩膀上,笔者并不是巨人,但也希望 ...

  9. 在WCF中使用消息队列

    在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...

随机推荐

  1. go 的基本数据类型和结构

    // 变量命名方式当用两个或两个以上的单词命名变量时,可以将除第一个单词以外的所有单词的首字母大写package 命名方式全部小写不加 _ 布尔类型:bool整型:int8.byte.int16.in ...

  2. SORRY_FOR_MY_LIFE

    人生最大的痛苦不在于真正的痛苦, 而是没有确切的人生方向, 我们总是想的很多, 但是最后才发现, 我们一直拿自己的弱点与别人的长处竞争, 因为,我们总是得不到自己想要的, 但是最多的是对于没有目标的人 ...

  3. eNSP配置基本与高级访问控制列表

    首先我们进行基本的acl控制 拓扑图如下所示 首先我们对路由器进行基本ip配置 并在路由器上设置ospf协议 添加相邻的网段 在路由器上运行了ospf协议后 使用display ip route-ta ...

  4. pandas对时间列分组求diff遇到的问题

    例子: df = pd.DataFrame() df['A'] = [1, 1, 2] df['B'] = [datetime.date(2018, 1, 2), datetime.date(2018 ...

  5. certutil在传输payload中的新奇技巧

    好久没更新博客了,最近在实习的过程中还是见识到不少东西. 不多说,直接开始正文. 首先说一下certutil在渗透测试中用到的特别多,下载文件,计算hash,以及base64编码等等. 在这里介绍ba ...

  6. java当中JDBC当中请给出一个sql server的stored procedure例子

    3.sql server的stored procedure例子: import java.sql.*;public class StoredProc0 {public static void main ...

  7. dede5.7-修改自定义表单

    最近刚好帮客户做一个网站,需要用到dede的自定义表单功能.可是有个这样的需求,就是当表单提交成功后,要返回一个自定义页面的提示功能!可能是觉得dede自带的提示太low的原因吧!(一不小心又黑了下)

  8. python 使用API调用和风天气获取天气情况并保存

    第一步.注册注册免费API和阅读技术文档: 注册地址:https://console.heweather.com 注册完成后,激活登录后,新建应用 .新建key KEY名称 密钥ID 密钥 类型下载城 ...

  9. EAFP vs LBYL

    EAFP vs LBYL 检查数据可以让程序更健壮,用术语来说就是防御性编程.检查数据的时候,有EAFP和LBYL两种不同的编程风格,具体的意思如下: LBYL: Look Before You Le ...

  10. PAT(B) 1062 最简分数(Java)

    题目链接:1062 最简分数 (20 point(s)) 题目描述 一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0.最简分数是指分子和分母没有公约数的分数表示形式. 现给定两个不相等的正 ...