明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

消息隊(duì)列在VB.NET數(shù)據(jù)庫開發(fā)中的應(yīng)用

[摘要]我們先簡單的了解一下什么是消息隊(duì)列(MSMQ)?消息隊(duì)列是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息隊(duì)列服務(wù)但是支持客戶端的運(yùn)行)操作系統(tǒng)中通訊的基礎(chǔ),也是用于創(chuàng)建分布式、松散連接通訊應(yīng)用程序的工具。這些應(yīng)用程序可以通過不同種類的網(wǎng)絡(luò)進(jìn)行通訊,也可以與脫機(jī)的...
我們先簡單的了解一下什么是消息隊(duì)列(MSMQ)?消息隊(duì)列是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息隊(duì)列服務(wù)但是支持客戶端的運(yùn)行)操作系統(tǒng)中通訊的基礎(chǔ),也是用于創(chuàng)建分布式、松散連接通訊應(yīng)用程序的工具。這些應(yīng)用程序可以通過不同種類的網(wǎng)絡(luò)進(jìn)行通訊,也可以與脫機(jī)的計(jì)算機(jī)通訊。消息隊(duì)列分為用戶創(chuàng)建隊(duì)列和系統(tǒng)隊(duì)列,用戶隊(duì)列分為:

  · "公共隊(duì)列"在整個(gè)可傳遞消息的"消息隊(duì)列"網(wǎng)絡(luò)中復(fù)制并傳輸,并且有可能由網(wǎng)絡(luò)連接的所有站點(diǎn)訪問。

  · "專用隊(duì)列"不在整個(gè)網(wǎng)絡(luò)中發(fā)布。相反,它們僅在所駐留的本地計(jì)算機(jī)上可用。專用隊(duì)列只能由知道隊(duì)列的完整路徑名或標(biāo)簽的應(yīng)用程序訪問。

  · "管理隊(duì)列"包含確認(rèn)在給定"消息隊(duì)列"網(wǎng)絡(luò)中發(fā)送的消息回執(zhí)的消息。指定希望 MessageQueue 組件使用的管理隊(duì)列

  · "響應(yīng)隊(duì)列"包含目標(biāo)應(yīng)用程序接收到消息時(shí)返回給發(fā)送應(yīng)用程序的響應(yīng)消息。指定希望 MessageQueue 組件使用的響應(yīng)隊(duì)列。

  系統(tǒng)隊(duì)列分為:

  · "日記隊(duì)列"可選地存儲(chǔ)發(fā)送消息的副本和從隊(duì)列中移除的消息副本。

  · "死信隊(duì)列"存儲(chǔ)無法傳遞或已過期的消息的副本。

  · "專用系統(tǒng)隊(duì)列"是一系列存儲(chǔ)系統(tǒng)執(zhí)行消息處理操作所需的管理和通知消息的專用隊(duì)列。

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

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

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

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

  客戶端程序:


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

  服務(wù)端程序:


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

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

  1、對(duì)數(shù)據(jù)庫連解請求數(shù)據(jù)的時(shí)間。

  2、從數(shù)據(jù)庫返回?cái)?shù)據(jù)的時(shí)間。

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

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

  例如,假設(shè)有一個(gè)記錄所有在出差的銷售人員發(fā)送的訂單的中央隊(duì)列。這些銷售人員每天的大部分時(shí)間都以斷開連接的方式工作,記錄來自客戶站點(diǎn)的訂單信息,并且每天撥號(hào)連接一次,將所有這些信息傳輸?shù)街醒腙?duì)列中。因?yàn)橄⒃诎l(fā)送方斷開連接時(shí)仍可發(fā)送到隊(duì)列,所以銷售人員可以在記錄客戶信息時(shí)立即發(fā)送他們的消息,但系統(tǒng)會(huì)緩存這些消息直到晚間進(jìn)行撥號(hào)連接為止。

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

  其實(shí)消息隊(duì)列的編程并不復(fù)雜,但它在網(wǎng)絡(luò)環(huán)境的程序開發(fā)中是非常有用的,可以簡化大量的開發(fā)過程和節(jié)省開發(fā)時(shí)間。

  其實(shí)消息隊(duì)列的編程有很大的靈活性,幾乎可以解決網(wǎng)絡(luò)編程的大部分問題。比如聊天程序,遠(yuǎn)程控制程序。

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

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