MSMQ 处理机制
1.基本处理方式
1.创建消息队列
2.发送消息
3.接收消息
public class MSMQ   
    {    
        /// <summary>    
        /// 通过Create方法创建使用指定路径的新消息队列    
        /// </summary>    
        /// <param name="queuePath"></param>    
        public static void Createqueue(string queuePath)    
        {    
            try    
            {    
                if (!MessageQueue.Exists(string.Format(".\\{0}", queuePath)))    
                {    
                    MessageQueue.Create(string.Format(".\\private$\\{0}", queuePath)); 
                }   
                else    
                { 
                }   
            }    
            catch (MessageQueueException e)    
            { 
            }   
        } 
        /// <summary>   
        /// 连接消息队列并发送消息到队列    
        /// </summary>    
        public static bool SendMessage<T>(string queuePath, T be)    
        {    
            bool flag = false;    
            try    
            {    
                //连接到本地的队列    
                MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath)); 
                Message myMessage = new Message();   
                myMessage.Body = be;    
                myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });    
                //发送消息到队列中 
                myQueue.Send(myMessage);   
                flag = true;    
            }    
            catch (ArgumentException e)    
            {    
                Console.WriteLine(e.Message);    
            }    
            return flag;    
        } 
        /// <summary>   
        /// 连接消息队列并发送消息到队列    
        /// </summary>    
        public static bool SendMessagelist<T>(string queuePath, List<T> be)    
        {    
            bool flag = false;    
            try    
            {    
                //连接到本地的队列    
                MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath)); 
                Message myMessage = new Message();   
                myMessage.Body = be;    
                myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });    
                //发送消息到队列中 
                myQueue.Send(myMessage);   
                flag = true;    
            }    
            catch (ArgumentException e)    
            {    
                Console.WriteLine(e.Message);    
            }    
            return flag;    
        } 
        /// <summary>   
        /// 连接消息队列并从队列中接收消息 
        /// </summary>   
        public static T ReceiveMessage<T>(string queuePath)    
        {    
            //连接到本地队列 
            MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath));   
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) }); 
            //从队列中接收消息   
            System.Messaging.Message myMessage = myQueue.Receive();    
            T be = (T)myMessage.Body; //获取消息的内容 
return be;
}
/// 连接消息队列并从队列中接收消息
        /// </summary>   
        public static List<T> ReceiveMessageList<T>(string queuePath)    
        {    
            //连接到本地队列 
            MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath));   
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(List<T>) }); 
            //从队列中接收消息   
            System.Messaging.Message myMessage = myQueue.Receive();    
            List<T> be = (List<T>)myMessage.Body; //获取消息的内容 
return be;
}
        /// <summary>   
        /// 清空指定队列的消息 
        /// </summary>   
        public static void ClearMessage(string queuePath)    
        {    
            MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath));    
            myQueue.Purge();    
        } 
        /// <summary>   
        /// 删除指定队列的消息 
        /// </summary>   
        /// <param name="queuePath"></param>    
        public static void DeleteMessage(string queuePath)    
        {    
            MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath));    
            myQueue.Purge();    
        }    
        /// <summary>    
        /// 连接队列并获取队列的全部消息    
        /// </summary>    
        public static void GetAllMessage(string queuePath)    
        {    
            //连接到本地队列 
            MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath));   
            Message[] message = myQueue.GetAllMessages();    
            XmlMessageFormatter formatter = new XmlMessageFormatter(new Type[] { typeof(string) });    
            for (int i = 0; i < message.Length; i++)    
            {    
                message[i].Formatter = formatter;    
                Console.WriteLine(message[i].Body.ToString());    
            }    
        } 
        /// <summary>   
        /// 获取指定消息队列数量    
        /// </summary>    
        /// <param name="queuePath"></param>    
        /// <returns>消息队列数量</returns>    
        public static int GetMessageCount(string queuePath)    
        {    
            //连接到本地队列 
MessageQueue myQueue = new MessageQueue(string.Format(".\\private$\\{0}", queuePath));
            Message[] message = myQueue.GetAllMessages();   
            return message.Length;    
        }    
    }
4.使用消息队列必然要用到序列化
public class WmsSerializable   
   { 
       /// <summary>   
       /// 序列化字符 
       /// </summary>   
       /// <param name="o">类的对象</param>    
       /// <returns></returns>    
       public static string Serialize<T>(T o)    
       {    
           Type type =  typeof(T) ;    
           // 创建一个xml序列化对象 
System.Xml.Serialization.XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(type);
           // 创建一个内存流对象   
           MemoryStream memoryStream = new MemoryStream();    
           // 将传入的systemMeg转换成一个内存流,保存在xsl序列化对象中    
           xml.Serialize(memoryStream, o);    
           return Convert.ToBase64String(memoryStream.ToArray());    
       } 
       /// <summary>   
       /// 反序列化类 
       /// </summary>   
       /// <param name="messageString">要序列化的字符</param>    
       /// <param name="objectType">类的对象</param>    
       /// <returns></returns>    
       public static T DeSerialize<T>(string messageString)    
       {    
           Type type = typeof(T);    
           // 创建一个xml序列化对象 
           System.Xml.Serialization.XmlSerializer xsl = new System.Xml.Serialization.XmlSerializer(type);   
           // 序列化一个内存流    
           MemoryStream ms = new MemoryStream(Convert.FromBase64String(messageString));    
           return (T)xsl.Deserialize(ms);    
       } 
       /// <summary>   
       /// 序列化字符 
       /// </summary>   
       /// <param name="o">类的对象</param>    
       /// <returns></returns>    
       public static string SerializeList<T>(T o)    
       {    
           Type type = typeof(T);    
           // 创建一个xml序列化对象 
System.Xml.Serialization.XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(type);
           // 创建一个内存流对象   
           MemoryStream memoryStream = new MemoryStream();    
           // 将传入的systemMeg转换成一个内存流,保存在xsl序列化对象中    
           xml.Serialize(memoryStream, o);    
           return Convert.ToBase64String(memoryStream.ToArray());    
       } 
       /// <summary>   
       /// 反序列化类 
       /// </summary>   
       /// <param name="messageString">要序列化的字符</param>    
       /// <param name="objectType">类的对象</param>    
       /// <returns></returns>    
       public static List<T> DeSerializeList<T>(string messageString)    
       {    
           Type type = typeof(T);    
           // 创建一个xml序列化对象 
           System.Xml.Serialization.XmlSerializer xsl = new System.Xml.Serialization.XmlSerializer(type);   
           // 序列化一个内存流    
           MemoryStream ms = new MemoryStream(Convert.FromBase64String(messageString));    
           return (List<T>)xsl.Deserialize(ms);    
       }    
   }
5.这样创建的消息队列并不能保存到硬盘中,如何才能进一步处理消息队列呢?
关于消息的加密、路由等等特性,需要有配置Active Directory的消息队列服务器。    
为了避免存放消息队列的计算机重新启动而丢失消息,可以通过设置消息对象的Recoverable属性为true,在消息传递过程中将消息保存到磁盘上来保证消息的传递,默认为false
 
                     
                    
                 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号