MSMQ 是 Windows 自带的消息队列,它提供了在多机器,多系统之间实现可靠的消息互联,MSMQ 支持可扩展,线程安全,使用简单等强势特性。

MSDN 上说:消息队列技术使不同时刻运行的程序可以在异构网络或者异构系统中进行交互,即使对方不在线也没有关系,应用程序仅关心如何从队列中读取或写入消息。

通常和 MSMQ 交互的应用程序有两种角色,发布者消费者,发布者应用程序将消息发送后,不要求消费者应用程序保持备战状态,实际上这个消息是被送到 操作系统维护的 消息队列 中,供后续某个时刻需要此消息的 接收者应用程序 消费。

创建队列

可以在 Windows 控制面板上通过 Turn Windows features on or off 选项进行 MSMQ 的安装,一旦 MSMQ 安装好之后,接下来就可以创建队列了,你可以在 Computer Management 上的 Message Queuing 节点上可视化创建,也可以通过编程的方式创建,本篇就来讨论后面这种方式。

编程创建 MSMQ

先引用 System.Messaging 命名空间,然后使用 MessageQueue.Create 创建消息队列,下面的代码展示了如何实现。


MessageQueue.Create(@".\Private$\IDG");

队列创建好之后,接下来就可以向其发送 message 了,如下代码所示:


MessageQueue.Create(@".\Private$\IDG");    messageQueue = new MessageQueue(@".\Private$\IDG");messageQueue.Label = "This is a test queue.";messageQueue.Send("This is a test message.", "IDG");

有一点要注意,在发送消息之前,你需要检查队列是否存在,如果不存在,你必须要先创建一个,如果存在则不必再创建,下面的代码展示了如何去实现。

static void Main(string[] args){MessageQueue messageQueue = null;string description = "This is a test queue.";string message = "This is a test message.";string path = @".\Private$\IDG";try{if (MessageQueue.Exists(path)){messageQueue = new MessageQueue(path);messageQueue.Label = description;}else{MessageQueue.Create(path);messageQueue = new MessageQueue(path);messageQueue.Label = description;}messageQueue.Send(message);}catch{throw;}finally{messageQueue.Dispose();}}

上面是消息的发送,接下来再看一下如何从 消息队列 中获取消息,代码如下:

private static List<string> ReadQueue(string path){List<string> lstMessages = new List<string>();using (MessageQueue messageQueue = new MessageQueue(path)){System.Messaging.Message[] messages = messageQueue.GetAllMessages();foreach (System.Messaging.Message message in messages){message.Formatter = new XmlMessageFormatter(new String[] { "System.String, mscorlib" });string msg = message.Body.ToString();lstMessages.Add(msg);}}return lstMessages;}

上面的案例演示的是向消息队列中塞入 string 类型,其实还可以塞入 model ,为了简单起见,我定义了一个只有两个属性的 LogMessage 类,如下代码所示:

public class LogMessage{public string MessageText { get; set; }public DateTime MessageTime { get; set; }}

下面的代码展示了如何将 logMessage 实例送入到 消息队列 中。

private static void SendMessage(string queueName, LogMessage msg){MessageQueue messageQueue = null;if (!MessageQueue.Exists(queueName)) messageQueue = MessageQueue.Create(queueName);else messageQueue = new MessageQueue(queueName);try{messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });messageQueue.Send(msg);}catch{//Write code here to do the necessary error handling.}finally{messageQueue.Close();}}

接下来看看 SendMessage 方法是如何对 LogMessage 进行填充数据的,如下代码所示:

LogMessage msg = new LogMessage(){MessageText = "This is a test message.",MessageTime = DateTime.Now};SendMessage(@".\Private$\IDGLog", msg);

然后再看看看如何从 消息队列 中读取 LogMessage 。

private static LogMessage ReceiveMessage(string queueName){if (!MessageQueue.Exists(queueName)) return null;MessageQueue messageQueue = new MessageQueue(queueName);LogMessage logMessage = null;try{messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });logMessage = (LogMessage)messageQueue.Receive().Body;}catch { }finally{messageQueue.Close();}return logMessage;}

译文链接:https://www.infoworld.com/article/3060115/how-to-work-with-msmq-in-c.html

如何在 C# 中使用 MSMQ相关推荐

  1. 如何在SharePoint2010中添加Deep Zoom Image

    如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation:SharePoint 2010 Standard:SharePo ...

  2. php如何对数组进行分组,如何在PHP中对数组进行分组排序

    如何在PHP中对数组进行分组排序 发布时间:2021-01-04 16:28:51 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关如何在PHP中对数组进行分组排序,文章内容质量 ...

  3. html中section与div,如何在html中的section标签内包含div标签

    我正在制作一个完整版块的页面网站,如this.每个页面都有自己的标签.目前我的网页有4个部分(呈现不同的背景颜色).如何在html中的section标签内包含div标签 我的第一部分有一个容器div, ...

  4. html img调用js,html调用js变量 如何在html中输出js文件中的变量

    html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...

  5. 如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

    如何在OpenCV中为InRange阈值选择颜色的最佳HSV值 1. 效果图 2. 源码 参考 之前的博客介绍了如何使用Python,OpenCV通过HSV颜色空间转换检测对象,并进行轨迹追踪.怎么选 ...

  6. 管理 zabbix_Zabbix 2019 峰会丨看睿象云如何在 Zabbix 中玩转告警

    2019年11月29日-30日,为期两天的 Zabbix 大会中国站在北京盛大召开,本届 Zabbix 大会以"新视界,新技术,共建未来新监控!"为主题,为与会人员提供前沿的监控技 ...

  7. 如何在JavaScript中实现链接列表

    If you are learning data structures, a linked list is one data structure you should know. If you do ...

  8. csv文件示例_如何在R中使用数据框和CSV文件-带有示例的详细介绍

    csv文件示例 Welcome! If you want to start diving into data science and statistics, then data frames, CSV ...

  9. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾

    regexp 好汉字符串 by Catherine Vassant (aka Codingk8) 由凯瑟琳·瓦森(Catherine Vassant)(又名Codingk8) 如何在JavaScrip ...

最新文章

  1. 程序员发长贴讲述真实某多多:薪水高,普调高,环境差,厕所少!强制去买菜,全行业竞业,穿拖鞋会被暴力执法!...
  2. 为啥led灯用一年后暗了很多_嫌原车的卤素“蜡烛灯”太暗,想换掉,该选氙气灯还是LED灯?...
  3. vscodepython使用教程_技术教程_如何用vscode写python程序- 中国it教程网
  4. Nginx+Tomcat web站(Linux)   动静站分离
  5. maven-maven使用-P参数打包不同环境
  6. Docker--一门值得你学习的手艺
  7. 2.1 JavaMailSender发送邮件
  8. 程序员开发什么小程序挣钱_作为程序员赚钱的5种独特方式
  9. redis面试题(一)赋答案
  10. Centos7下安装Sentry22.1.0,接入LDAP
  11. C语言常见的错误及解决办法,避坑笔记
  12. LeetCode-House_Robber
  13. 程序员学习算法,有这样几本基础书
  14. java bigpipe_BigPipe的正确使用姿势
  15. 回测框架之计算收益模块
  16. Codeforces Round #738 (Div. 2) A--D1
  17. oculusquest2第三方游戏应用下载安装方法 (附百度云资源)安装教程VR一体机分享 Quest2游戏推荐安装教程2021
  18. Jeston TX1配置Caffe教程-从裸板开始
  19. OpenCV——对比度增强
  20. 一种通过刷写替换boot的方法

热门文章

  1. BZOJ3511: 土地划分
  2. 第一次作业--四则运算题目生成程序
  3. 自定义View 进度条
  4. OPENCV图像变换-1
  5. win32下Socket编程(1)
  6. 如何使用ARM创建Teams Bot所需要的Azure资源
  7. YouTube键盘快捷键:速查表
  8. 定时插座动一下就断_使用插座定时器在某些时候自动将您的Amazon Echo静音
  9. 计算机复试比重低的学校,又有985院校发布调剂信息,这个34所降低复试比重!...
  10. Mybatis中jdbcType和javaType的对应关系