乐趣区

关于.net:如何在-C-中使用-MSMQ

MSMQ 是 Windows 自带的音讯队列,它提供了在多机器,多零碎之间实现牢靠的音讯互联,MSMQ 反对可扩大,线程平安,应用简略等强势个性。

MSDN 上说:音讯队列技术使不同时刻运行的程序能够在异构网络或者异构零碎中进行交互,即便对方不在线也没有关系,应用程序仅关怀如何从队列中读取或写入音讯。

通常和 MSMQ 交互的应用程序有两种角色,发布者 消费者,发布者应用程序将音讯发送后,不要求消费者应用程序放弃备战状态,实际上这个音讯是被送到 操作系统保护的 音讯队列 中,供后续某个时刻须要此音讯的 接收者应用程序 生产。

创立队列

能够在 Windows 控制面板上通过 Turn Windows features on or off 选项进行 MSMQ 的装置,一旦 MSMQ 装置好之后,接下来就能够创立队列了,你能够在 Computer Management 上的 Message Queuing 节点上可视化创立,也能够通过编程的形式创立,本篇就来探讨前面这种形式。

编程创立 MSMQ

先援用 System.Messaging 命名空间,而后应用 MessageQueue.Create 创立音讯队列,上面的代码展现了如何实现。


MessageQueue.Create(@".\Private$\IDG");

队列创立好之后,接下来就能够向其发送 message 了,如下代码所示:


MessageQueue.Create(@".\Private$\IDG");    

messageQueue = new MessageQueue(@".\Private$\IDG");

messageQueue.Label = "This is a test queue.";

messageQueue.Send("This is a test message.", "IDG");

有一点要留神,在发送音讯之前,你须要查看队列是否存在,如果不存在,你必须要先创立一个,如果存在则不用再创立,上面的代码展现了如何去实现。


        static void Main(string[] args)
        {
            MessageQueue messageQueue = null;
            string description = "This is a test queue.";
            string message = "This is a test message.";
            string path = @".\Private$\IDG";
            try
            {if (MessageQueue.Exists(path))
                {messageQueue = new MessageQueue(path);
                    messageQueue.Label = description;
                }
                else
                {MessageQueue.Create(path);
                    messageQueue = new MessageQueue(path);
                    messageQueue.Label = description;
                }
                messageQueue.Send(message);
            }
            catch
            {throw;}
            finally
            {messageQueue.Dispose();
            }
        }

下面是音讯的发送,接下来再看一下如何从 音讯队列 中获取音讯,代码如下:


        private static List<string> ReadQueue(string path)
        {List<string> lstMessages = new List<string>();
            using (MessageQueue messageQueue = new MessageQueue(path))
            {System.Messaging.Message[] messages = messageQueue.GetAllMessages();
                foreach (System.Messaging.Message message in messages)
                {message.Formatter = new XmlMessageFormatter(new String[] {"System.String, mscorlib"});
                    string msg = message.Body.ToString();
                    lstMessages.Add(msg);
                }
            }
            return lstMessages;
        }

下面的案例演示的是向音讯队列中塞入 string 类型,其实还能够塞入 model,为了简略起见,我定义了一个只有两个属性的 LogMessage 类,如下代码所示:


    public class LogMessage
    {public string MessageText { get; set;}
        public DateTime MessageTime {get; set;}
    }

上面的代码展现了如何将 logMessage 实例送入到 音讯队列 中。


        private static void SendMessage(string queueName, LogMessage msg)
        {
            MessageQueue messageQueue = null;

            if (!MessageQueue.Exists(queueName)) messageQueue = MessageQueue.Create(queueName);

            else messageQueue = new MessageQueue(queueName);

            try
            {messageQueue.Formatter = new XmlMessageFormatter(new Type[] {typeof(LogMessage) });
                messageQueue.Send(msg);
            }
            catch
            {//Write code here to do the necessary error handling.}
            finally
            {messageQueue.Close();
            }
        }

接下来看看 SendMessage 办法是如何对 LogMessage 进行填充数据的,如下代码所示:


        LogMessage msg = new LogMessage()
        {
            MessageText = "This is a test message.",
            MessageTime = DateTime.Now
        };

        SendMessage(@".\Private$\IDGLog", msg);

而后再看看看如何从 音讯队列 中读取 LogMessage。


        private static LogMessage ReceiveMessage(string queueName)
        {if (!MessageQueue.Exists(queueName)) return null;
            MessageQueue messageQueue = new MessageQueue(queueName);
            LogMessage logMessage = null;

            try
            {messageQueue.Formatter = new XmlMessageFormatter(new Type[] {typeof(LogMessage) });
                logMessage = (LogMessage)messageQueue.Receive().Body;}
            catch { }
            finally
            {messageQueue.Close();
            }
            return logMessage;
        }

译文链接:https://www.infoworld.com/art…

更多高质量干货:参见我的 GitHub: csharptranslate

退出移动版