现在的位置: 首页 > 综合 > 正文

MSMQ 微软消息队列服务

2014年12月11日 ⁄ 综合 ⁄ 共 3298字 ⁄ 字号 评论关闭

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 文件夹中被创建。

抱歉!评论已关闭.