MSMQ

http://tech.ddvip.com/2009-01/1232014079105979.html

一、MSMQ介绍和安装消息队列

使用消息队列的优点:稳定、消息优先级、脱机能力以及安全性。

消息队列分为用户创建的队列(专用队列private)和系统队列(public).

专用队列是不在 Active Directory 中发布而只在包含它们的本地计算机上显示的队列.

在域环境中,公用队列是 Active Directory 中发布的队列,因此通过整个Windows Server家族林进行复制。请注意,只复制这些队列的属性,而不是实际队列本身或队列内容。倘若用户有足够的权限访问适用的队列对象,则林中任意一台计算机都有可能访问有关公用队列的有关信息。一般说来,林中任何一个可访问ActiveDirectory 并对给定公用队列具有发送权限的用户,都可以发送消息给公用队列。

关于如何安装 MSMQ,请参看 http://blog.csdn.net/akey307/article/details/6933632

二、创建、删除和管理队列

要开发MSMQ程序就必须学习一个很重要的类(MessageQueue),该类位于名称空间System.Messageing下。其中有几个常用的方法必须掌握:

  --Create方法:创建使用指定路径的新消息队列。

  --Delete方法:删除现有的消息队列。

  --Exists方法:查看指定消息队列是否存在。

  --GetAllMessages()方法:得到队列中的所有消息。

  --GetPublicQueues方法:在“消息队列”网络中定位消息队列。

  --Peek/BeginPeek方法:查看某个特定队列中的消息队列,但不从该队列中移出消息。

  --Receive/BeginReceive方法:检索指定消息队列中最前面的消息并将其从该队列中移除。

  --Send方法:发送消息到指定的消息队列。

--Purge方法:清空指定队列的消息。

三、发送和序列化消息

MSMQ消息队列中定义的消息由一个主体(body)和若干属性构成。消息的主体可以由文本、二进制构成,根据需要还可以被加密。在MSMQ 中消息的大小不能够超过4MB。发送消息是通过Send方法来完成的,需要一个Message参数。

  1、发送消息:

  步骤:连接队列-->指定消息格式-->提供要发送的数据(主体)-->调用Send()方法将消息发送出去。详细见后面的示例程序。

  2、序列化消息:

  消息序列化可以通过.NETFramework附带的三个预定义格式化程序来完成:

  -- XMLMessageFormatter对象----MessageQueue组件的默认格式化程序设置。

  -- BinaryMessageFormatter对象;

  -- ActiveXMessageFormatter对象;

  由于后两者格式化后的消息通常不能为人阅读,所以我们经常用到的是XMLMessageFormatter对象。该对象构造方法有三种重载:

  publicXmlMessageFormatter();

  publicXmlMessageFormatter(string[] targetTypeNames);

  publicXmlMessageFormatter(Type[] targetTypes);

示例:

 

 

        static void Main(string[] args)
        {
            string queuename = "myqueue";
            Createqueue(queuename);
            //SendMessage(queuename, "message content");
            ReceiveMessage(queuename);
        }

        public static void Createqueue(string queuePath)
        {
            try
            {
                if (!MessageQueue.Exists(".\\private$\\" + queuePath))
                {
                    MessageQueue.Create(".\\private$\\" + queuePath);
                }
                else
                {
                    Console.WriteLine(queuePath + "already exists");
                }
            }
            catch (MessageQueueException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        public static void SendMessage(string queuename, string msg)
        {
            MessageQueue myQueue = new MessageQueue(".\\private$\\" + queuename);
            Message myMessage = new Message();
            myMessage.Body = msg;
            myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            myQueue.Send(myMessage);
        }

        public static void ReceiveMessage(string queuename)
        { 
            MessageQueue myQueue = new MessageQueue(".\\private$\\" + queuename);
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            try
            {    
                Message myMessage = myQueue.Receive();
                string context = (string)myMessage.Body;
                Console.WriteLine("message:" + context);
            }
            catch (MessageQueueException e)
            {
                Console.WriteLine(e.Message);
            }
            catch (InvalidCastException e)
            {
                Console.WriteLine(e.Message);
            }
        }

四、事务性消息处理

  事务我想大家对这个词应该都不会陌生,在操作数据库的时候经常都会用到事务,确保操作成功,要么全部完成(成功),要么全部不完成(失败)。在MSMQ中利用事务性处理,可以确保事务中的消息按照顺序传送,只传送一次,并且从目的队列成功地被检索。

  那么,在MSMQ上使用事务性处理怎么实现呢?可以通过创建MessageQueueTransation类的实例并将其关联到MessageQueue组件的实例来执行,执行事务的Begin方法,并将其实例传递到收发方法。然后,调用Commit以将事务的更改保存到目的队列。

示例:

 

        public static void SendMessageTransaction()
        { 
            MessageQueue myQueue = new MessageQueue(".\\private$\\myQueueTrans");
            Message myMessage = new Message();
            myMessage.Body = "good afternoon";
            myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            MessageQueueTransaction myTransaction = new MessageQueueTransaction();
            myTransaction.Begin();
            myQueue.Send(myMessage, myTransaction); 
            myTransaction.Commit();
            Console.WriteLine("success!");
        }

        public static void ReceiveMessageTransaction()
        {
            MessageQueue myQueue = new MessageQueue(".\\private$\\myQueueTrans");
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            if (myQueue.Transactional)
            {
              MessageQueueTransaction myTransaction = new MessageQueueTransaction();
              myTransaction.Begin();            
              Message myMessage = myQueue.Receive(myTransaction);
              string context = myMessage.Body as string; 
              myTransaction.Commit();
              Console.WriteLine("message:" + context);
            }
        }


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值