C#高效实现MSMQ进程间通信,web核心—Tomcat的下载/配置/mavenweb项目创建/通过mavenweb插件运行web项目。
·
开源 C# 快速开发(十七):进程间通信——消息队列 (MSMQ)
消息队列 (MSMQ) 是 Windows 平台提供的一种进程间通信 (IPC) 机制,允许分布式应用程序通过异步消息传递进行通信。在 C# 中,可以通过 System.Messaging 命名空间高效地使用 MSMQ 实现可靠的消息传递。
MSMQ 的基本概念
MSMQ 是一种存储转发机制,消息发送方将消息发送至队列,接收方从队列中获取消息。这种机制特别适用于松耦合的系统,可以应对网络延迟、服务器宕机等场景。
-
队列类型:
- 公共队列:在 Active Directory 中注册,可跨机器访问。
- 私有队列:仅在本地机器可见,适用于单机通信。
- 系统队列:用于 MSMQ 内部管理,如日志或死信队列。
-
消息传递模式:
- 持久性消息:存储在磁盘,确保消息不丢失。
- 非持久性消息:仅存在于内存,性能更高但易丢失。
在 C# 中使用 MSMQ
1. 安装 MSMQ 功能
在 Windows 系统中,需确保 MSMQ 服务已启用:
- 打开“启用或关闭 Windows 功能”。
- 勾选 Microsoft Message Queue (MSMQ) 服务器,安装后重启系统。
2. 创建并管理队列
使用 System.Messaging 命名空间创建、删除队列:
using System.Messaging;
// 检查队列是否存在,不存在则创建
string queuePath = @".\Private$\MyTestQueue";
if (!MessageQueue.Exists(queuePath))
{
MessageQueue.Create(queuePath);
}
else
{
Console.WriteLine("队列已存在");
}
// 删除队列
if (MessageQueue.Exists(queuePath))
{
MessageQueue.Delete(queuePath);
}
3. 发送消息
使用 MessageQueue.Send 方法发送消息:
MessageQueue queue = new MessageQueue(queuePath);
queue.Send("这是一条测试消息", "测试标签");
4. 接收消息
接收消息时有两种方式:
- 同步接收:
Receive方法会阻塞直至消息到达。 - 异步接收:通过事件回调处理消息。
同步接收示例:
MessageQueue queue = new MessageQueue(queuePath);
queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });
Message message = queue.Receive();
Console.WriteLine(message.Body.ToString());
异步接收示例:
queue.ReceiveCompleted += (sender, e) =>
{
Message message = queue.EndReceive(e.AsyncResult);
Console.WriteLine(message.Body.ToString());
queue.BeginReceive();
};
queue.BeginReceive();
// 确保程序不会立即退出,等待消息
Console.ReadLine();
5. 消息格式化
默认情况下,MSMQ 使用二进制格式化器,但可通过 XmlMessageFormatter 或 BinaryMessageFormatter 自定义:
queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });
6. 事务支持
MSMQ 支持事务性消息,确保消息的原子性:
using (MessageQueueTransaction transaction = new MessageQueueTransaction())
{
transaction.Begin();
queue.Send("事务测试消息", transaction);
transaction.Commit();
}
实际应用场景
-
异步任务处理:
- Web 应用可将耗时任务(如邮件发送)通过 MSMQ 发送至后台服务处理,提高响应速度。
-
分布式系统通信:
- 多个微服务可通过 MSMQ 传递数据,避免直接依赖。
-
离线消息缓冲:
- 在网络不稳定时,消息可暂存队列,待恢复后再投递。
性能优化与注意事项
- 队列清理:定期清理无用队列,避免磁盘占用过高。
- 错误处理:捕获
MessageQueueException处理队列访问异常。 - 消息大小限制:默认 MSMQ 消息最大 4MB,需合理设计数据拆分。
替代方案
若需跨平台支持,可考虑:
- RabbitMQ:基于 AMQP 协议,支持多种语言。
- Azure Service Bus:适用于云环境的消息队列服务。
MSMQ 在 Windows 环境下仍是一种高效、稳定的进程间通信方案,特别适合本地或内网分布式应用。
更多推荐



所有评论(0)