欧美成人亚洲综合在线-91麻豆果冻精品一区二区三区-欧美性生活视频69-中国一级毛片视频免费看-欧洲精品一区二区三区中文字幕-国产精品剧情在线第一页-精品丰满熟女一区二区三区蜜桃-人妻日韩精品中文字幕-亚洲中文字幕五月婷婷

新聞

.NET中的消息隊(duì)列

發(fā)布時(shí)間

2018-05-26

來(lái)源

來(lái)自互聯(lián)網(wǎng)

移動(dòng)

手機(jī)閱覽

為何使用消息隊(duì)列

您可能認(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)型:

  • 外發(fā)隊(duì)列:消息發(fā)送到目的地之前,用它來(lái)臨時(shí)存儲(chǔ)消息。
  • 公共隊(duì)列:在主動(dòng)目錄中公布。整個(gè)網(wǎng)絡(luò)各種服務(wù)器上的應(yīng)用程序能夠通過(guò)主動(dòng)目錄找到并應(yīng)用公共隊(duì)列。
  • 私有隊(duì)列:這些是本地服務(wù)器上的隊(duì)列,對(duì)其它服務(wù)器無(wú)效(因此這些隊(duì)列不在主動(dòng)目錄中公布。)
  • 系統(tǒng)隊(duì)列:包含日記隊(duì)列(由系統(tǒng)生成)、死隊(duì)列和事務(wù)型死信隊(duì)列。死消息無(wú)法傳送。

System.Messaging命名空間執(zhí)行MSMQ的編程操作。這個(gè)命名空間有兩個(gè)主要的對(duì)象:

  • Message:隊(duì)列發(fā)送或讀取的實(shí)際消息或數(shù)據(jù)。
  • MessageQueue:接收/發(fā)送消息的MSMQ消息隊(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è)試消息");

(代碼片斷1)


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

(代碼片斷2)

       對(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);

(代碼片斷3)

四、接收消息

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ú)法正確反序列化消息的。

資訊列表

其他的資訊
OTHER