消息队列在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
  • 建议每个消息队列存放相同类型的消息对象,这样能够省掉获取消息对象后,进行类型判别的麻烦。
相关文章
相关标签/搜索