消息隊列在VB.NET數據庫開發中的應用

咱們先簡單的瞭解一下什麼是消息隊列(MSMQ)?消息隊列是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息隊列服務可是支持客戶端的運行)操做系統中通信的基礎,也是用於建立分佈式、鬆散鏈接通信應用程序的工具。這些應用程序能夠經過不一樣種類的網絡進行通信,也能夠與脫機的計算機通信。html

  消息隊列分爲用戶建立隊列和系統隊列,用戶隊列分爲:web

  1."公共隊列"在整個可傳遞消息的"消息隊列"網絡中複製並傳輸,而且有可能由網絡鏈接的全部站點訪問。sql

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

  3."管理隊列"包含確認在給定"消息隊列"網絡中發送的消息回執的消息。指定但願 MessageQueue 組件使用的管理隊列。編程

  4."響應隊列"包含目標應用程序接收到消息時返回給發送應用程序的響應消息。指定但願 MessageQueue 組件使用的響應隊列。緩存

  系統隊列分爲:服務器

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

  2."死信隊列"存儲沒法傳遞或已過時的消息的副本。tcp

  3."專用系統隊列"是一系列存儲系統執行消息處理操做所需的管理和通知消息的專用隊列。分佈式

  如今你們對消息隊列有了簡單的瞭解後,就該進入主題了。要使用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()中我並沒鏈接數據庫和請求數據,而是經過發消息來操做數據庫的,這個好處是節省了兩部分時間:

 

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

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

  在不少狀況下其實咱們並不須要看見具體的數據就知道該怎麼修改數據庫中的數據。例如要刪除張三的記錄,就能夠將一條簡單的刪除語句放入消息中,發給服務器讓服務器程序去處理對數據的更改。

  此外消息隊列的另外一個主要用途也就是當前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下經過。

遠程MSMQ

1.消息發送   

try    
  {   
  System.Messaging.MessageQueue   Queue;   
  Queue   
=     new    System.Messaging.MessageQueue( @" FormatName:DIRECT=TCP:172.26.230.2\ptest1 " );   
    
  System.Messaging.Message   Msg;   
  Msg   
=     new    System.Messaging.Message();   
  Msg.Formatter   
= new    System.Messaging.BinaryMessageFormatter();   
  Msg.Body
= " Testing   3   times " ;   
  Queue.Send(Msg);   
  }   
  
catch (Exception   ex)   
  {   
  System.Windows.Forms.MessageBox.Show(ex.ToString());   
  } 

  
    
2.消息接收   

try    
  {   
  System.Messaging.MessageQueue   mq   
=     new    System.Messaging.MessageQueue( @" FormatName:DIRECT=tcp:172.26.230.2\ptest1 " );   
    
  
//    Set   the   queue'ss   formatter   to   decode   Point   objects   
    
  mq.Formatter   
=     new    System.Messaging.BinaryMessageFormatter();   
  System.Messaging.Trustee   trustee
= new    System.Messaging.Trustee();   
    
  System.Messaging.Message   msg   
=    mq.Peek   (    new    TimeSpan( 10000 ))   ;   
    
    
  
//    Convert   received   message   to   object   that   we   think   was   sent   
    
  
string    pt    =    ( string )   msg.Body   ;   
    
  
//    Display   it   to   the   user   
    
  MessageBox.Show   (pt)   ;   
  }   
  
catch (Exception   ex)   
  {   
  MessageBox.Show(ex.ToString());   
  }   

幾點要注意的地方:

  • 關於消息的加密、路由等等特性,須要有配置Active Directory的消息隊列服務器。
  • 爲了不存放消息隊列的計算機從新啓動而丟失消息,能夠經過設置消息對象的Recoverable屬性爲true,在消息傳遞過程當中將消息保存到磁盤上來保證消息的傳遞,默認爲false
  • 消息發送方和消息接收方需採用相同的序列化格式,如XMLBinary
  • 建議每個消息隊列存放相同類型的消息對象,這樣能夠省掉獲取消息對象後,進行類型判別的麻煩。
相關文章
相關標籤/搜索