博主喝口茶,一毛也是爱

收缩

MSMQ消息队列用法

261 人阅读
分类:

MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。


一. 安装消息队列

  1.打开控制面板 > 2.选择 ‘程序和功能’> 3.选择 ‘打开或关闭Windows功能’>  4.选择  Microsoft Meeage Queue 安装就可以了。

     

  安装好以后,就可以来看看这个队列的基本操作了。打开 ‘计算机管理’ 我们可以看到安装的消息队列:

 

二. 写入数据到消息队列内

// 添加数据到消息队列
public JsonResult AddMsgData()
{
    var data = new
    {
        tNewOrderCount = 1,
        tUpdateTime = DateTime.Now
    };
    string s = JsonConvert.SerializeObject(data);
    byte[] b = Encoding.Default.GetBytes(s);
    pushMsgQueue(b);
    return Json(new DataResult { success = true, msg = "添加成功" });
}

/// <summary>
/// 发送到消息队列
/// </summary>
/// <param name="b"></param>
private void pushMsgQueue(byte[] b)
{
    MessageQueue MQueue;
    if (MessageQueue.Exists(QueueOrderRemindPath))
    {
        MQueue = new MessageQueue(QueueOrderRemindPath);
    }
    else
    {
        MQueue = MessageQueue.Create(QueueOrderRemindPath);
        MQueue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl);
    }

    Message Msg = new Message(b);
    MQueue.Send(Msg);
}

三. 读取消息队列数据

private static object lockOrderRemind = new object();

/// <summary>
/// 读取消息队列消息
/// </summary>
private void LoadOrderRemindQueue()
{
    //加锁,确保同一时段一个线程进入
    lock (lockOrderRemind)
    {
        MessageQueue MQueue = null;
        if (MessageQueue.Exists(QueueOrderRemindPath))
        {
            MQueue = new MessageQueue(QueueOrderRemindPath);
        }

        if (MQueue != null)
        {
            MQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(byte[]) });
            //GetMessageEnumerator2只能向前(forward - only)。
            //对于非常庞大的队列,则应用使用这个方法,而不是 MessageQueue.GetAllMessages方法
            //MessageEnumerator enumerator = MQueue.GetMessageEnumerator2();

            //循环获取队列内数据,直到全部获取完退出
            while (!IsQueueEmpty(MQueue))
            {
                Message Msg = MQueue.Receive();   //接收消息并删除
                //MQueue.Peek();                 //接收消息不删除

                byte[] b = Msg.Body as byte[];
               
                //获取到队列数据转换成对象,队列消息会被自动清除
                string jsonData = Encoding.Default.GetString(b, 0, b.Length);

                //拿到队列数据处理自己逻辑...
            }
        }
    }
}


和博主交个朋友吧
    发布篇幅
    • 文章总数:0
    • 原创:0
    • 转载:0
    • 译文:0
    文章分类
      文章存档
      阅读排行