首页 技术 正文
技术 2022年11月21日
0 收藏 810 点赞 4,904 浏览 2292 个字

最近项目用到消息队列,找资料学习了下。把学习的结果 分享出来

首先说一下,消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能,并不是.Net提供的。

MSDN上的解释如下:

Message Queuing (MSMQ) technology enables applications running at different times to communicate across heterogeneous networks and systems that may be temporarily offline.

Applications send messages to queues and read messages from queues.

The following illustration shows how a queue can hold messages that are generated by multiple sending applications and read by multiple receiving applications.

消息队列(MSMQ)技术使得运行于不同时间的应用程序能够在各种各样的网络和可能暂时脱机的系统之间进行通信。

应用程序将消息发送到队列,并从队列中读取消息。

下图演示了消息队列如何保存由多个发送应用程序生成的消息,并被多个接收应用程序读取。

C#使用消息队列(MSMQ)

消息一旦发送到队列中,便会一直存在,即使发送的应用程序已经关闭。

MSMQ服务默认是关闭的,(Window7及以上操作系统)按以下方式打开

1、打开运行,输入”OptionalFeatures”,钩上Microsoft Message Queue(MSMQ)服务器。

C#使用消息队列(MSMQ)

(Windows Server 2008R2及以上)按以下方式打开

2、打开运行,输入”appwiz.cpl”,在任务列表中选择“打开或关闭Windows功能”

C#使用消息队列(MSMQ)

然后在”添加角色”中选择消息队列

C#使用消息队列(MSMQ)

消息队列分为以下几种,每种队列的路径表示形式如下:

公用队列 MachineName\QueueName

专用队列 MachineName\Private$\QueueName

日记队列 MachineName\QueueName\Journal$

计算机日记队列 MachineName\Journal$

计算机死信队列 MachineName\Deadletter$

计算机事务性死信队列 MachineName\XactDeadletter$

这里的MachineName可以用 “.”代替,代表当前计算机

需要先引用System.Messaging.dll

创建消息队列

            //消息队列路径
string path = ".\\Private$\\myQueue";
MessageQueue queue;
//如果存在指定路径的消息队列
if(MessageQueue.Exists(path))
{
//获取这个消息队列
queue = new MessageQueue(path);
}
else
{
//不存在,就创建一个新的,并获取这个消息队列对象
queue = MessageQueue.Create(path);
}

发送字符串消息

                     System.Messaging.Message msg = new System.Messaging.Message();
//内容
msg.Body = "Hello World";
//指定格式化程序
msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
queue.Send(msg);

发送消息的时候要指定格式化程序,如果不指定,格式化程序将默认为XmlMessageFormatter(使用基于 XSD 架构定义的 XML 格式来接收和发送消息。)

接收字符串消息

               //接收到的消息对象
System.Messaging.Message msg = queue.Receive();
//指定格式化程序
msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
//接收到的内容
string str = msg.Body.ToString();

 发送二进制消息(如图像)

引用 System.Drawing.dll

             System.Drawing.Image image = System.Drawing.Bitmap.FromFile("a.jpg");
Message message = new Message(image, new BinaryMessageFormatter());
queue.Send(message);

接收二进制消息

             System.Messaging.Message message = queue.Receive();
System.Drawing.Bitmap image= (System.Drawing.Bitmap)message.Body;
image.Save("a.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

获取消息队列的消息的数量 

 int num  = queue.GetAllMessages().Length;

清空消息队列

 queue.Purge();

以图形化的方式查看消息队列中的消息

运行输入 compmgmt.msc,打开计算机管理,选择[服务和应用程序-消息队列]。只要消息队列中的消息没有被接收,就可以在这里查看得到。

C#使用消息队列(MSMQ)

示例程序:

https://files.cnblogs.com/files/zhaotianff/MSMQ_Demo.zip

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,031
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,148
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,860