網站如何加入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)。
若此asp程式內所有程式執行成功時,包括更新數個資料庫和Message Queue的Message的傳送或接收,將呼叫OnTransactionCommit()副程式。若執行失敗時,譬如更新任何一個資料庫失敗,將呼叫OnTransactionAbort()副程式。
Message Queue加上Transaction功能,asp程式如下:
<%@ TRANSACTION=REQUIRED LANGUAGE=VBScript %>
...
<%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 ‘Recoverable Delivery
Msg.Send Queue
Queue.Close
Sub OnTransactionCommit
...
End Sub
Sub OnTransactionAbort
...
End Sub
……