C# 消息队列-MSMQ


  MQ是一种消息中间件技术,因此它可以支持多种类型的语言开发,同时也是跨平台的通讯机制,也就是说MQ支持将信息转化为XML或者JSon等类型的数据存储到消息队列中,而后可使用不一样的语言来处理消息队列中的消息,这样就很容易的作到了信息的通讯,同时也为信息的通讯起到了缓冲的做用,常常会在金融项目中使用这种通讯机制。windows

 

1 MQ安装

       打开控制面板-“添加/删除程序” – “添加/删除 windows组件”步骤安装MSMQ。服务器

       MSMQ能够安装为工做组模式或域模式。若是安装程序没有找到一台运行提供目录服务的消息队列的服务器,则只能够安装为工做组模式,此计算机上的“消息队列”只支持建立专用队列和建立与其余运行“消息队列”的计算机的直接链接。架构

 

2配置MSMQ

      打开计算机管理 – 服务和应用程序-消息队列,在专用队列下建立MSMQDemo队列分布式

3 MQ Demo

        在.NET中微软对MQ作了封装,把MQ有关的信息封装到了MessageQueue类中,在开发的时候能够直接引用该类,对队列中的消息作操做。
        在操做消息前首先要为消息指定存储的队列,因此在建立消息时首先要在服务器上建立一个队列,而后为MessageQueue指定消息队列的路径。spa

 

接下来演示发送数据和接收数据代码的编写方法,下面的示例中使用的是私有的队列类型来演示的操做。首先从发送数据开始,在发送数据时首先要建立咱们的MQ,而后根据MQ的地址建立相应的队列,调用队列的send方法将数据信息发送到队列中,以下代码:code

private void SendMailMQ(List<string> addressStr, string account, string password, string host, string port, string title, string message, long TenantId)
        {
            try
            {
                //声明MQ路径
                var ekQ = ".\\Private$\\mailqueue";
                //不存在路径时建立
                if (!MessageQueue.Exists(ekQ))
                    MessageQueue.Create(ekQ);

                //建立实例化
                var queue = new MessageQueue(ekQ);

                foreach (var item in addressStr)
                {
                    var encryptStr = JsonConvert.SerializeObject(
                        new
                        {
                            MailMsg = new
                            {
                                account = account,
                                password = password,
                                host = host,
                                port = port,
                                title = title,
                                message = message,
                                address = item
                            },
                            TenantId = TenantId
                        });
                    queue.Send(encryptStr);
                    SaveLog(encryptStr);
                }
            }
            catch (Exception ex)
            {
                SaveLog("异常:" + ex.Message + ex.StackTrace);
            }
        }

 

 运行上面的代码后MQ将会把消息发送到相应的队列中,这里采用的是专有队列因此会将消息发送到本地的队列中,这样在消息的发送方和调用方之间就构建了一个相互松耦合的桥梁,它就是消息队列,orm

接下来演示如何接收消息队列。中间件

 

public class MailThread
    {
        MessageQueue queue;
        public void StartMailMQ()
        {
            string ekQ = ".\\Private$\\mailqueue";
            //不存在路径时建立
            if (!MessageQueue.Exists(ekQ))
                MessageQueue.Create(ekQ);

            queue = new MessageQueue(ekQ);

            queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
            while (!MessageQueue.Exists(ekQ))
            {
                Console.WriteLine("未找到mailqueue队列");
            }
            queue.ReceiveCompleted += Queue_ReceiveCompleted;
            queue.BeginReceive(MessageQueue.InfiniteTimeout);
        }

        private void Queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            var m = e.Message;
            var deceivedMsg = m.Body.ToString();
            Console.WriteLine("接收邮件消息内容:{0} \n--------------", (string)m.Body);
            if (!string.IsNullOrEmpty(deceivedMsg))
                new DispatchMessager().SendMail(deceivedMsg);
            
            queue.BeginReceive(MessageQueue.InfiniteTimeout);
        }
    }

尾声


         MQ是一种企业服务的消息中间节技术,这种技术经常伴随着企业服务总线相互使用,构成了企业分布式开发的一部分,若是考虑到消息的发送和传送之间是能够相互不联系的而且须要分布式架构,则能够考虑使用MQ作消息的中间价技术,MQ的功能已经足够开发使用。blog

相关文章
相关标签/搜索