欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.NET消息队列的使用

程序员文章站 2022-04-04 20:56:21
...

.NET消息队列的使用

在项目中使用消息队列,可以对消息提供方和消息消费方进行解耦,提高系统的灵活性和可拓展性。其中,企业级的消息队列中间件有IBM WebSphere MQ、Tibco EMS、HornetQ等等。微软的Windows系统也自带了消息队列的功能,可以在“启动或关闭Windows功能”中开启:

.NET消息队列的使用

开启后在服务中查看消息队列服务是否运行:
.NET消息队列的使用

接下来是简单的消息队列操作:

    using System;
    using System.Messaging;

    namespace MQ
    {
        class MQHelper
        {
            /// <summary>
            /// 创建一个消息队列
            /// </summary>
            /// <param name="name">消息队列的名称</param>
            /// <returns>是否创建成功</returns>
            public static bool CreateNewMQ(string name)
            {
                if (!MessageQueue.Exists(".\\private$\\" + name))
                {

                    MessageQueue mq = MessageQueue.Create(".\\private$\\" + name);
                    mq.Label = "private$\\" + name;
                    return true;
                }
                else
                {
                    return false;
                }
            }
            /// <summary>
            /// 删除一个消息队列
            /// </summary>
            /// <param name="name">消息队列的名称</param>
            /// <returns>是否创建成功</returns>
            public static bool DeleteNewMQ(string name)
            {
                if (!MessageQueue.Exists(".\\private$\\" + name))
                {
                    MessageQueue.Delete(".\\private$\\" + name);
                    return true;
                }
                else
                {
                    return false;
                }
            }
            /// <summary>
            /// 发送消息到指定消息队列
            /// </summary>
            /// <param name="mq_name">消息队列名称</param>
            /// <param name="msg_lable">消息头</param>
            /// <param name="msg_body">消息体</param>
            public static void SendMessage(string mq_name, string msg_lable, string msg_body)
            {
                MessageQueue mq = new MessageQueue(@".\private$\" + mq_name);
                Message message = new Message();
                message.Label = msg_lable;
                message.Body = msg_body;
                mq.Send(message);
            }
            /// <summary>
            /// 从指定消息队列获取第一条消息
            /// </summary>
            /// <param name="mq_name">消息队列名称</param>
            /// <returns>Message</returns>
            public static Message ReceiveMessage(string mq_name)
            {
                MessageQueue mq = new MessageQueue(@".\private$\" + mq_name);
                if (mq.GetAllMessages().Length > 0)
                {
                    Message message = mq.Receive();
                    if (message != null)
                    {
                        message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
                    }
                    return message;
                }
                else
                {
                    return null;
                }
            }
        }
    }

在WPF中调用写好的方法:

using System;
using System.Timers;
using System.Windows;

namespace MQ
{
    public partial class MainWindow : Window
    {
        private static readonly string mq_name = "textMQ";
        private Timer timer;

        public MainWindow()
        {
            InitializeComponent();
            MQHelper.CreateNewMQ(mq_name);
            timer = new Timer();
            timer.Interval = 1000;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(flash);
            timer.Start();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string mq_content = inputText.Text;
            //发送一条消息到消息队列
            MQHelper.SendMessage(mq_name, "test", mq_content);
        }

        //循环获取消息队列中的消息,并展现到TextBox中
        private void flash(object sender, ElapsedEventArgs e)
        {
            var message = MQHelper.ReceiveMessage(mq_name);
            if (message != null)
            {
                Action hide = delegate()
                {
                    outputText.Text += message.Id + " " + message.Label + " " + message.Body + "\n";
                };
                this.Dispatcher.BeginInvoke(hide);
            }
        }
    }
}

运行结果:

.NET消息队列的使用

相关标签: .net