MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。

消息Message是由通信的双方所需要传递的信息。

队列的类型主要包括一下几种:

“公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。

“专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。

“管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。

“响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。

优点:稳定、消息优先级、脱机能力以及安全性,有保障的消息传递和执行许多业务处理的可靠的防故障机制。

缺点:MSMQ不适合于Client需要Server端实时交互情况.大量请求时候,响应延迟.

.NET编程

、命名空间 using System.Messaging;

、默认存储路径 C:\WINDOWS\system32\msmq\storage

、创建消息队列:MessageQueue mq = MessageQueue.Create(@".\Private$\LeeMSMQ");

、删除队列:MessageQueue.Delete(@".\Private$\LeeMSMQ");

、发送消息:MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ");

            mq.Send("sayhello1,hello msmq!", "sayhello1");

            mq.Send("sayhello2,hello msmq!", "sayhello2");

、接受并删除消息:MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ")

            Message msg = mq.Receive();//引用的队列中可用的第一条消息

、接受但不删除消息:Message msg = mq.Peek();

、删除所有消息: Message msg = mq.Purge();

、返回本机所有私有队列的消息

      //返回本机所有私有队列的消息

             foreach (MessageQueue mq in MessageQueue.GetPrivateQueuesByMachine("liyanping"))

            {

                mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });

                Message[] msg = mq.GetAllMessages();

                foreach (Message m in msg)

                {

                    Console.WriteLine("label:{0},body:{1}", m.Label, m.Body);

                }

            }

、返回指定队列的消息

            if (MessageQueue.Exists(@".\Private$\LeeMSMQ"))//判断私有消息是否存在

            {

                using (MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ"))

                {

                    mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//设置消息队列格式化器

                    Message msg = mq.Receive();//接收消息

                    Console.WriteLine("label:{0},body: {1}", msg.Label, msg.Body);//输出消息

                    MessageQueue.Delete(@".\Private$\LeeMSMQ");

                }

            } 

下面开始消息队列实战开发

msmq客户端:包含了消息基类和发送消息send方法以及抽象的序列化数据的方法

 public class BaseMsg
{
public BaseMsg()
{
Recoverable = true;
PriorityLevel = MessagePriority.Normal;
} public bool Recoverable { get; set; } public MessagePriority PriorityLevel { get; set; }
}

然后实现client发送msmq及序列化消息的基类

  public abstract class MSMQClient<T>
where T : BaseMsg
{
private readonly string queueName;
protected MSMQClient(string appSettingName)
{
ConfigurationManager.RefreshSection("appSettings");
this.queueName = ConfigurationManager.AppSettings[appSettingName];
} /// <summary>
/// 添加短信到消息队列
/// </summary>
/// <param name="entity"></param>
public void Send(T entity)
{
if (entity == null)
throw new ArgumentNullException("发送对象不能为空");
if (string.IsNullOrEmpty(queueName))
{
throw new ArgumentNullException("队列名称不能为空");
} var msg = Serialize(entity);
var queue = new MessageQueue(queueName);
queue.Send(msg);
} protected abstract Message Serialize(T msg);
}

msmq服务端:消息处理的公共接口、Msmq监听

 public interface IMessageProcessor
{
/// <summary>
/// 处理方法
/// </summary>
/// <param name="o"></param>
void Process(object o);
}

Msmq的监听

 class MSMQListener
{
private readonly MessageQueue queue;
private readonly WaitHandle[] waiteHandle = new WaitHandle[];
public event MessageReceivedEventHandler MessageReceived; /// <summary>
/// 构造函数
/// </summary>
/// <param name="queuePath">要监控队列名称</param>
public MSMQListener(string queuePath)
{
queue = new MessageQueue(queuePath);
} /// <summary>
/// 开启监控
/// </summary>
public void Start()
{
queue.ReceiveCompleted += OnReceiveCompleted;
StartListening();
} /// <summary>
/// 关闭监控
/// </summary>
public void Stop()
{
queue.ReceiveCompleted -= OnReceiveCompleted;
StopListening();
} private void StartListening()
{
waiteHandle[] = queue.BeginReceive().AsyncWaitHandle;
} private void StopListening()
{
try
{
waiteHandle[].Close();
}
catch (Exception ex)
{
Log.Error("停止监控信号量异常1", ex);
}
} private void FireRecieveEvent(object body)
{
if (MessageReceived != null)
{
MessageReceived(this, new MessageEventArgs(body));
}
} private void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
try
{
var msg = queue.EndReceive(e.AsyncResult);
msg.Formatter = new ActiveXMessageFormatter(); StartListening(); FireRecieveEvent(msg.Body);
}
catch (Exception ex)
{
Log.Error("OnReceive Error", ex);
}
}
} /// <summary>
/// 消息接收事件
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void MessageReceivedEventHandler(object sender, MessageEventArgs args); /// <summary>
/// 消息参数
/// </summary>
public class MessageEventArgs : EventArgs
{
private readonly object messageBody; /// <summary>
/// 消息体
/// </summary>
public object MessageBody
{
get { return messageBody; }
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="body">消息体</param>
public MessageEventArgs(object body)
{
messageBody = body;
}
}

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

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

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

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

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

  3. MSMQ消息队列安装

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

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

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

  5. MSMQ消息队列 用法

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

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

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

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

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

  8. C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货)

    前言 在使用MSMQ之前,我们需要自行安装消息队列组件!(具体安装方法大家自己搜一下吧) 采用MSMQ带来的好处是:由于是异步通信,无论是发送方还是接收方都不用等待对方返回成功消息,就可以执行余下的代 ...

  9. (转)MSMQ(消息队列)

    原文作者:虔诚者    点此传送至原文   前段时间研究WCF接触到了MSMQ,所以认真的学习了一下,下面是我的笔记. 我理解的MSMQ MSMQ可以被看成一个数据储存装置,就如同数据库,只不过数据存 ...

随机推荐

  1. 利用ajax.dll类库文件实现无刷新

    使用这种方法前需要配置相应的环境 1.引用ajax.dll文件 2.在web.config添加如下: <httpHandlers>   <add path="ajax/*. ...

  2. maven项目搭建

    一.Maven简介 Maven是基于Java平台的项目构建(mvn clean install).依赖管理(中央仓库,Nexus)和项目信息管理的项目管理工具. Maven是基于项目对象模型(POM) ...

  3. u盘在电脑读不出来,但别的可以读,别的u盘在我电脑又可以识别怎么回事?

    不知道我的U盘是怎么回事,在我自己的电脑里读不出来,下面有U盘图标,但我的电脑里就是找不到U盘盘符,但把这个U盘放其他电脑上又可以读取,我以为是我的电脑的问题,但用其他的U盘插我电脑又没问题,完全摸不 ...

  4. jQuery学习笔记:attr()与prop()的区别

    先看看官方文档是如何解释两者之间功能差异的: attr() Get the value of an attribute for the first element in the set of matc ...

  5. [html] Webp、Apng图片格式

    WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间. 与JPEG相同,WebP是一种有损压缩.但谷 ...

  6. 解决淘宝sui插件后退bug

    淘宝的sui插件在微信里,第一次访问没有问题,跳转走以后,再后退回来, 插件就无法正常加载. 一下是官方给出的说法 切换到的新页面中的 js 不执行 由于浏览器安全性考虑的限制以及可能的 js 重复执 ...

  7. Android面试题整理【转载】

      面试宝典(5)  http://www.apkbus.com/android-115989-1-1.html 面试的几个回答技巧 http://blog.sina.com.cn/s/blog_ad ...

  8. OpenGL的视图变换、模型变换、投影变换、视口变换

    产生目标场景的过程类似于用照相机进行拍照: (1) 把照相机固定在三角架上,并让他对准场景从不同位置观察场景(视图变换) gluLookAt (2) 对场景进行安排,使各个物体在照片中的位置是我们所希 ...

  9. hiho1122_二分图匈牙利算法

    题目 给定一个图的N个节点和节点之间的M条边,数据保证该图可以构成一个二分图.求该二分图最大匹配. 题目链接:二分图最大匹配     首先通过染色法,将图的N个节点分成两个部分:然后通过匈牙利算法求二 ...

  10. C++ Primer 笔记(1)基础中的战斗机 输入输出 对输入不定数据处理

    今天打算再重新好好的看一遍C++ Primer这本很经典的书籍,笔记开始: 1.每个C++程序都包含一个或者多个函数,其中必须有一个main,操作系统通过调用main入手运行程序: 2.函数包括:返回 ...