C#使用消息队列(MSMQ)
最近项目用到消息队列,找资料学习了下。把学习的结果 分享出来
首先说一下,消息队列 (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)技术使得运行于不同时间的应用程序能够在各种各样的网络和可能暂时脱机的系统之间进行通信。
应用程序将消息发送到队列,并从队列中读取消息。
下图演示了消息队列如何保存由多个发送应用程序生成的消息,并被多个接收应用程序读取。

消息一旦发送到队列中,便会一直存在,即使发送的应用程序已经关闭。
MSMQ服务默认是关闭的,(Window7及以上操作系统)按以下方式打开
1、打开运行,输入"OptionalFeatures",钩上Microsoft Message Queue(MSMQ)服务器。

(Windows Server 2008R2及以上)按以下方式打开
2、打开运行,输入"appwiz.cpl",在任务列表中选择“打开或关闭Windows功能”

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

消息队列分为以下几种,每种队列的路径表示形式如下:
公用队列 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,打开计算机管理,选择[服务和应用程序-消息队列]。只要消息队列中的消息没有被接收,就可以在这里查看得到。

示例程序:
https://files.cnblogs.com/files/zhaotianff/MSMQ_Demo.zip
C#使用消息队列(MSMQ)的更多相关文章
- WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ
之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...
- 详解.Net消息队列(MSMQ)应用
[IT168 技术文档]MSMQ是Windows 2000.Windows XP.Windows Server 2003的一个组件,并将继续包含在Windows Vista和以后的Windows服务器 ...
- PetShop 4.0学习笔记:消息队列MSMQ
直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便 ...
- win7怎么安装消息队列 MSMQ
win7般都默认装了消息队列只需要进入 控制面板-程序-程序和功能-已安装更新-打开或关闭windows功能 勾选 Microsoft Message Queue (MSMQ)服务器 启动服务 行了: ...
- C# 消息队列-MSMQ
MQ是一种消息中间件技术,所以它能够支持多种类型的语言开发,同时也是跨平台的通信机制,也就是说MQ支持将信息转化为XML或者JSon等类型的数据存储到消息队列中,然后可以使用不同的语言来处理消息队列中 ...
- 消息队列MSMQ的使用
1.MSMQ安装 控制面板-程序和功能-打开或关闭Windows功能-Microsoft Message Queue(MSMQ)服务器,选中所有,点击确定. 2.消息队列的应用场景(转载自http:/ ...
- 消息队列msmq
http://q.cnblogs.com/q/26895/ 远程队列必须现在运程服务器上创建. 在 Windows Server 2008 上安装 IIS 服务和 MSMQ 功能后,系统会在 IIS ...
- Nginx集群之WCF分布式消息队列
目录 1 大概思路... 1 2 Nginx集群之WCF分布式消息队列... 1 3 MSMQ消息队列... 2 4 编写WCF服务.客户端程序... ...
- 消息队列_MSMQ(2)简单应用
上一篇讲了MSMQ的简单知识,那这次我们讲下简单代码的知识 附上源码: https://gitee.com/592576605/MSMQ_HANS 下面是简单的类库说明,具体咋用就看源码吧 类(Cla ...
随机推荐
- 更换python版本后出现 No module named "apt_pkg"
本文链接:https://blog.csdn.net/jaket5219999/article/details/78464310 $ sudo apt-get remove --purge pytho ...
- fingerprint for the ECDSA key
验证 fingerprint for the ECDSA key ssh-keygen -t ecdsa -f ssh_host_ecdsa_key 在B上ssh A ,得到A的fingerpr ...
- MyBatis 示例之存储过程
存储过程在数据库中比较常见,虽然大多数存储过程比较复杂,但是使用 MyBatis 调用时,用法都一样,因此我们这一节使用一个简单的存储过程来了解 MyBatis 中存储过程的使用方法. 基本准备 存储 ...
- mac PHP安装imageMagic扩展
1. 安装:ImageMagick:命令:brew install ImageMagick这种方式安装下来的imageMagic,不缺少东西,报错较少.安装之后的位置:/usr/local/Cella ...
- Flutter 中AlertDialog确认提示弹窗
import 'package:flutter/material.dart'; import 'dart:async'; enum Action { Ok, Cancel } class AlertD ...
- percona mysql5.7进程出现大量unauthenticated user解决记录
现象:http://task.chinasoft.com.wx/ 所有任务能打开,我的任务打开很慢 有些人能用,有些人不能用,数据库出现大量的未认证用户连接,连接数利用率超过70% 重启nginx,a ...
- 【笔记】第六章、Linux 的文件权限与目录配置
Linux的每个文件中,依据权限分为使用者.群组与其他人三种身份: 群组最有用的功能之一,就是当你在团队开发资源的时候,且每个账号都可以有多个群组的支持: 利用ls -l显示的文件属性中,第一个字段是 ...
- php调用webservice报错Class 'SoapClient' not found(转)
php在调用webservice时,报告如下类似错误: ( ! ) Fatal error: Class 'SoapClient' not found in E:/WebSrv/CI/system/l ...
- Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据
目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...
- HTTPS小结 、TSL、SSL
https://segmentfault.com/a/1190000009020635