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的功能已經足夠開發使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM