MSMQ基础


队列类型

语法

公有队列

MachineName\QueueName

私有队列

MachineName\Private$\QueueName

日志队列

MachineName\QueueName\Journal$

机器日志队列

MachineName\Journal$

机器死信队列

MachineName\DeadLetters$

机器事物死信队列

MachineName\XactDeadLetters$

一、创建消息队列

         // 创建私有消息队列
         if  (MessageQueue.Exists( @" .\private$\MyPrivateQueue " ))
        {
            Response.Write(
" Quue is existing " );
        }
        
else
        {
            
using  (MessageQueue queue  =  MessageQueue.Create( @" .\private$\MyPrivateQueue " ))
            {
                
// 设置队列标签
                queue.Label  =   " Demo Queue " ;
                
string  str  =   " Demo Queue<br/> " ;
                
// 队列的路径
                str  +=   string .Format( " Path:{0}<br/> " , queue.Path);
                
// 队列的格式名
                str  +=   string .Format( " FormatName:{0} " , queue.FormatName);
                Response.Write(str);

            }
 

        }

 

二、 查找队列

MessageQueue类的静态方法GetPublicQueueByLabel()、GetPublicQueueByCategory()和GetPublicQueueByMachine可以搜索队列 
         // 根据主机名获取所有的私有队列
         foreach  (MessageQueue queue  in  MessageQueue.GetPrivateQueuesByMachine( " . " ))
        {
            Response.Write(queue.Path 
+   " <br/> " );
 

        }

           

        //使用格式名打开私有队列         

       MessageQueue queue =new MessageQueue(@"FormatName:DIRECT=OS:pc-20110625xzam\private$\MyNewPrivateQueue");

       Response.Write(queue.Path); 

         

三、发送消息

         // 发送消息
         try
        {
            
if  ( ! MessageQueue.Exists( @" .\private$\myPrivateQueue " ))
            {
                MessageQueue.Create(
@" .\private$\myPrivateQueue " );
            }
            MessageQueue queue 
=   new  MessageQueue( @" .\private$\myPrivateQueue " );
            queue.Send(
" Sample Message " " Label " );

        }
        
catch  (MessageQueueException ex)
        {
            Response.Write(ex.Message);

        } 

        

四、读取消息

1、Receive() 方法

 

  •  读取消息,可是使用MessageQueue类,通过Receive()方法可以读取一个消息,再将该消息从队列中删除
  •  如果消息使用的优先级不同,就读优先级最高的消息,读取优先级相同的消息时,第一个读取的消息不一定是第一个读取的
  •  消息格式化器有三个:XmlMessageFormatter,BinaryMessageFormatter,ActiveXMessageFormatter
  •  XmlMessageFormatter是默认的格式化器,它使XML串行化对象,在读取消息时,必须把要读取的消息的对象的类型传递给格式化器的构造函数    
         MessageQueue queue = new MessageQueue(@".\private$\myPrivateQueue");
        queue.Formatter  =   new  XmlMessageFormatter( new   string [] {  " System.String "  });
        Message receiveMessage 
=  queue.Receive();
        Response.Write(receiveMessage.Body);

 

2、枚举消息 

(1)MessageQueue类实现了IEnumerable接口,实现了该接口就表示不从队列中删除消息,所以可以在foreach中使用,并且消息不会从队列中删除

        MessageQueue queue  =   new  MessageQueue( @" .\private$\myPrivateQueue " );
        queue.Formatter 
=   new  XmlMessageFormatter( new   string [] {  " System.String "  });
        
foreach  (Message receiveMessage  in  queue)
        {
            Response.Write(receiveMessage.Body);

        } 

(2) MessageEnumerator类

IEnumerable IEnumerator区别
1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator object)。
2、IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。
3、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator object就是一个iterator。
  •  MessageEnumerator类,该类实现了接口IEnumerator
  •  RemoveCurrent()方法可以从枚举器的当前光标位置删除信息
  •  MoveNext()方法,可以逐个访问消息,该方法重载为把一个时间段作为参数,这也是使用枚举器的主要优点
  •  IEnumerator接口定义的Current属性返回消息的一个引用 
        MessageQueue queue  =   new  MessageQueue( @" .\private$\myPrivateQueue " );
        queue.Formatter 
=   new  XmlMessageFormatter( new   string [] {  " System.String " });
        
using  (MessageEnumerator me  =  queue.GetMessageEnumerator())
        {
            
while  (me.MoveNext(TimeSpan.FromMinutes( 30 )))
            {
                Message message 
=  me.Current;
                Response.Write(message.Body);
            }
        }

 

五、

 

你可能感兴趣的:(基础)