VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > VBnet >
  • vb.net教程之消息隊列在VB.NET數據庫開發中的應用

  • 2017-06-06 17:45 來源:未知
 我們先簡單的了解一下什么是消息隊列(MSMQ)?消息隊列是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息隊列服務但是支持客戶端的運行)操作系統中通訊的基礎,也是用于創建分布式、松散連接通訊應用程序的工具。這些應用程序可以通過不同種類的網絡進行通訊,也可以與脫機的計算機通訊。消息隊列分為用戶創建隊列和系統隊列,用戶隊列分為:

  · "公共隊列"在整個可傳遞消息的"消息隊列"網絡中復制并傳輸,并且有可能由網絡連接的所有站點訪問。

  · "專用隊列"不在整個網絡中發布。相反,它們僅在所駐留的本地計算機上可用。專用隊列只能由知道隊列的完整路徑名或標簽的應用程序訪問。 

  · "管理隊列"包含確認在給定"消息隊列"網絡中發送的消息回執的消息。指定希望 MessageQueue 組件使用的管理隊列 

  · "響應隊列"包含目標應用程序接收到消息時返回給發送應用程序的響應消息。指定希望 MessageQueue 組件使用的響應隊列。

  系統隊列分為:

  · "日記隊列"可選地存儲發送消息的副本和從隊列中移除的消息副本。

  · "死信隊列"存儲無法傳遞或已過期的消息的副本。 

  · "專用系統隊列"是一系列存儲系統執行消息處理操作所需的管理和通知消息的專用隊列。

  現在大家對消息隊列有了簡單的了解后,就該進入主題了。要使用msmq進行軟件開發需要安裝msmq。安裝完后就該進入實際的開發階段。先打開vs.net ide中的"服務起資源管理器"展開你想建立消息隊列的計算機名,再展開"消息隊列"右擊它在彈出菜單中選擇"新建"建立一個新的消息隊列,并為它指定一個名字,這個名字可以隨意。也可以通過編程來完成,代碼如下:

system.Messaging.MessageQueue.Create(".\Private$\MyPrivateQueue")'建立專用隊列
System.Messaging.MessageQueue.Create("myMachine\MyQueue")'建立公共隊列

  其實我認為使用那中方法并不重要,重要的是搞清楚專用隊列和公共隊列的差別(其他隊列不是必須的)。在本例中是通過"服務器資源管理器"分別在服務器上建立了專用隊列和公共隊列。

  程序功能:本程序分為兩部分包括服務器程序(安裝在sql server服務器上)和客戶端程序,客戶端的作用是用來編寫t-sql語句并將t-sql語句放在消息中,并將消息發送到sql server服務器上的消息隊列中去。服務器程序檢查指定的消息隊列當發現有新消息到達時,就開始執行消息中的內容,由于消息中的內容是t-sql語句所以服務器端實際上是執行對數據庫的操作。

  客戶端程序:


public Sub client()
Dim tM As New System.Messaging.MessageQueue()
tM.Path = ".\Private$\jk" '"FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"'與指定計算機中的消息隊列建立連接,
Dim newMessage As New System.Messaging.Message(TextBox1.Text)'接受文本筐的t-sql語句
newMessage.Label = "This is the label"'消息名字,
tM.Send(newMessage)'發送消息
End Sub 

  服務端程序:


public Sub server()
Dim NewQueue As New System.Messaging.MessageQueue(".\Private$\jk")'"FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"'與指定計算機中的消息隊列建立連接,
Dim m As System.Messaging.Message
'查看消息隊列中的消息
m = NewQueue.Receive 
m.Formatter = New System.Messaging.XmlMessageFormatter(New String() {"System.String,mscorlib"})
Dim st As String
st = m.Body'消息隊列中消息的消息內容。既sql語句
Dim con As New OleDb.OleDbConnection("輸入自己的數據庫連接字符串")
con.Open()
Dim com As New OleDb.OleDbCommand(st, con)'執行消息中的sql語句
com.ExecuteNonQuery()
con.Close()
End Sub 

  我為什么要使用消息隊列來處理數據庫的操作這個問題我一直沒回答,現在我就來回答這個問題。在本程序中你會發現在sub client()中我并沒連接數據庫和請求數據,而是通過發消息來操作數據庫的,這個好處是節省了兩部分時間:

  1、對數據庫連解請求數據的時間。

  2、從數據庫返回數據的時間。

  在很多情況下其實我們并不需要看見具體的數據就知道該怎么修改數據庫中的數據。例如要刪除張三的記錄,就可以將一條簡單的刪除語句放入消息中,發給服務器讓服務器程序去處理對數據的更改。

  此外消息隊列的另一個主要用途也就是當前erp軟件中必不可少的,就是在斷開連接時保存信息,當連接恢復時發送消息。消息在如下兩種情況中無法迅速地傳遞到它們的隊列:當隊列駐留的計算機無法工作時,或當路由消息所需的域控制器無法工作時。"消息隊列"可讓您應對這些情況,使得在從網絡上斷開連接或必要的計算機或控制器無法工作時,仍可以繼續發送消息。在這些情形下,消息暫時存儲在本地計算機或傳遞路由上的某個計算機的隊列中,直到完成傳遞所需的資源重新聯機。

  例如,假設有一個記錄所有在出差的銷售人員發送的訂單的中央隊列。這些銷售人員每天的大部分時間都以斷開連接的方式工作,記錄來自客戶站點的訂單信息,并且每天撥號連接一次,將所有這些信息傳輸到中央隊列中。因為消息在發送方斷開連接時仍可發送到隊列,所以銷售人員可以在記錄客戶信息時立即發送他們的消息,但系統會緩存這些消息直到晚間進行撥號連接為止。

  在斷開連接時要怎么保存消息呢?向斷開連接的隊列發送消息同向可用隊列發送消息的過程幾乎完全相同。當要向其發送的隊列不可用時,不必進行任何特殊的配置以使組件將消息存儲在臨時隊列中。在client代碼的tM.Path = ".\Private$\jk"后面有一條注釋語句,其實這條語句就是實現向斷開連接的隊列發送消息的功能。只要將tM.Path = ".\Private$\jk"這條語句換成tM.Path = "FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"其中PUBLIC后面的數字是要發送到計算機的guid數字。這個數字可以打開那臺計算機的消息隊列的屬性看見。使用這種方法就可以在斷開連接的情況下保證對服務器的操作是有效。現在運行這個程序后,打開win2000中的"開始"-》"程序"-》"管理工具"-》"計算機管理"。在"計算機管理"窗口中展開"服務和應用程序"-》"消息隊列"-》"傳出隊列",你將在右邊的窗口中看見你建立的消息。(如果你使用tM.Path = ".\Private$\jk"語句,在"計算機管理"窗口中展開"服務和應用程序"-》"消息隊列"-》"專用隊列"可以看見你建立的隊列。)

  其實消息隊列的編程并不復雜,但它在網絡環境的程序開發中是非常有用的,可以簡化大量的開發過程和節省開發時間。

  其實消息隊列的編程有很大的靈活性,幾乎可以解決網絡編程的大部分問題。比如聊天程序,遠程控制程序。

  本文針對消息隊列做了一個簡單的介紹,并舉了一個例來說明怎么在.net下使用消息編程,達到快速高效穩定的對數據庫進行操作。最后補充要說的是在internet中也一樣可以使用消息隊列,只需要將tM.Path = "FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75語句后面的數字變成消息隊列所在服務器的數字就可以了。但是要提醒大家的是使用消息在傳輸時將占有大量的帶寬,所以在不是必須的時候,internet下的編程不要使用消息。

  在vb.net、win2000 、sql server 2000下通過。

本欄文章均來自于互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用于商業或者其他目的。

相關教程