如何在 C# 中使用 MSMQ

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

關于招聘新人

時間真的是過得很快﹐自2004年接手web團隊﹐一晃都2年多了﹐在這期間﹐目睹了單位上發生的一些事情﹐感受頗多﹐在這里﹐把有關"招收新人員"一些經驗﹐總結如下﹐備以后參考﹕(1) 選一個合適的人 在一個團隊中﹐最忌諱那種"心高氣傲"之人﹐這種人如果…

卡屏java_Java drawImage到屏幕上一卡一卡的

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public void run() {while(T1.isAlive()true){try {Thread.sleep(FrameRate);} catch (InterruptedException e) {}if(this.NowIndex{this.NowIndex;}else{this.NowIndex0;}}}这是一组图片的线程NowIndex代表这组线程需要读取的那张…

从内存中释放Selenium chromedriver.exe

背景我设置了一个c#代码来运行Selenium chromedriver.exe.在运行结束时&#xff0c;我有browser.close()来关闭实例。&#xff08;browser webdriver.Chrome()&#xff09;我相信它应该从内存中释放chromedriver.exe&#xff08;我在Windows 7上&#xff09;。但是每次运行后&…

防止多次提交的几个比较

1、利用Session(viewState是不行的&#xff0c;viewState要回传才能读到数据)如果有个数据包类StockBillMP&#xff0c;则设定privateStockBillMP M_saveobj { get { return (Session["saveobj"] null)?null:(StockBi…

java 代码块 作用_Java核心(三):代码块的作用

Java中用{ }括起来的代码段就是代码块,他分为如下几种类型位置作用局部代码块在方法当中使用&#xff0c;作用是控制变量的生命周期。局部代码块的变量&#xff0c;只能在代码块内部使用&#xff0c;在执行结束后会被Java回收构造代码块在类的成员位置使用。在每次执行构造方法…

【日常排雷】 .Net core 生产环境appsetting读取失败

关键词System.ArgumentNullException: String reference not set to an instance of a String. (Parameter s)1.问题出现某年某月某日&#xff0c;把webapi开发完了&#xff0c;也通过了swagger进行了单元测试。dotnet build dotnet publish -o publish dotnet .\publish\xx.We…

男人必看得5个故事

男人必看得5个故事 1、 情况不同 一只小猪、一只绵羊和一头乳牛&#xff0c;被关在同一个畜栏里。有一次&#xff0c;牧人捉住小猪&#xff0c;牠大声号叫&#xff0c;猛烈地抗拒。绵羊和乳牛讨厌牠的号叫&#xff0c;便说&#xff1a;「他常常捉我们&#xff0c;我们并不大呼小…

java1.8 lambda表达式_java1.8之Lambda表达式

行为参数化为了应对多变的需求&#xff0c;难道我们就要因为客户每提出一个需求&#xff0c;我们就要写一个方法去实现吗&#xff1f;显然这样做很冗余&#xff0c;而且维护性大大降低&#xff0c;这说明代码的设计不够好。好在已经有前人帮我们提出了行为参数化思想(即将一段代…

ABP vNext 自动注入,暗藏天坑如斯

导言我们在使用ABP vNext框架时&#xff0c;都知道该框架为我们实现了自动依赖注入(实现自动注入需要在项目里面创建Module类&#xff0c;并且将Module类上的DependsOn到相应的启动Module类或调用Module类&#xff0c;这步很关键)自动注入示例只要我们实现如下接口&#xff1a;…

Community Server系列之四:Ajax在CS2.0中的应用1

Ajax技术在时下很热门&#xff0c;当然在CS2.0中也不例外的运用到了此技术&#xff0c;CS2中没有使用任何第三方Ajax控件&#xff0c;这就给我们提供一个研究Ajax机理的好地方&#xff0c;现介绍一下在CS2中Ajax的一些简单应用&#xff0c;并分析应用的原理。 我想要研究此技术…

为什么人和人的差距这么大?

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份这是一篇去年写的旧文&#xff0c;不少读者从这篇文章中获得了一些方法和力量&#xff0c;于是再分享下&#xff1a;工作和生活中不光要埋头干活&#xff0c;还要抬头看天。思考总结方法论是提升认知的必备途…

github可以传java吗_如何在github上传本地项目代码(新手使用)----亲测使用

首先你要在github上申请一个账号然后你要下载一个git工具进入官网直接下载就行&#xff0c;下载完成后进入github首页&#xff0c;点击新项目new repository(新建)&#xff0c;如下图所示&#xff1a;然后进入如下页面&#xff0c;主要填写红色圈起来的几个部分&#xff0c;如下…

英才评测 个人性格倾向 IT知识

网址http://www.01hr.com/testcenter/index_ccw.jsp?id9203&clid1135238483687 转载于:https://www.cnblogs.com/sutengcn/archive/2006/05/06/392790.html

【One by One系列】IdentityServer4(一)OAuth2.0与OpenID Connect 1.0

在微服务场景中&#xff0c;身份认证通常是集中处理&#xff0c;这也是有别于单体应用一把梭哈的模式&#xff0c;其中&#xff0c;在微软微服务白皮书中&#xff0c;提供了两种身份认证模式&#xff1a;网关&#xff0c;没错&#xff0c;原话是If youre using an API Gateway,…

php多进程 写入文件_PHP多进程中使用file_put_contents安全吗?

TL;DRLinux下&#xff0c;PHP多进程使用 file_put_contents() 方法记录日志时&#xff0c;使用追加模式(FILE_APPEND)&#xff0c;简短的日志内容不会重叠&#xff0c;即能安全的记录日志内容。file_put_contents() 使用 write() 系统调用实现数据的写入&#xff0c;write() 系…

虚拟机概述[转贴]

[摘要]描述什么是虚拟机、及运行在各种平台上的多种多样的虚拟机软件PXE2写著 你一定接触过各种各样的虚拟机&#xff0c;Vmware&#xff0c;VirtualPC&#xff0c;甚至JVM或是VBRunDLL&#xff0c;等等等等&#xff0c;在数字的信息世界里虚拟和现实是如此的难解难分。你一定接…

ABP vNext分布式事件总线RabbitMQ注意事项

[https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接)&#xff0c;基本使用可直接阅读官方文档&#xff0c;云怀不重复造轮子&#xff0c;只做官方未提到但重要的说明关键配置说明关键配置类&#xff1a;AbpRabbitMqE…

window运行php环境,Windows环境下使用phpstudy搭建php运行环境

首先在百度百科上对于phpstudy的定义是一个PHP调试环境的程序集成包。该程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer,一次性安装&#xff0c;无须配置即可使用&#xff0c;是非常方便、好用的PHP调试环境&#xff0c;该程序不仅包括PHP调试环境&#xff0c;还包括了…

去除代码行号的一个小程序(控制台版本)

清风竹林发布了去除代码行号的一个小程序,确实方便大家收集一些文章代码,但个人认为象这样的小东东&#xff0c;要使广大网友能拿来就用&#xff0c;用.Net 2.0做成WinForm&#xff0c;有点贵族化了&#xff0c;于是动手整出个平民化的控制台版本&#xff0c;可以清除指定的文本…

. NET5实战千万高并发项目,性能吊打JAVA,C#排名万年老五,有望逆袭!

“秒杀活动”“抢红包”“微博热搜”“12306抢票”“共享单车拉新”等都是高并发的典型业务场景&#xff0c;那么如何解决这些业务场景背后的难点问题呢&#xff1f;秒杀系统中&#xff0c;QPS达到10万/s时&#xff0c;如何定位并解决业务瓶颈&#xff1f;明星婚恋话题不断引爆…