C# 消息队列-MSMQ


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

 

1 MQ安装

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

       MSMQ可以安装为工作组模式或域模式。如果安装程序没有找到一台运行提供目录服务的消息队列的服务器,则只可以安装为工作组模式,此计算机上的“消息队列”只支持创建专用队列和创建与其他运行“消息队列”的计算机的直接连接。

 

2配置MSMQ

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

3 MQ Demo

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

 

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

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将会把消息发送到相应的队列中,这里采用的是专有队列所以会将消息发送到本地的队列中,这样在消息的发送方和调用方之间就构建了一个相互松耦合的桥梁,它就是消息队列,

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

 

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的功能已经足够开发使用。

posted @ 2017-03-13 17:37  一指流砂~  阅读(8779)  评论(0编辑  收藏  举报