在這里了解當(dāng)今互聯(lián)網(wǎng)的最新動(dòng)態(tài)
在這里了解當(dāng)今
您可能認(rèn)為您能夠通過(guò)一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)表(一個(gè)應(yīng)用程序往其中寫(xiě)入數(shù)據(jù),另一個(gè)應(yīng)用程序從中讀取數(shù)據(jù))來(lái)應(yīng)用消息隊(duì)列。消息隊(duì)列平臺(tái)更為穩(wěn)定,因?yàn)樗鼈兺ǔ碛凶约旱陌踩珯C(jī)制、事務(wù)支持及其它功能。傳輸消息的路由功能是它的一個(gè)關(guān)鍵應(yīng)用。MSMQ提供各種消息隊(duì)列平臺(tái)。
MSMQ簡(jiǎn)介
MSMQ是Windows 2000、Windows XP、Windows Server 2003的一個(gè)組件,并將繼續(xù)包含在Windows Vista和以后的Windows服務(wù)器中。即使目標(biāo)接收應(yīng)用程序沒(méi)有運(yùn)行,或運(yùn)行發(fā)送或接收應(yīng)用程序的計(jì)算機(jī)沒(méi)有聯(lián)網(wǎng),協(xié)同合作的應(yīng)用程序仍能利用MSMQ在彼此之間發(fā)送和接收消息。在到達(dá)目標(biāo)隊(duì)列之前,消息由MSMQ存儲(chǔ)并轉(zhuǎn)發(fā)。接收應(yīng)用程序能夠從隊(duì)列中恢復(fù)數(shù)據(jù)。
MSMQ之類(lèi)消息隊(duì)列的主要特點(diǎn)在于它分離發(fā)送和接收應(yīng)用程序,使其不必同時(shí)運(yùn)行。這意味著一個(gè)應(yīng)用程序能夠把數(shù)據(jù)存放在隊(duì)列中,而不用理會(huì)隊(duì)列中的項(xiàng)目是否被傳送到接收應(yīng)用程序。
MSMQ是Windows的一個(gè)可選組件,只需通過(guò)Windows控制面板的添加或刪除Windows組件向?qū)Ь涂蛇M(jìn)行安裝。MSMQ有兩種配置模式:域模式或工作組模式(只使用私有隊(duì)列)。MSMQ安裝完成后,立即就可以在.NET應(yīng)用程序中運(yùn)行。
MSMQ交互
開(kāi)發(fā)基于消息的應(yīng)用程序從隊(duì)列開(kāi)始。MSMQ包含四種隊(duì)列類(lèi)型:
System.Messaging命名空間執(zhí)行MSMQ的編程操作。這個(gè)命名空間有兩個(gè)主要的對(duì)象:
MSMQ編程
建立一個(gè)隊(duì)列是應(yīng)用MSMQ的第一步。您可以通過(guò)Windows計(jì)算機(jī)管理控制臺(tái)中的消息隊(duì)列選項(xiàng)完成這一操作,或者自己編程建立一個(gè)隊(duì)列。列表A中的C#代碼建立了一個(gè)新的私有MSMQ消息隊(duì)列(如果不存在隊(duì)列),并同時(shí)創(chuàng)建一條消息。
代碼應(yīng)用MessageQueue類(lèi)的Exists方法來(lái)確定是否存在一個(gè)名為T(mén)echRepublic的私有隊(duì)列。如存在,它用現(xiàn)有隊(duì)列示例這個(gè)MessageQueue對(duì)象;否則,就建立一個(gè)新隊(duì)列。
新的Message對(duì)象用來(lái)向隊(duì)列發(fā)送一條消息。它的Label屬性指定在MSMQ控制臺(tái)中顯示的消息標(biāo)題,其主體包含存放在隊(duì)列上的項(xiàng)目?jī)?nèi)容。在這種情況下,我只發(fā)送文本,但您能夠使用任何類(lèi)型的對(duì)象。MessageQueue類(lèi)的Send方法向隊(duì)列發(fā)送消息。列表B中是對(duì)應(yīng)的VB.NET代碼。
下一步即從隊(duì)列中讀取消息。這是一個(gè)簡(jiǎn)單的過(guò)程,應(yīng)用MessageQueue類(lèi)的Receive方法即可。如果隊(duì)列中存在消息,Receive方法就返回一個(gè)消息對(duì)象;否則,它等待一條消息出現(xiàn)(您可以設(shè)置一個(gè)時(shí)間期限)。從隊(duì)列中恢復(fù)對(duì)象需要預(yù)先知道它的類(lèi)型。
MessageQueue類(lèi)的Formatter屬性允許您輕松指定被恢復(fù)對(duì)象的類(lèi)型。下面的簡(jiǎn)單例子僅使用文本,所以它應(yīng)用System.String。在列表C中,C#代碼從測(cè)試隊(duì)列中讀取消息。
提交給Receive方法的TimeSpan對(duì)象指定異常出現(xiàn)時(shí)系統(tǒng)的等待時(shí)間。接下來(lái)設(shè)置這個(gè)例子中的Formatter方法,對(duì)象被轉(zhuǎn)換成字符串讀取前面存儲(chǔ)的文本。Receive方法從隊(duì)列中讀取消息,它的值顯示在控制臺(tái)中。在try塊的最后部分,隊(duì)列關(guān)閉。
輕松應(yīng)用消息
MSMQ組合Windows和.NET的System.Messaging命名空間,使您可以方便地在.NET應(yīng)用程序中利用消息。消息提供一種在企業(yè)應(yīng)用程序中異步發(fā)送并接收消息(數(shù)據(jù))的強(qiáng)大工具。
以下試文章來(lái)源
http://hi.baidu.com/sanlng/blog/item/5fc5bb510d4faa2043a75b28.html
三、發(fā)送信息
1、發(fā)送簡(jiǎn)單消息
在消息發(fā)送前,首先要實(shí)例化MessageQueue的一個(gè)實(shí)例并指定其所對(duì)應(yīng)的隊(duì)列。如下代碼
//實(shí)例化MessageQueue,并指向現(xiàn)有的一個(gè)名稱(chēng)為VideoQueue隊(duì)列
MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
MQ.Send("消息測(cè)試","測(cè)試消息");
2、發(fā)送復(fù)雜消息
VideoPath是將要被當(dāng)作消息的Boby來(lái)進(jìn)行傳遞的類(lèi)型,其定義如下:
using System;
namespace Message.Bussiness
{
[Serializable]
public class VideoPath
{
string _sourceFilePath = string.Empty;
string _targetFilePath = string.Empty;
public VideoPath()
{
}
public VideoPath(string sourceFilePath,string targetFilePath)
{
this._sourceFilePath = sourceFilePath;
this._targetFilePath = targetFilePath;
}
public string SourceFilePath
{
get
{
return this._sourceFilePath;
}
set
{
this._sourceFilePath= value;
}
}
public string TargetFilePath
{
get
{
return this._targetFilePath;
}
set
{
this._targetFilePath = value;
}
}
}
}
對(duì)該類(lèi)的要求是,該類(lèi)必須要有一個(gè)默認(rèn)無(wú)參的公共構(gòu)造函數(shù),所有屬性必須是可讀寫(xiě)的,且該類(lèi)必須可以被序列化。利用Message將消息發(fā)送到隊(duì)列中。
MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
VideoPath VPath = new VideoPath(Path.Combine(Server.MapPath("."),"Video\\output.wmv"),Path.Combine(Server.MapPath("."),"Flv\\output.flv"));
System.Messaging.Message message = new System.Messaging.Message();
message.Label = "視頻轉(zhuǎn)換所用消息";
message.Body = VPath;
MQ.Send(message);
四、接收消息
1、接收簡(jiǎn)單類(lèi)型的消息
2、接收復(fù)雜類(lèi)型的消息
對(duì)于“代碼片斷3”所示的消息,在接收時(shí)可按如下方法:
MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
//調(diào)用MessageQueue的Receive方法接收消息
System.Messaging.Message message = MQ.Receive( TimeSpan.FromSeconds(5));
if ( message != null )
{
message.Formatter = new System.Messaging.XmlMessageFormatter(new string[]{"Message.Bussiness.VideoPath,Message"});
VideoPath Vpath = (VideoPath)message.Body;
Response.Write(Vpath.SourceFilePath);
}
else
{
Response.Write("沒(méi)有找到消息!");
}
需要注意的是,如果消息是一個(gè)自定義類(lèi)型對(duì)象時(shí),必須指定Message的序列化器,即Formatter屬性。不合適的Formatter是無(wú)法正確反序列化消息的。
資訊列表