如何在C#中使用MSMQ
MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列。作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可伸缩、线程安全、简单和使用方便的队列,同时为你提供了在Windows数据库中持久化消息的机会。MSDN指出:“消息队列(MSMQ)技术使在不同时间运行的应用程序能够在可能暂时离线的异构网络和系统之间进行通信。应用程序将消息发送到队列并从队列读取消息。”
在使用MSMQ时,通常有两个不同的应用程序——发送者和接收者。当消息由发送者发送时,接收者应用程序不需要处于执行状态——消息实际上存储在由主机操作系统维护的队列中,当接收方应用程序需要它们时,这些消息就会脱离队列。
创建一个队列
你可以通过控制面板上的“打开或关闭Windows功能”选项打开你系统中的MSMQ。在系统中安装了MSMQ之后,创建队列就很简单了。只要到“我的电脑”,右击并选择管理。在“计算机管理”窗口中,你可以从“消息队列”节点创建一个新队列。还可以通过编程方式创建队列。
C#中的MSMQ
要使用MSMQ,你需要引入System.Messaging命名空间。要以编程方式创建队列,需要利用MessageQueue类的Create方法。下面的代码片段说明了这一点。
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();
}
}
下面的代码清单演示了如何使用c#处理存储在消息队列中的消息。
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;
}
接下来,可以调用ReadQueue方法来检索存储在消息队列中的消息,如下面的代码片段所示。
string path = @".\Private$\IDG";
List<string> lstMessages = ReadQueue(path);
你还可以在消息队列中存储对象。例如,假设你需要将日志消息存储到队列中。日志消息存储在LogMessage类的一个实例中,该实例包含与日志消息的详细信息相关的必要属性。下面是LogMessage类——我只使用了两个属性来使它变得简单。
public class LogMessage
{
public string MessageText { get; set; }
public DateTime MessageTime { get; set; }
}
你应该修改LogMessage类,以包含其他必要的属性,例如,消息严重性等。下面的方法说明了如何将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();
}
}
下面的代码片段说明了如何创建LogMessage类的实例,向其填充数据,然后调用SendMessage方法来存储在消息队列中创建的实例。
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的更多相关文章
- 二、消息队列之如何在C#中使用RabbitMQ(转载)
二.消息队列之如何在C#中使用RabbitMQ 1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源 ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- 如何正确的使用json?如何在.Net中使用json?
什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...
- [原创]如何在Parcelable中使用泛型
[原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...
- 如何在springMVC 中对REST服务使用mockmvc 做测试
如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试 spring 集成测试中对mock 的集成实在是太棒了!但 ...
- 如何在tomcat中如何部署java EE项目
如何在tomcat中如何部署java EE项目 1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法.2.在tomcat安 ...
- 【转】我是如何在SQLServer中处理每天四亿三千万记录的
原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...
随机推荐
- centos8中的MySQL卸载和安装
centos8中的MySQL卸载和安装 前言 前几天在自己的服务器上安装了一个NDB集群[而且还没有成功] 放弃治疗后用一台没有mysql的服务器实现了单机版本的集群. 本来以为这事到这就结束了,结果 ...
- C# Wpf 文件保存对话框
C# Wpf库中无文件保存对话框,需引用winform,引用winform后多处提示引用不明确,将winform引用改别名. // 引用winform,改别名 using Forms = System ...
- Core3.0读取appsetting.json中的配置参数
前言 方法很多,下面的例子也是从百度上搜索到的,原文链接已经找不到了. 方法1 1.添加NovelSetting节点,写入相关的配置信息 2.创建类,字段与上面的配置一致 3.StartUp.cs中获 ...
- 爱普生 L4160 Serveies 网络打印机配置(问题解决)
一.爱普生网络打印机固定IP地址 用网络打印机过程中,偶尔会出现打印机脱机的状况,大多数原因是打印机的IP地址在路由器重启过后重新分配了IP地址导致的.此时,为了减少不必要的麻烦就需要固定打印机的IP ...
- MVC 微信网页授权 获取 OpenId
最近开发微信公众平台,做下记录,以前也开发过,这次开发又给忘了,搞了半天,还是做个笔记为好. 注意框架为MVC 开发微信公众平台.场景为,在模板页中获取用户openid,想要进行验证的页面,集成模板页 ...
- springMVC搭建分布式框架
https://www.cnblogs.com/lr393993507/p/7652717.html https://www.cnblogs.com/Tpf386/p/10987931.html
- Java将List中的实体按照某个字段进行分组的算法
public void test() { List<User> list = new ArrayList<>(); //User 实体 测试用 String id,name; ...
- 图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应
作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络 ...
- 新下载的Chrome 不能用,设置搜索引擎,谷歌浏览器不能用,chrome浏览器不能用,google chrome 不能用
新下载的chrome默认搜索引擎 是google搜索,而google搜索引擎在国内是不能使用的,要设置为 百度或.360.搜狗搜索引擎才能使用. 设置方法如下: 1.打开 Chrome. 2.点击右上 ...
- JDBC数据库删除
1 //删除操作: 2 3 if(conn != null){ 4 String temps="2"; 5 conn.setAutoCommit(false); 6 Prepare ...