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

相關文章
相關標籤/搜索