亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

消息隊列-關于MSMQ的基礎知識

系統(tǒng) 2092 0

消息隊列( Message Queue )簡介及其使用

原文鏈接: http://www.cnblogs.com/rickie/archive/2004/11/16/64345.html
???利用
MSMQ Microsoft Message Queue ),應用程序開發(fā)人員可以通過發(fā)送和接收消息方便地與應用程序進行快速可靠的通信。消息處理為您提供了有保障的消息傳遞和執(zhí)行許多業(yè)務處理的可靠的防故障方法。
???
MSMQ XML Web Services .Net Remoting 一樣,是一種分布式開發(fā)技術。但是在使用 XML Web Services .Net Remoting 組件時, Client 端需要和 Server 端實時交換信息, Server 需要保持聯(lián)機。 MSMQ 則可以在 Server 離線的情況下工作,將 Message 臨時保存在 Client 端的消息隊列中,以后聯(lián)機時再發(fā)送到 Server 端處理。
??? 顯然, MSMQ 不適合于 Client 需要 Server 端及時響應的這種情況, MSMQ 以異步的方式和 Server 端交互,不用擔心等待 Server 端的長時間處理過程。
??? 雖然 XML Web Services .Net Remoting 都提供了 [OneWay] 屬性來處理異步調(diào)用,用來解決 Server 端長方法調(diào)用長時間阻礙 Client 端。但是不能解決大量 Client 負載的問題,此時 Server 接受的請求快于處理請求。
??? 一般情況下, [OneWay] 屬性不用于專門的消息服務中。
??? 1. 基本術語和概念( Basic terms and concepts ?

??? “消息”是在兩臺計算機間傳送的數(shù)據(jù)單位。消息可以非常簡單,例如只包含文本字符串;也可以更復雜,可能包含嵌入對象。 消息被發(fā)送到隊列中?!跋㈥犃小笔窃谙⒌膫鬏斶^程中保存消息的容器。消息隊列管理器在將消息從它的源中繼到它的目標時充當中間人。隊列的主要目的是提供路由并保證消息的傳遞;如果發(fā)送消息時接收者不可用,消息隊列會保留消息,直到可以成功地傳遞它。
??? “消息隊列”是 Microsoft 的消息處理技術,它在任何安裝了 Microsoft Windows 的計算機組合中,為任何應用程序提供消息處理和消息隊列功能,無論這些計算機是否在同一個網(wǎng)絡上或者是否同時聯(lián)機。
??? “消息隊列網(wǎng)絡”是能夠相互間來回發(fā)送消息的任何一組計算機。網(wǎng)絡中的不同計算機在確保消息順利處理的過程中扮演不同的角色。它們中有些提供路由信息以確定如何發(fā)送消息,有些保存整個網(wǎng)絡的重要信息,而有些只是發(fā)送和接收消息。
??? “消息隊列”安裝期間,管理員確定哪些服務器可以互相通信,并設置特定服務器的特殊角色。構成此“消息隊列”網(wǎng)絡的計算機稱為“站點”,它們之間通過“站點鏈接”相互連接。每個站點鏈接都有一個關聯(lián)的“開銷”,它由管理員確定,指示了經(jīng)過此站點鏈接傳遞消息的頻率。
??? “消息隊列”管理員還在網(wǎng)絡中設置一臺或多臺作為“路由服務器”的計算機。路由服務器查看各站點鏈接的開銷,確定經(jīng)過多個站點傳遞消息的最快和最有效的方法,以此決定如何傳遞消息。
2. 隊列類型( Queue Type ?

有兩種主要的隊列類型:由您或網(wǎng)絡中的其他用戶創(chuàng)建的隊列和系統(tǒng)隊列。

用戶創(chuàng)建的隊列可能是以下任何一種隊列:

“公共隊列”在整個“消息隊列”網(wǎng)絡中復制,并且有可能由網(wǎng)絡連接的所有站點訪問。

“專用隊列”不在整個網(wǎng)絡中發(fā)布。相反,它們僅在所駐留的本地計算機上可用。專用隊列只能由知道隊列的完整路徑名或標簽的應用程序訪問。

“管理隊列”包含確認在給定“消息隊列”網(wǎng)絡中發(fā)送的消息回執(zhí)的消息。指定希望 MessageQueue 組件使用的管理隊列(如果有的話)。

“響應隊列”包含目標應用程序接收到消息時返回給發(fā)送應用程序的響應消息。指定希望 MessageQueue 組件使用的響應隊列(如果有的話)。

系統(tǒng)生成的隊列一般分為以下幾類:

“日記隊列”可選地存儲發(fā)送消息的副本和從隊列中移除的消息副本。每個“消息隊列”客戶端上的單個日記隊列存儲從該計算機發(fā)送的消息副本。在服務器上為每個隊列創(chuàng)建了一個單獨的日記隊列。此日記跟蹤從該隊列中移除的消息。

“死信隊列”存儲無法傳遞或已過期的消息的副本。如果過期或無法傳遞的消息是事務性消息,則被存儲在一種特殊的死信隊列中,稱為“事務性死信隊列”。死信存儲在過期消息所在的計算機上。有關超時期限和過期消息的更多信息,請參見默認消息屬性。

“報告隊列”包含指示消息到達目標所經(jīng)過的路由的消息,還可以包含測試消息。每臺計算機上只能有一個報告隊列。

“專用系統(tǒng)隊列”是一系列存儲系統(tǒng)執(zhí)行消息處理操作所需的管理和通知消息的專用隊列。

在應用程序中進行的大多數(shù)工作都涉及訪問公共隊列及其消息。但是,根據(jù)應用程序的日記記錄、確認和其他特殊處理需要,在日常操作中很可能要使用幾種不同的系統(tǒng)隊列。

3. 同步和異步通信( Synchronous VS. Asynchronous Communication

隊列通信天生就是異步的,因為將消息發(fā)送到隊列和從隊列中接收消息是在不同的進程中完成的。另外,可以異步執(zhí)行接收操作,因為要接收消息的人可以對任何給定的隊列調(diào)用 BeginReceive 方法,然后立即繼續(xù)其他任務而不用等待答復。這與人們所了解的“同步通信”截然不同。

在同步通信中,請求的發(fā)送方在執(zhí)行其他任務前,必須等待來自預定接收方的響應。發(fā)送方等待的時間完全取決于接收方處理請求和發(fā)送響應所用的時間。
4. 同消息隊列交互( Interacting with Message Queues

消息處理和消息為基于服務器的應用程序組件之間的進程間通信提供了強大靈活的機制。同組件間的直接調(diào)用相比,它們具有若干優(yōu)點,其中包括:

  • 穩(wěn)定性 組件失敗對消息的影響程度遠遠小于組件間的直接調(diào)用,因為消息存儲在隊列中并一直留在那里,直到被適當?shù)靥幚?。消息處理同事務處理相似,因為消息處理是有保證的。
  • 消息優(yōu)先級 更緊急或更重要的消息可在相對不重要的消息之前接收,因此可以為關鍵的應用程序保證足夠的響應時間。
  • 脫機能力 發(fā)送消息時,它們可被發(fā)送到臨時隊列中并一直留在那里,直到被成功地傳遞。當因任何原因對所需隊列的訪問不可用時,用戶可以繼續(xù)執(zhí)行操作。同時,其他操作可以繼續(xù)進行,如同消息已經(jīng)得到了處理一樣,這是因為網(wǎng)絡連接恢復時消息傳遞是有保證的。
  • 事務性消息處理 將多個相關消息耦合為單個事務,確保消息按順序傳遞、只傳遞一次并且可以從它們的目標隊列中被成功地檢索。如果出現(xiàn)任何錯誤,將取消整個事務。
  • 安全性 — MessageQueue 組件基于的消息隊列技術使用 Windows 安全來保護訪問控制,提供審核,并對組件發(fā)送和接收的消息進行加密和驗證

5. .Net 環(huán)境下編寫簡單的 Message Queue 程序

1 )先安裝 Message Queuing Services

通過 Control Panel , “Add/Remove Programs” – “Add/Remove Windows Components” 步驟安裝 MSMQ

MSMQ 可以安裝為工作組模式或域模式。如果安裝程序沒有找到一臺運行提供目錄服務的消息隊列的服務器,則只可以安裝為工作組模式,此計算機上的“消息隊列”只支持創(chuàng)建專用隊列和創(chuàng)建與其他運行“消息隊列”的計算機的直接連接。

2 )配置 MSMQ

打開 Computer Management – Message Queuing ,在 Private Queues 下創(chuàng)建 MSMQDemo 隊列

? 3 )編寫代碼-簡單演示 MSMQ 對象

MessageQueue 類是“消息隊列”周圍的包裝。 MessageQueue 類提供對“消息隊列”隊列的引用??梢栽? MessageQueue 構造函數(shù)中指定一個連接到現(xiàn)有資源的路徑,或者可在服務器上創(chuàng)建新隊列。在調(diào)用 Send 、 Peek Receive 之前,必須將 MessageQueue 類的新實例與某個現(xiàn)有隊列關聯(lián)。

MessageQueue 支持兩種類型的消息檢索:同步和異步。同步的 Peek Receive 方法使進程線程用指定的間隔時間等待新消息到達隊列。異步的 BeginPeek BeginReceive 方法允許主應用程序任務在消息到達隊列之前,在單獨的線程中繼續(xù)執(zhí)行。這些方法通過使用回調(diào)對象和狀態(tài)對象進行工作,以便在線程之間進行信息通訊。

// Send Message

private void btnSendMessage_Click ( object sender , System . EventArgs e )

{

?????? // Open queue

?????? System . Messaging . MessageQueue queue = new System . Messaging . MessageQueue (".""Private$""MSMQDemo");

?????? // Create message

?????? System . Messaging . Message message = new System . Messaging . Message ();

?????? message . Body = txtMessage . Text . Trim ();

?????? message . Formatter = new System . Messaging . XmlMessageFormatter ( new Type [] { typeof ( string )});

?????? // Put message into queue

?????? queue . Send ( message );

}

// Receive Message

private void btnReceiveMessage_Click ( object sender , System . EventArgs e )

{

?????? // Open queue

?????? System . Messaging . MessageQueue queue = new System . Messaging . MessageQueue (".""Private$""MSMQDemo");

?

?????? // Receive message, 同步的 Receive 方法阻塞當前執(zhí)行線程,直到一個 message 可以得到

?????? System . Messaging . Message message = queue . Receive ();

?????? message . Formatter = new System . Messaging . XmlMessageFormatter ( new Type [] { typeof ( string )});

?????? txtReceiveMessage . Text = message . Body . ToString ();

}

. Net 環(huán)境下消息隊列( MSMQ )對象的應用

?

?原文鏈接: http://www.cnblogs.com/rickie/archive/2004/11/17/64712.html

關于消息對象( MSMQ )的一些基本概念可以從《 消息隊列( Message Queue )簡介及其使用 》查閱,這里歸納在 .Net 環(huán)境下應用消息隊列( MSMQ )開發(fā)的一些基本對象和方法。

?

隊列類型及其相應的路徑格式:

Public:?[MachineName]"[QueueName]

Private:?[MachineName]"Private$"[QueueName]

Journal:?[MachineName]"[QueueName]"Journal$

Machine journal:?[MachineName]"Journal$

Machine dead-letter:?[MachineName]"DeadLetter$

Machine transactional dead-letter:?[MachineName]"XactDeadLetter$

The first portion of the path indicates a computer or domain name or uses a period (.) to indicate the current computer.

?

1. 創(chuàng)建消息隊列

可以手動的方式通過 Windows 提供的工具創(chuàng)建,或者通過程序的方式創(chuàng)建:

if ( MessageQueue . Exists (".""Private$""MSMQDemo"))

??????????? queue = new MessageQueue (".""Private$""MSMQDemo");

else

??????????? queue = MessageQueue . Create (".""Private$""MSMQDemo");

?

2. 發(fā)送消息

缺省情況下,消息序列化 XML 格式,也可設置為 MessageQueue 對象的 Formatter 屬性為 BinaryMessageFormatter ,以二進制格式序列化。

設置消息序列化格式:

if ( rdoXMLFormatter . Checked )

??????????? queue . Formatter = new XmlMessageFormatter ();

else

??????????? queue . Formatter = new BinaryMessageFormatter ();

?

發(fā)送簡單的文本消息:

string strMessage = "Hello, I am Rickie.";

queue . Send ( strMessage , "Simple text message");

?

消息隊列可以傳送簡單的文本消息,也可以傳送對象消息,但需要滿足如下條件:

1 class 必須有一個無參數(shù)的公共構造函數(shù), .Net 使用這個構造函數(shù)在接收端重建對象。

2 class 必須標示為 serializable (序列化)。

3 )所有的 class 屬性必須可讀寫,因為 .Net 在重建對象時不能夠恢復只讀屬性的屬性值,因此只讀屬性不能夠序列化。

?

發(fā)送對象消息( CustomerInfo class 需要滿足上述條件):

CustomerInfo theCustomer = new CustomerInfo ("0001", "Rickie Lee", "Rickieleemail@yahoo.com");

queue . Send ( theCustomer , "Object message");

?

3. / 顯示消息

當消息接受后,消息將從隊列中刪除??梢酝ㄟ^使用 MessageQueue.Peek 方法來檢索消息隊列中的第一個消息的復制,保留消息在隊列中。不過,這樣只能獲取的相同的消息。更好的辦法是通過 foreach 來讀消息隊列中的消息,但不刪除隊列中的消息。

foreach(System.Messaging.Message message in queue)

{

????????? txtResults.Text += message.Label + Environment.NewLine;

}

?

4. 接收消息

一般而言,可以通過 Receive 方法來讀取隊列中的消息,對于非事務性的隊列,優(yōu)先讀取高優(yōu)先級的消息。如果隊列中有多個相同優(yōu)先級的消息,則以先進先去的方式進行讀取消息。對于事務性的隊列,則完全以先進先去的方式進行讀取消息,忽略消息的優(yōu)先級。

System . Messaging . Message receivedMessage ;

receivedMessage = queue . Receive ( TimeSpan . FromSeconds (5));

?

上面采用同步調(diào)用,并且一直等到隊列中有可用消息或超時過期。

?

Demo 界面(不在提供DEMO程序)

消息隊列-關于MSMQ的基礎知識

?

其他相關事項:

  • 關于消息的加密、路由等等特性,需要有配置 Active Directory 的消息隊列服務器。
  • 為了避免存放消息隊列的計算機重新啟動而丟失消息,可以通過設置消息對象的 Recoverable 屬性為 true ,在消息傳遞過程中將消息保存到磁盤上來保證消息的傳遞,默認為 false 。
  • 消息發(fā)送方和消息接收方需采用相同的序列化格式,如 XML Binary
  • 建議每一個消息隊列存放相同類型的消息對象,這樣可以省掉獲取消息對象后,進行類型判別的麻煩。 ?

5. 消息隊列在分布式系統(tǒng)中的應用

消息隊列 MSMQ 和數(shù)據(jù)庫不一樣,消息隊列缺乏足夠的錯誤檢查能力,并且 MSMQ 由于需要束縛在 windows 平臺,這些是 MSMQ 的不足之處。另外 , Production 環(huán)境中,需要編寫大量的代碼來進行錯誤檢測和響應。還有大量的死信隊列、響應隊列和日記隊列可能部分在企業(yè)不同的計算機上,使得跟蹤這些問題或進行診斷變得比較困難。

?

但是, MSMQ 作為組件內(nèi)部連接比較有用。例如,你可以創(chuàng)建一個 XML Web Services 使用 MSMQ 來轉發(fā)對另一個 Server 端組件的請求,這種設計巧妙回避了其他異步調(diào)用的方法,并且確??蓴U展性和性能。

?

消息隊列-關于MSMQ的基礎知識


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品永久免费自在线观看 | 免费费看的欧亚很色大片 | 欧美成人免费高清二区三区 | 久久精品国产精品青草 | 美女被视频在线看九色 | 涩久久| 99在线国产视频 | 丁香婷婷六月 | 香蕉视频网站在线播放 | 7777奇米影视 | 综合久久久久综合体桃花网 | 亚洲精品综合一区二区 | 久久香蕉国产线看精品 | 国产精品久久久久尤物 | 大学生一级毛片高清版 | 狠狠色丁香婷婷综合久久来 | 狠狠色噜噜狠狠狠狠黑人 | 欧美日韩久久中文字幕 | 在线播放精品视频 | 精品国产一区二区三区久久 | 日本一级特黄毛片高清视频 | 狠狠色丁香婷综合久久 | 激情综合网五月激情 | 亚洲欧美韩国 | 国产高清自拍 | 免费看一级黄色毛片 | 久久久国产麻豆 | 欧美高清在线视频一区二区 | 淫欲网| 国产在线不卡一区 | 日韩欧美一区在线观看 | 新四虎影院 | 免费观看欧美精品成人毛片 | 久久国产精品岛国搬运工 | 综合亚洲精品一区二区三区 | 国产精品第六页 | 国内精品自在自线在免费 | 综合久久久 | 国产精品久久久久久吹潮 | 久久精品在线观看 | 天天射天天射天天干 |