消息队列MSMQ

2018-07-24  本文已影响34人  高调的小丑

首先是将windows的MQ功能开启。


新建两个windows应用程序,用来测试消息传输


发送消息的代码

        MessageQueue mq;
        private void Form1_Load(object sender, EventArgs e)
        {
            //新建消息循环队列或连接到已有的消息队列
            string path = ".\\private$\\killf";
            if (MessageQueue.Exists(path))
            {
                mq = new MessageQueue(path);
            }
            else
            {
                mq = MessageQueue.Create(path);
            }

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
        }

        private void button1_Click(object sender, EventArgs e)
        {
            mq.Send(textBox1.Text);
        }

用于接收的代码

        MessageQueue mq;
        private void Form1_Load(object sender, EventArgs e)
        {
            //新建消息循环队列或连接到已有的消息队列
            string path = ".\\private$\\killf";
            if (MessageQueue.Exists(path))
            {
                mq = new MessageQueue(path);
            }
            else
            {
                mq = MessageQueue.Create(path);
            }

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            mq.ReceiveCompleted += mq_ReceiveCompleted;
            mq.BeginReceive();
        }

        void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            //throw new NotImplementedException();
            MessageQueue mq = (MessageQueue)sender;
            System.Messaging.Message m = mq.EndReceive(e.AsyncResult);

            //处理消息
            string str = m.Body.ToString();
            this.textBox1.Invoke(new Action<string>(ShowMsg), str);

            //继续下一条消息
            mq.BeginReceive();
        }
        private void ShowMsg(string msg)
        {
            this.textBox1.Text = this.textBox1.Text + msg + Environment.NewLine;
            return;
        }

测试完成!


OK.png

1、命名空间 using System.Messaging;
2、默认存储路径 C:\WINDOWS\system32\msmq\storage
3、创建消息队列:

MessageQueue mq = MessageQueue.Create(@".\Private$\LeeMSMQ");

4、删除队列:

MessageQueue.Delete(@".\Private$\LeeMSMQ");

5、发送消息:

MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ");
            mq.Send("sayhello1,hello msmq!", "sayhello1");
            mq.Send("sayhello2,hello msmq!", "sayhello2");

6、接受并删除消息:

MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ")
Message msg = mq.Receive();//引用的队列中可用的第一条消息

7、接受但不删除消息:

Message msg = mq.Peek();

8、删除所有消息:

Message msg = mq.Purge();

9、返回本机所有私有队列的消息

      //返回本机所有私有队列的消息
             foreach (MessageQueue mq in MessageQueue.GetPrivateQueuesByMachine("liyanping"))
            {
                mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                Message[] msg = mq.GetAllMessages();
                foreach (Message m in msg)
                {
                    Console.WriteLine("label:{0},body:{1}", m.Label, m.Body);
                }
            }

10、返回指定队列的消息

            if (MessageQueue.Exists(@".\Private$\LeeMSMQ"))//判断私有消息是否存在
            {
                using (MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ"))
                {
                    mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//设置消息队列格式化器
                    Message msg = mq.Receive();//接收消息
                    Console.WriteLine("label:{0},body: {1}", msg.Label, msg.Body);//输出消息
                    MessageQueue.Delete(@".\Private$\LeeMSMQ");
                }
            } 
上一篇下一篇

猜你喜欢

热点阅读