• C#实现消息队列MSMQ


    消息队列:是在消息传输过程中保存消息的容器。MSMQ是Microsoft的消息处理技术,运行平台为Microsoft Windows操作系统。它分为用户队列和系统队列。在用户队列中又分为专用队列:不在整个网络中发布,仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的用户程序访问。
      关于消息队列的安装,可以通过控制面板->添加/删除程序->添加/删除 Windows 组件。

      选择“消息队列”并单击“详细信息”。

      如果运行的是 Windows Server 2003,请选择“应用程序服务器”来访问消息队列。

      确保包括“MSMQ HTTP 支持”在内的所有选项在详细信息页上均处于选定状态。

      单击“确定”退出详细信息页,然后单击“下一步”。完成安装。

      

      这里我们通过实例来说明如何创建队列、发送消息、接收消息。

    创建队列:
    创建本机队列:@".\private$\队列名称"
    创建远程队列:@"FormatName:DIRECT=TCP:远程机器IP\private$\队列名称"

     实例化消息队列 
            /// <summary>
            /// 实例化消息队列
            /// </summary>
            /// <param name="isLocalComputer">是否为本机</param>
            public MSMQManager(bool isLocalComputer)
            {
                if (isLocalComputer)
                {
                    _path = @".\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
                }
                else
                {
                    _path = @"FormatName:DIRECT=TCP:192.168.1.125\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
                }

                _msmq = new MessageQueue(_path);
            }

          创建队列 
           /// <summary>
            /// 创建队列
            /// </summary>
            /// <param name="transactional">是否启用事务</param>
            /// <returns></returns>
            public bool Create(bool transactional)
            {
                if (MessageQueue.Exists(@".\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ")))
                {
                    return true;
                }
                else
                {
                    if (MessageQueue.Create(@".\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"), transactional) != null)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }

     发送消息队列 
            /// <summary>
            /// 发送消息队列
            /// </summary>
            /// <param name="msmqIndex">消息队列实体</param>
            /// <returns></returns>
            public void Send(MSMQIndex msmqIndex)
            {
                _msmq.Send(new Message(msmqIndex, new BinaryMessageFormatter()));
            }

     接收消息队列,删除队列 

            /// <summary>
            /// 接收消息队列,删除队列
            /// </summary>
            /// <returns></returns>
            public MSMQIndex ReceiveAndRemove()
            {
                MSMQIndex msmqIndex = null;
                _msmq.Formatter = new BinaryMessageFormatter();
                Message msg = null;
                try
                {
                    msg = _msmq.Receive(new TimeSpan(0, 0, 1));
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                if (msg != null)
                {
                    msmqIndex = msg.Body as MSMQIndex;
                }
                return msmqIndex;
            }

      以上代码大致说明了消息队列的创建、发送与接收,下面给出消息队列管理器的全部代码。

     消息队列管理器

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Messaging;
    using System.Configuration;

    namespace MSMQTest.Model
    {    
        /// <summary>
        /// 消息队列管理器
        /// </summary>
        public class MSMQManager : IDisposable
        {
            #region 字段与属性
            private MessageQueue _msmq = null;
            private string _path;
         
            private static MSMQManager _instanceLocalComputer = new MSMQManager(true);
            /// <summary>
            /// 本机消息队列实例
            /// </summary>
            public static MSMQManager InstanceLocalComputer
            {
                get { return MSMQManager._instanceLocalComputer; }
            }

            private static MSMQManager _instance = new MSMQManager(false);
            /// <summary>
            /// 远程消息队列实例
            /// </summary>
            public static MSMQManager Instance
            {
                get { return MSMQManager._instance; }
            }
            #endregion

            /// <summary>
            /// 创建队列
            /// </summary>
            /// <param name="transactional">是否启用事务</param>
            /// <returns></returns>
            public bool Create(bool transactional)
            {
                if (MessageQueue.Exists(@".\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ")))
                {
                    return true;
                }
                else
                {
                    if (MessageQueue.Create(@".\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"), transactional) != null)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }

            /// <summary>
            /// 实例化消息队列
            /// </summary>
            /// <param name="isLocalComputer">是否为本机</param>
            public MSMQManager(bool isLocalComputer)
            {
                if (isLocalComputer)
                {
                    _path = @".\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
                }
                else
                {
                    _path = @"FormatName:DIRECT=TCP:192.168.1.125\private$\"   (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
                }

                _msmq = new MessageQueue(_path);
            }


            /// <summary>
            /// 发送消息队列
            /// </summary>
            /// <param name="msmqIndex">消息队列实体</param>
            /// <returns></returns>
            public void Send(MSMQIndex msmqIndex)
            {
                _msmq.Send(new Message(msmqIndex, new BinaryMessageFormatter()));
            }

            /// <summary>
            /// 接收消息队列,删除队列
            /// </summary>
            /// <returns></returns>
            public MSMQIndex ReceiveAndRemove()
            {
                MSMQIndex msmqIndex = null;
                _msmq.Formatter = new BinaryMessageFormatter();
                Message msg = null;
                try
                {
                    msg = _msmq.Receive(new TimeSpan(0, 0, 1));
                }
                catch(Exception ex)
                {
    Console.WriteLine(ex.Message);
                }
                if (msg != null)
                {
                    msmqIndex = msg.Body as MSMQIndex;
                }
                return msmqIndex;
            }

            #region IDisposable Members

            public void Dispose()
            {
                if (_msmq != null)
                {
                    _msmq.Close();
                    _msmq.Dispose();
                    _msmq = null;
                }
            }

            #endregion
        }
    }
      此DEMO只是消息队列的简单介绍与使用,还有一些消息队列概念未加说明,比如:

      消息队列的创建方式:通过路径、通过格式名、通过标签;

      消息队列接收方式:同步与异步;

      消息队列序列化:字符、XML、二进制;

      以及是否使用事务等。

    转载http://www.cnblogs.com/miao-park/archive/2012/10/19/MSMQ.html

  • 相关阅读:
    8.02_python_lx_day14
    8.02_python_lx_day13<2>
    8.02_python_lx_day13<1>
    7.30_python_lx_day20
    7.29_python_lx_da19
    7.29_python_lx_day12
    Docker镜像
    Docker学习Ⅱ
    Docker学习Ⅰ
    2-3树的插入和删除原理
  • 原文地址:https://www.cnblogs.com/fourspace/p/2730512.html
Copyright © 2020-2023  润新知