消息隊列(Message Queue)


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

“消息”是在兩台計算機間傳送的數據單位。消息可以非常簡單,例如只包含文本字符串;也可以更復雜,可能包含嵌入對象。

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

2. 隊列類型

        公共隊列     MachineName\QueueName    (在整個“消息隊列”網絡中復制,並且有可能由網絡連接的所有站點訪問。)    
        專用隊列     MachineName\Private$\QueueName    (不在整個網絡中發布。相反,它們僅在所駐留的本地計算機上可用。專用隊列只能由知道隊列的完整路徑名或標簽的應用程序訪問。)
        日記隊列     MachineName\QueueName\Journal$   
        計算機日記隊列     MachineName\Journal$       (可選地存儲發送消息的副本和從隊列中移除的消息副本。每個“消息隊列”客戶端上的單個日記隊列存儲從該計算機發送的消息副本。在服務器上為每個隊列創建了一個單獨的日記隊列。此日記跟蹤從該隊列中移除的消息。) 
        計算機死信隊列     MachineName\Deadletter$    (存儲無法傳遞或已過期的消息的副本。如果過期消息或無法傳遞的消息是事務性消息,則被存儲在一種特殊的名為“事務性死信隊列”的死信隊列中。 )
        計算機事務性死信隊列 MachineName\XactDeadletter$ 

3. 同步和異步通信

通信天生就是異步的,因為將消息發送到隊列和從隊列中接收消息是可以在不同的進程中完成的。

另外,可以異步執行接收操作,因為要接收消息的人可以對任何給定的隊列調用(MQ.BeginPeek;  MQ.BeginReceive;MQ.EndPeek; MQ.EndReceive;) 方法,然后立即繼續其他任務而不用等待答復。這與人們所了解的“同步通信”截然不同(MQ.Send; MQ.Receive;)

使用隊列

1 創建消息隊列

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

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

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;
        }


免責聲明!

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



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