MSMQ 微软消息队列服务

1) MSMQ概述

MSMQ 表示微软消息队列服务。MSMQ 可以工作在在线或者离线场景,并提供异步编程功能。如果客户端离线,MSMQ将会是最合适的方法,这是因为服务端不需要等待客户端读取数据并向服务端返回确认。


(2) 确定MSMQ 是否已经安装

通过在运行窗口执行"Services",然后找到Message Queuing. 如果没有就说明MSMQ 没有安装。

(3) MSMQ 安装

控制面板 -> 添加/删除Windows 组件 -- 选择消息队列 - 下一步

这将在你的系统中安装MSMQ,然后你可以通计算机管理来进行确认。

控制面板 -> 管理工具 -> 计算机管理 -> 服务和应用 -> 消息队列,

你将看到出栈队列,私有队列,系统队列,触发器。

(4) 消息类型

MSMQ 支持两种类型的消息: XML 和二进制, 下面的例子分别使用XML的二进制消息。

(5) MSMQ 架构(命名空间集成关系)

System
  Messaging
    Message
    MessageQueue
    MessageEnumerator
    MessageType
    MessagePriority
    ...

MSMQ 示例程序


示例 1 (使用 XmlMessageFormatter)

static void Main( string [] args)
{
     MessageQueue messageQueue = null ;
     if (MessageQueue.Exists( @".\Private$\MyQueues" ))
     {
         messageQueue = new MessageQueue( @".\Private$\MyQueues" );
         messageQueue.Label = "Testing Queue" ;
     }
     else
     {
         messageQueue = MessageQueue.Create( @".\Private$\MyQueues" );
         messageQueue.Label = "Newly Created Queue" ;
     }
     messageQueue.Send( "First ever Message is sent to MSMQ" , "Title" );
 
     messageQueue.Formatter = new XmlMessageFormatter( new string [] { "System.String" });
     //iterating the queue contents
     foreach (Message msg in messageQueue)
     {
         string readMessage = msg.Body.ToString();
         Console.WriteLine(readMessage);
         //process message
     }
     //after all processing delete the messages
     messageQueue.Purge();
     Console.ReadKey();
}


示例 2 (使用 BinaryMessageFormatter)

class Program
     {
         static void Main( string [] args)
         {
             CreateQueue( @".\Private$\ImageQueue" );
             SendMessage();
             ReceiveMessage();
             Console.ReadKey();
         }
 
         public static void CreateQueue( string queuePath)
         {
             try
             {
                 if (!MessageQueue.Exists(queuePath))
                 {
                     MessageQueue.Create(queuePath);
                 }
                 else
                 {
                     Console.WriteLine(queuePath + " already exists." );
                 }
             }
             catch (MessageQueueException e)
             {
                 Console.WriteLine(e.Message);
             }
         }
 
         //Send an image to a queue, using the BinaryMessageFormatter.
         public static void SendMessage()
         {
             try
             {
                 //Create new bitmap.
                 //File must be in \bin\debug or \bin\release folder
                 //Or a full path to its location should be given
 
                 MessageQueue myQueue = new MessageQueue( @".\Private$\ImageQueue" );
                 Image myImage = Bitmap.FromFile( "MyImage.jpg" );
                 Message msg = new Message(myImage, new BinaryMessageFormatter());
                 myQueue.Send(msg);
             }
             catch (Exception e)
             {
                 Console.WriteLine(e.Message);
             }
         }
 
         //Receive a message that contains an image.
         public static void ReceiveMessage()
         {
             try
             {
                 MessageQueue myQueue = new MessageQueue( @".\Private$\ImageQueue" );
                 myQueue.Formatter = new BinaryMessageFormatter();
                 Message myMessage = myQueue.Receive();
                 Bitmap myImage = (Bitmap)myMessage.Body;
                 myImage.Save( "NewImage.jpg" , ImageFormat.Jpeg);
             }
             catch (Exception e)
             {
                 Console.WriteLine(e.Message);
             }
         }
     }


在这个例子中我们将一个JPG图片文件存储到MSMQ队列,它可以在接下来的步骤中被接收然后使用。

运行这个程序并确认是否"NewImage.Jpg" 文件在Debug或者Release 文件夹中被创建。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MSMQ微软消息队列技术,它是一种企业服务的消息中间件技术,常与企业服务总线一起使用,是企业分布式开发的一部分。使用MQ作为消息中间件可以实现消息的发送和传递之间的解耦,适用于需要分布式架构的系统。 在MQ中,消息队列可以分为静态和动态两种类型。静态消息队列与网络相关联,分为公共队列和专用队列,公共队列是整个网络中所有站点都可以公开访问的,而专用队列只能由知道队列完整路径名或标签的应用程序访问。动态消息队列根据消息接收的操作不同,分为管理队列和响应队列,管理队列包含了整个消息线路中已经发送和接收的消息,而响应队列则用于目标程序接收和回应消息。 MQ的行为方面可以分为队列通信和消息处理两个大的方面。队列通信分为同步和异步两种类型,同步消息是指发送方在执行其他任务之前必须等待接收方的响应,而异步消息则不需要等待接收方的回应就可以继续其他操作。在消息队列交互方面,还有数据完整性、数据一致性、稳定性等类型的考虑,包括消息的优先级、脱机能力、事务性和安全性等。 使用MSMQ,开发者可以通过MessageQueue类对消息队列进行操作。在操作消息之前,需要创建一个存储消息的队列,并为MessageQueue指定消息队列的路径。主要使用的方法和属性包括队列管理和消息管理两类方法,其中队列管理方法用于创建和删除队列,消息管理方法分为同步和异步两种类型,根据实际需求确定使用的类型。主要使用的属性包括Path和Label,Path指定消息队列的地址,Label用于设置或获取队列的描述信息。 总之,MSMQ微软消息队列技术,可以实现消息的发送和传递之间的解耦,适用于企业分布式开发。它包括静态和动态消息队列,支持同步和异步消息通信,同时考虑数据完整性、数据一致性和稳定性等因素。开发者可以使用MessageQueue类对消息队列进行管理和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MSMQ消息队列 用法](https://blog.csdn.net/baihuomeng2210/article/details/101087984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值