我們先簡單的了解一下什麼是消息隊列(MSMQ)?消息隊列是 Windows
(NT也有MSMQ
WIN
/
/me/xp不含消息隊列服務但是支持客戶端的運行)操作系統中通訊的基礎
也是用於創建分布式
松散連接通訊應用程序的工具
這些應用程序可以通過不同種類的網絡進行通訊
也可以與脫機的計算機通訊
消息隊列分為用戶創建隊列和系統隊列
用戶隊列分為
· 公共隊列在整個可傳遞消息的消息隊列網絡中復制並傳輸並且有可能由網絡連接的所有站點訪問
· 專用隊列不在整個網絡中發布相反它們僅在所駐留的本地計算機上可用專用隊列只能由知道隊列的完整路徑名或標簽的應用程序訪問
· 管理隊列包含確認在給定消息隊列網絡中發送的消息回執的消息指定希望 MessageQueue 組件使用的管理隊列
· 響應隊列包含目標應用程序接收到消息時返回給發送應用程序的響應消息指定希望 MessageQueue 組件使用的響應隊列
系統隊列分為
· 日記隊列可選地存儲發送消息的副本和從隊列中移除的消息副本
· 死信隊列存儲無法傳遞或已過期的消息的副本
· 專用系統隊列是一系列存儲系統執行消息處理操作所需的管理和通知消息的專用隊列
現在大家對消息隊列有了簡單的了解後就該進入主題了要使用msmq進行軟件開發需要安裝msmq安裝完後就該進入實際的開發階段先打開vsnet ide中的服務起資源管理器展開你想建立消息隊列的計算機名再展開消息隊列右擊它在彈出菜單中選擇新建建立一個新的消息隊列並為它指定一個名字這個名字可以隨意也可以通過編程來完成代碼如下
systemMessagingMessageQueueCreate(\Private$\MyPrivateQueue)建立專用隊列
SystemMessagingMessageQueueCreate(myMachine\MyQueue)建立公共隊列
其實我認為使用那中方法並不重要重要的是搞清楚專用隊列和公共隊列的差別(其他隊列不是必須的)在本例中是通過服務器資源管理器分別在服務器上建立了專用隊列和公共隊列
程序功能本程序分為兩部分包括服務器程序(安裝在sql server服務器上)和客戶端程序客戶端的作用是用來編寫tsql語句並將tsql語句放在消息中並將消息發送到sql server服務器上的消息隊列中去服務器程序檢查指定的消息隊列當發現有新消息到達時就開始執行消息中的內容由於消息中的內容是tsql語句所以服務器端實際上是執行對數據庫的操作
客戶端程序
public Sub client()
Dim tM As New SystemMessagingMessageQueue()
tMPath = \Private$\jk FORMATNAME:PUBLIC=ddccfdcedbed與指定計算機中的消息隊列建立連接
Dim newMessage As New SystemMessagingMessage(TextBoxText)接受文本筐的tsql語句
newMessageLabel = This is the label消息名字
tMSend(newMessage)發送消息
End Sub
服務端程序
public Sub server()
Dim NewQueue As New SystemMessagingMessageQueue(\Private$\jk)FORMATNAME:PUBLIC=ddccfdcedbed與指定計算機中的消息隊列建立連接
Dim m As SystemMessagingMessage
查看消息隊列中的消息
m = NewQueueReceive
mFormatter = New SystemMessagingXmlMessageFormatter(New String() {SystemStringmscorlib})
Dim st As String
st = mBody消息隊列中消息的消息內容既sql語句
Dim con As New OleDbOleDbConnection(輸入自己的數據庫連接字符串)
conOpen()
Dim com As New OleDbOleDbCommand(st con)執行消息中的sql語句
comExecuteNonQuery()
conClose()
End Sub
我為什麼要使用消息隊列來處理數據庫的操作這個問題我一直沒回答現在我就來回答這個問題在本程序中你會發現在sub client()中我並沒連接數據庫和請求數據而是通過發消息來操作數據庫的這個好處是節省了兩部分時間
對數據庫連解請求數據的時間
從數據庫返回數據的時間
在很多情況下其實我們並不需要看見具體的數據就知道該怎麼修改數據庫中的數據例如要刪除張三的記錄就可以將一條簡單的刪除語句放入消息中發給服務器讓服務器程序去處理對數據的更改
此外消息隊列的另一個主要用途也就是當前erp軟件中必不可少的就是在斷開連接時保存信息當連接恢復時發送消息消息在如下兩種情況中無法迅速地傳遞到它們的隊列當隊列駐留的計算機無法工作時或當路由消息所需的域控制器無法工作時消息隊列可讓您應對這些情況使得在從網絡上斷開連接或必要的計算機或控制器無法工作時仍可以繼續發送消息在這些情形下消息暫時存儲在本地計算機或傳遞路由上的某個計算機的隊列中直到完成傳遞所需的資源重新聯機
例如假設有一個記錄所有在出差的銷售人員發送的訂單的中央隊列這些銷售人員每天的大部分時間都以斷開連接的方式工作記錄來自客戶站點的訂單信息並且每天撥號連接一次將所有這些信息傳輸到中央隊列中因為消息在發送方斷開連接時仍可發送到隊列所以銷售人員可以在記錄客戶信息時立即發送他們的消息但系統會緩存這些消息直到晚間進行撥號連接為止
在斷開連接時要怎麼保存消息呢?向斷開連接的隊列發送消息同向可用隊列發送消息的過程幾乎完全相同當要向其發送的隊列不可用時不必進行任何特殊的配置以使組件將消息存儲在臨時隊列中在client代碼的tMPath = \Private$\jk後面有一條注釋語句其實這條語句就是實現向斷開連接的隊列發送消息的功能只要將tMPath = \Private$\jk這條語句換成tMPath = FORMATNAME:PUBLIC=ddccfdcedbed其中PUBLIC後面的數字是要發送到計算機的guid數字這個數字可以打開那台計算機的消息隊列的屬性看見使用這種方法就可以在斷開連接的情況下保證對服務器的操作是有效現在運行這個程序後打開win中的開始》程序》管理工具》計算機管理在計算機管理窗口中展開服務和應用程序》消息隊列》傳出隊列你將在右邊的窗口中看見你建立的消息(如果你使用tMPath = \Private$\jk語句在計算機管理窗口中展開服務和應用程序》消息隊列》專用隊列可以看見你建立的隊列)
其實消息隊列的編程並不復雜但它在網絡環境的程序開發中是非常有用的可以簡化大量的開發過程和節省開發時間
其實消息隊列的編程有很大的靈活性幾乎可以解決網絡編程的大部分問題比如聊天程序遠程控制程序
本文針對消息隊列做了一個簡單的介紹並舉了一個例來說明怎麼在net下使用消息編程達到快速高效穩定的對數據庫進行操作最後補充要說的是在internet中也一樣可以使用消息隊列只需要將tMPath = FORMATNAME:PUBLIC=ddccfdcedbed語句後面的數字變成消息隊列所在服務器的數字就可以了但是要提醒大家的是使用消息在傳輸時將占有大量的帶寬所以在不是必須的時候internet下的編程不要使用消息
在vbnetwin sql server 下通過
From:http://tw.wingwit.com/Article/program/net/201311/15668.html