一  、MSMQ概述

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

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

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

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

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

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

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

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

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

二   、安装启用服务

1.  控制面板 >> 程序 >> 打开或关闭Windows功能 >> Microsoft Message Queue(MSMQ)服务器,勾选消息队列服务所有选项

2.  我的电脑 >> 管理 >> 服务和应用程序 >> 消息队列  。出现消息队列则说明安装成功

三  、MSMQ编码应用举例

以下是几个常用查询代码

请先添加using System.Messaging;命名空间

1.   查询队列是否存在,值得注意的是,当访问远端消息时MSMQ不支持MessageQueue.Exists(string )等方法,所以建议直接使用new MessageQueue(QueuePath)查询

/// <summary>
/// 查询队列是否存在
/// </summary>
/// <returns></returns>
public bool QueueExist()
{
bool queueExist = false;
try
{
queueExist = MessageQueue.Exists(QueuePath);
}
catch//远端访问不支持exist,所有直接查询
{
queueExist = true;
}
return queueExist;
}

2.  创建队列,传入存储对象和注解标签

/// <summary>
/// 创建队列
/// </summary>
/// <param name="queueObj">发送到队列的对象</param>
/// <param name="queueLable">该发送队列对象的标签</param>
public void CreateQueue(object queueObj, string queueLable = "")
{
try
{
using (MessageQueue queue = QueueExist() ? new MessageQueue(QueuePath) : MessageQueue.Create(QueuePath))
{
queue.Label = queueLable;
if (queue.CanWrite)
{
queue.Send(queueObj);
}
} }
catch (Exception ex)
{
throw new Exception("Error to Create Queue!", ex);
}
}

3.   获取队列第一条数据,并删除数据

/// <summary>
/// 获取队列第一条数据,并删除数据
/// </summary>
/// <param name="queueTypes"></param>
/// <returns></returns>
public object ReceiveOneQueue(Type[] queueTypes)
{
object result = null;
if (QueueExist())
{
using (MessageQueue mq = new MessageQueue(QueuePath))
{
try
{
// 设置消息队列的格式化器
mq.Formatter = new XmlMessageFormatter(queueTypes); if (mq.CanRead)
{
Message oneMessage = mq.Receive(); // 获得消息队列中第一条消息
result = oneMessage.Body;
}
}
catch (Exception ex)
{
throw new Exception("Error to query Queue!", ex);
}
}
}
return result;
}

4.  获取队列第一条数据,但保留数据

/// <summary>
/// 获取队列第一条数据,但保留数据
/// </summary>
/// <param name="queueTypes"></param>
/// <returns></returns>
public object PeekOneQueue(Type[] queueTypes)
{
object result = null;
if (QueueExist())
{
using (MessageQueue mq = new MessageQueue(QueuePath))
{
try
{
// 设置消息队列的格式化器
mq.Formatter = new XmlMessageFormatter(queueTypes); if (mq.CanRead)
{
Message oneMessage = mq.Peek(); // 获得消息队列中第一条消息
result = oneMessage.Body;
}
}
catch (Exception ex)
{
throw new Exception("Error to query Queue!", ex);
}
}
}
return result;
}

5.  调用程序

 //远程连接请使用FormatName:DIRECT=ftp://222.10.xx.xx/msmq/Private$/msmqpath
MSMQUtil.MSMQHelper msmqHelper = new MSMQUtil.MSMQHelper(@".\Private$\msmqpath");
msmqHelper.CreateQueue("first msmq", "first lable");
msmqHelper.CreateQueue(new msmqtestclass() { age = , name = "xieyang", contents = new List<string>() { "my leg", "my head" } });
var formater1 = new Type[] { typeof(string) };
object obj1 = msmqHelper.ReceiveOneQueue(formater1); var formater2 = new Type[] { typeof(msmqtestclass) };
object obj2 = msmqHelper.ReceiveOneQueue(formater2);

最常见错误: 当链接为远程时,需要给everyone读写权限。

完整代码

链接:https://pan.baidu.com/s/1lviQzuvGJFuXTqv4_7GmtA
提取码:vvxy

参考:https://docs.microsoft.com/zh-cn/dotnet/api/system.messaging?view=netframework-4.7.2

https://www.cnblogs.com/zhili/p/MSMQ.html

常见错误:https://www.cnblogs.com/mq0036/p/3695038.html

MSMQ菜鸟教程的更多相关文章

  1. 菜鸟教程 Python100例 之实例29

    学习编程的路,走得好艰辛... 为了巩固基础知识,把菜鸟教程网上的实例拿来练习.. 在做到实例29时,看了网站给出的代码,觉得可以加强一下功能,不由得动了一下脑筋,如下: 原文题目: 题目:给一个不多 ...

  2. 【转载】jQuery Validate 菜鸟教程

    文章1:http://www.runoob.com/jquery/jquery-plugin-validate.html          (jQuery Validate 菜鸟教程)

  3. Http状态码大全(来自菜鸟教程)

    HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基于TCP/IP通信 ...

  4. 菜鸟教程之学习Shell script笔记(下)

    菜鸟教程Shell script学习笔记(下) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...

  5. 菜鸟教程之学习Shell script笔记(中)

    菜鸟教程Shell script学习笔记(中) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...

  6. 菜鸟教程之学习Shell script笔记(上)

    菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...

  7. C语言经典例题(菜鸟教程100例)

    学习c语言基础,怎么能少了菜鸟教程上的100道例题呢,这里整理一下每道题的链接,希望大家能享受学习的乐趣 1,有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 2,企业发放 ...

  8. 学习笔记之HTML 教程 | 菜鸟教程

    HTML 教程 | 菜鸟教程 http://www.runoob.com/html/html-tutorial.html 菜鸟教程在线编辑器 http://www.runoob.com/try/try ...

  9. JavaScript 实例 | w3cschool菜鸟教程

    JavaScript 实例 | w3cschool菜鸟教程 http://www.w3cschool.cc/js/js-examples.html

随机推荐

  1. 三道习题(1、将单词表中由相同字母组成的单词归成一类,每类单词按照单词的首字母排序,并按 #每类中第一个单词字典序由大到小排列输出各个类别。 #输入格式:按字典序由小到大输入若干个单词,每个单词占一行,以end结束输入。)

    #coding=gbk ''' 1.将单词表中由相同字母组成的单词归成一类,每类单词按照单词的首字母排序,并按 #每类中第一个单词字典序由大到小排列输出各个类别. #输入格式:按字典序由小到大输入若干 ...

  2. 解决 分布式事务中HRESULT:0x8004D025 错误

    最近在开发分布式事务的过程中,碰到 该伙伴事务管理器已经禁止了它对远程/网络事务的支持. (异常来自 HRESULT:0x8004D025)的错误. 后来检查到,原来是数据库服务器的MSDTC 没有设 ...

  3. git ls-files 列出被修改或者被删除的文件

    git ls-files 列出被修改或者被删除的文件 git ls-files -m -d

  4. 关键字local、global和内置函数【locals、globals】

    每个函数都有着自已的命名空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量.每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数.类.其它导入的模块.模 ...

  5. python自动华 (十一)

    Python自动化 [第十一篇]:Python进阶-RabbitMQ队列/Memcached/Redis  本节内容: RabbitMQ队列 Memcached Redis 1.  RabbitMQ ...

  6. mybatis-plus 相关

    这里有几个很全的教程: https://www.cnblogs.com/okong/p/mybatis-plus-guide-one.html mybtais-plus学习--BaseMapper提供 ...

  7. [Luogu P1230]智力大冲浪

    题目链接 这道题,贪就对了. 先按照价值排序,从大到小.当前考虑的的就先放到尽可能晚的时间点,为其他的创造机会,如果这一个的所有可用时间段都被占据,就只能扣钱了. #include<fstrea ...

  8. 彻底搞懂prototype和__proto__

    prototype是函数特有的属性,是Function的静态属性:__proto__是对象特有的属性. 因为函数本身是一种对象,所以函数既有prototype属性也有__proto__属性. 当函数使 ...

  9. synchronized和AtomicXXX效率比较

    在Java中,i++和++i都是xian线程不安全的,如果要用十个线程累加一个资源,就会出现错误.synchronized和Atomic是实现线程安全常用方法.而二者效率问题孰优孰劣?本着规律符合任意 ...

  10. 添加tag

    创建tag git tag -a V1 -m 'release 1' 创建了本地一个版本v1,同时添加注释 release 1 查看tag git tag 显示注释 git show V1 本地tag ...