• .net消息队列


    代码
    //顾名思义,微软消息队列(MSMQ)是一种给队列发送消息以便稍后进行处理的方法。
    //消息由一个“Producer”(生产者)应用程序发送出去,再由一个“Consumer”(消费者)应用程序返回。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Messaging;
    using System.Threading;


    namespace Model
    {
        
    public class MSM
        {
            
    private MessageQueue _messageQueue = null;

            
    private string queuePath = @".\Private$\MSMQ";

            
    private string formatType = "xml";

            
    public MessageQueue MessQueue
            {
                
    get
                {

                    
    if (_messageQueue == null)
                    {
                        
    if (MessageQueue.Exists(queuePath))
                        {
                            _messageQueue 
    = new MessageQueue(queuePath);
                        }
                        
    else
                        {
                            _messageQueue 
    = MessageQueue.Create(queuePath);
                        }
                    }


                    
    return _messageQueue;
                }
            }

            
    //发送消息
            public void SendMessage(User u)
            {

                
    if (formatType == "xml")
                {
                    MessQueue.Formatter 
    = new XmlMessageFormatter();
                }
                
    else
                {
                    MessQueue.Formatter 
    = new BinaryMessageFormatter();
                }
                Message m 
    = new Message(u);
                MessQueue.Send(m);
            }

            
    //MessageQueue.Receive得到队列中的第一条消息,并从队列中删除这条消息
            public User Recieve(int timeout)
            {

                Message m 
    = MessQueue.Receive(TimeSpan.FromSeconds(timeout));
                m.Formatter 
    = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(User) });
                
    return (User)m.Body;
            }

            
    //MessageQueue.Receive得到队列中的第一条消息,但不从队列中删除这条消息
            public User Peek(int timeout)
            {
                Message m 
    = MessQueue.Peek(TimeSpan.FromSeconds(timeout));
                m.Formatter 
    = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(User) });
                
    return (User)m.Body;
            }


            
    //最常见的情况是从队列中取出所有消息,然后一次性处理它们。这时要调用MessageQueue.GetAllMessages方法。
            public List<User> RecieveMessage()
            {
                List
    <User> users = new List<User>();
                MessQueue.Formatter 
    = new XmlMessageFormatter(new Type[] { typeof(User) });
                
    foreach (Message m in MessQueue.GetAllMessages())
                {
                    users.Add((User)m.Body);
                }
                
    return users;
            }

            
    //GetMessageEnumerator2方法只领取当前消息在本地保存,在调用MoveNext时才领取下一条消息
            public List<User> RecieveMessage2()
            {
                MessageEnumerator enumerator 
    = MessQueue.GetMessageEnumerator2();
                MessQueue.Formatter 
    = new XmlMessageFormatter(new Type[] { typeof(User) });
                List
    <User> users = new List<User>();

                
    while (enumerator.MoveNext())
                {
                    users.Add ((User)enumerator.Current.Body);
                    enumerator.RemoveCurrent();
    //删除当前消息
                }

                
    return users;
            }
        }
    }
    下面简单的测试一下:
    发送消息:
    class Send
        {
            
    static void Main(string[] args)
            {
                MessageSendTest();
                Console.ReadLine();
            }

            
    public static void MessageSendTest()
            {
                MSM msm 
    = new MSM();

                
    for (int i = 0; i < 10; i++)
                {
                    User user 
    = new User()
                    {
                        UserId 
    = i.ToString(),
                        UserName 
    = "userName:" + i.ToString(),
                        UserPwd 
    = "UserPWd:" + i.ToString(),
                        Version 
    = "Version:" + i.ToString()
                    };
                    Thread.Sleep(
    5000);
                    msm.SendMessage(user);
                    Console.WriteLine(
    "已发送:"+user.UserId + "-----" + user.UserName + "-----" + user.UserPwd + "-----" + user.Version);
      
                }

               
    //List<User> users=msm.RecieveMessage();
               
    //foreach (User user in users)
               
    //{
               
    //   Console.WriteLine("已发送:" + user.UserId + "-----" + user.UserName + "-----" + user.UserPwd + "-----" + user.Version);
               
    //}

            }

        }

    接收消息:
     
    class Recieve
        {
            
    static void Main(string[] args)
            {
                
    while (true)
                {
                    GetMessage();
                }
            }

            
    public static void GetMessage()
            {
                MSM msm 
    = new MSM();
                User user 
    = msm.Recieve(5);
                Console.WriteLine(
    "已接收:"+user.UserId + "-----" + user.UserName + "-----" + user.UserPwd + "-----" + user.Version);
            }
        }

    结果是每个5秒发送一个队列,Reciew就马上得到该队列。

  • 相关阅读:
    转:C/C++基本数据类型所占字节数
    转:为什么C++中空类和空结构体大小为1?
    转:内存字节对齐
    转:100层楼扔两个鸡蛋的问题
    移动互联网
    辗转相除法
    斐波那契数列
    error C2783: 无法为“T”推导 模板 参数
    创新工场和海豚浏览器宣讲会启示
    转:快速排序的一个小问题没想明白,求助各位
  • 原文地址:https://www.cnblogs.com/hubcarl/p/1734927.html
Copyright © 2020-2023  润新知