日期:2012-11-16  浏览次数:20844 次

網站如何加入Message Queue功能呢?

如何於您的網站加入Message Queue的非同步處理功能呢?

於Windows NT Option Pack當中,包括MSMQ(Microsoft Message Queue Server),提供非「同步」處理的功能。

網路可能緩慢不穩,資料庫也可能當機,MSMQ(Microsoft Message Queue Server)提供了非「同步」處理,可以降低同步的依賴。

不懂?沒關係。

MSMQ的關鍵為「連上線」(online)和「有空」(available)。由於網路上所有的應用程式不一定都能同時100%連上線(online),有的應用程式的電腦可能仍然開機。應用程式即使連上線,也可能沒有空(available)來處理與其他應用程式的連繫工作。

所謂「同步」,譬如當網路上的甲應用程式想要傳送訊息到乙應用程式,必須等待乙應用程式的回應,才能繼續做下去時,這就是須要「同步」。

但是,乙應用程式可能仍未連上線(online),也可能沒有空(available)來處理與甲應用程式的連繫工作。

MSMQ(Microsoft Message Queue Server),提供於分散環境下網路上多個應用程式的容錯功能。將不需要立刻回應的應用程式,以非同步方式來處理。MSMQ將甲應用程式的訊息儲存到MSMQ當中,等乙應用程式連上線也有空時,再來取得甲應用程式儲存於MSMQ的訊息。

因此,MSMQ支援行動運作(Mobile Computing),譬如筆記型電腦於正常狀況並無網路連線,待傳送的訊息可先存放在用戶端筆記型電腦的queue當中,待爾後與網路連線,再上傳到伺服器端。

MSMQ與IIS(Internet Information Server)緊密整合,於Web應用程式中使用asp來控制Message Queue。

MSMQ也與MTS(Microsoft Transaction Server)緊密整合,傳送的訊息可以可以與資料庫的更動一起有「同生共死」的異動(Transaction)功能。

您可以使用asp程式來開發MSMQ的Web應用程式,也可以使用Visual Basic或Visual C++等語言來開發MSMQ的網路應用程式。

傳送Message到MSMQ

如何傳送Message到MSMQ呢?

若要執行MSMQ傳送Message的範例,首先安裝Windows NT Option Pack的Microsoft Message Queue Server,然後於Message Queue的 [檔案總管] ,新增加一個佇列(Queue),名稱為test。

方法為於Message Queue的 [檔案總管] 的電腦上按右鍵,選擇 [開新檔案] 的 [佇列]。

命名佇列名稱為test。

於用戶端使用瀏覽器,瀏覽執行的結果。

於Message Queue的 [檔案總管] ,於佇列test的日誌下可以看到傳送到MSMQ的Message,顯示Message的主旨部份。

於此Message快速按兩下,可以於 [本文] 看到Message的內文部份。

於asp程式當中,如何傳送Message到MSMQ呢?

方法為首先使用Server.CreateObject("MSMQ.MSMQQueueInfo")呼叫MSMQ的元件,然後設定以下:

QueueInfo.pathname:設定Message傳送的目的佇列(Queue)的名稱。

就可以使用QueueInfo.Open(2, 0)開啟此佇列。

接著Server.CreateObject("MSMQ.MSMQMessage")呼叫MSMQ的Message元件,然後設定以下Message的內文和主旨部份:

Msg.Label:設定Message的主旨部份。

Msg.body:設定Message的內文部份。

最後下個Msg.Send Queue後,即開始傳送Message到MSMQ 的佇列下。

asp程式如下:

<%

Set QueueInfo = Server.CreateObject("MSMQ.MSMQQueueInfo")

QueueInfo.pathname = ".\test”

Set Queue = QueueInfo.Open(2, 0)

Set Msg = Server.CreateObject("MSMQ.MSMQMessage")

Msg.body = "這是message body" & now

Msg.Label = "這是message label" & now

Msg.Delivery = 1

Msg.Send Queue

Queue.Close

%>

將傳送Message到MSMQ 的test佇列下。

從MSMQ接收Message

如何從MSMQ接收Message呢?

如果您急著從MSMQ接收剛剛傳送的Message,於用戶端使用瀏覽器執行,會遭到拒絕存取的訊息,這是因為未將使用權限設定為 [完全控制] 的緣故。

因此必須先修改設定。於Message Queue的 [檔案總管] ,於佇列test上按右鍵,選擇 [內容],選擇 [安全設定],按下 [使用權限] 按鈕,將 [Everyone]的存取類型設定為 [完全控制]。

接著就可以從MSMQ接收剛剛傳送的Message,於用戶端使用瀏覽器執行。

於asp程式當中,如何從MSMQ接收Messag呢?

方法為首先使用Server.CreateObject("MSMQ.MSMQQueueInfo")呼叫MSMQ的元件,然後設定QueueInfo.pathname為待帶接收Message的佇列(Queue)的名稱。

就可以使用Set q = QueueInfo.Open(1,0)開啟此佇列。最後下個q.Receive後,即開始接收Message。由Msg.Label 、Msg.Body可以讀到 Message的內文和主旨部份。

從MSMQ(Microsoft Message Queue Server)接收Message的asp程式如下:

<%

Set QueueInfo = Server.CreateObject("MSMQ.MSMQQueueInfo")

QueueInfo.pathname = ".\test"

Set q = QueueInfo.Open(1,0)

Set Msg = q.Receive

If Not Msg Is Nothing Then

Response.Write "<BR>接收到訊息LABEL:" & Msg.Label

Response.Write "<BR>接收到訊息LABEL:" & Msg.Body

End If

%>

學會了嗎?

Message Queue加上Transaction功能

前面談到,MSMQ也與MTS(Microsoft Transaction Server)緊密整合,傳送的訊息可以與資料庫更動一起有「同生共死」的異動(Transaction)功能。

當資料庫的更動成功時,再傳送訊息通知其他的應用程式;資料庫的更動失敗時,訊息就不會傳送,這就是所謂的佇列異動(Transactional queue)。

譬如輸入訂單到資料庫時,若資料庫的更動成功時,就會傳送訊息通知庫房出貨,若資料庫的更動失敗時,就不會傳送訊息通知庫房。

於asp程式當中,如何Message Queue加上Transaction功能呢?

首先於asp程式第一行加上TRANSACTION=REQUIRED,告訴IIS這一個asp程式使用異動(Transaction)功能的處理方式。

Msg.Delivery = 1設定為可恢復的傳遞方式(Recoverable Delivery)。<