消息隊列(Message Queue)

1. 基本術語和概念(Basic terms and concepts服務器

「消息」是在兩臺計算機間傳送的數據單位。消息能夠很是簡單,例如只包含文本字符串;也能夠更復雜,可能包含嵌入對象。網絡

消息被髮送到隊列中。「消息隊列」是在消息的傳輸過程當中保存消息的容器。消息隊列管理器在將消息從它的源中繼到它的目標時充當中間人。隊列的主要目的是提供路由並保證消息的傳遞;若是發送消息時接收者不可用,消息隊列會保留消息,直到能夠成功地傳遞它。…..異步

2. 隊列類型async

        公共隊列     MachineName\QueueName    (在整個「消息隊列」網絡中複製,而且有可能由網絡鏈接的全部站點訪問。)    
        專用隊列     MachineName\Private$\QueueName    (不在整個網絡中發佈。相反,它們僅在所駐留的本地計算機上可用。專用隊列只能由知道隊列的完整路徑名或標籤的應用程序訪問。)
        日記隊列     MachineName\QueueName\Journal$   
        計算機日記隊列     MachineName\Journal$       (可選地存儲發送消息的副本和從隊列中移除的消息副本。每一個「消息隊列」客戶端上的單個日記隊列存儲從該計算機發送的消息副本。在服務器上爲每一個隊列建立了一個單獨的日記隊列。此日記跟蹤從該隊列中移除的消息。) 
        計算機死信隊列     MachineName\Deadletter$    (存儲沒法傳遞或已過時的消息的副本。若是過時消息或沒法傳遞的消息是事務性消息,則被存儲在一種特殊的名爲「事務性死信隊列」的死信隊列中。 )
        計算機事務性死信隊列 MachineName\XactDeadletter$  spa

3. 同步和異步通訊線程

通訊天生就是異步的,由於將消息發送到隊列和從隊列中接收消息是能夠在不一樣的進程中完成的。code

另外,能夠異步執行接收操做,由於要接收消息的人能夠對任何給定的隊列調用(MQ.BeginPeek;  MQ.BeginReceive;MQ.EndPeek; MQ.EndReceive;) 方法,而後當即繼續其餘任務而不用等待答覆。這與人們所瞭解的「同步通訊」大相徑庭(MQ.Send; MQ.Receive;)orm

使用隊列

1 建立消息隊列對象

查看是否有這種隊列MessageQueue.Exists(path)blog

沒有建立並這種隊列,或使用這種隊列

2 發送消息

設置消息傳輸格式(若是沒有的話,是XML格式)

發送消息

3 接受消息

接受消息Message類

這裏涉及到同步 或者異步

同步

  主動方式,會同步阻塞當前線程
    Message m=Receive(); //接收同時,從隊列中刪除消息or  Message m=Peek();  //不刪除接收到的消息

  或者 用異步方式,不會阻塞當前線程

    用要使用 BeginReceive,請建立一個處理異步操做結果的事件處理程序並將其與事件委託相關聯。 BeginReceive 啓動異步接收操做;消息達到隊列時,將經過引起 ReceiveCompleted 事件通知 MessageQueue。 而後 MessageQueue 可經過調用 EndReceive(IAsyncResult) 來訪問該消息。BeginReceive 方法當即返回,但直到調用事件處理程序時,異步操做才完成。

 

註冊 事件---> BeginReceive –>引起事件(EndReceive訪問消息, 繼續BeginReceive)

 

public void MessageReceive()
        {
            MQ.ReceiveCompleted += new ReceiveCompletedEventHandler(MyReceiveCompleted);
            MQ.BeginReceive();

        }
        public void MyReceiveCompleted(Object source,
          ReceiveCompletedEventArgs asyncResult)
        {
            try
            {
                MessageQueue MQQ = (MessageQueue)source;
                MQQ.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
                Message m = MQQ.EndReceive(asyncResult.AsyncResult);
                //Console.WriteLine(m.Label);
                Console.WriteLine(m.Body);
                MQ.BeginReceive();
            }
            catch (MessageQueueException)
            {
                // Handle sources of MessageQueueException.
            }

            // Handle other exceptions.

            return;
        }
相關文章
相關標籤/搜索