我们先简单的了解一下什么是消息队列(MSMQ)?消息队列是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息队列服务但是支持客户端的运行)操作系统中通讯的基础,也是用于创建分布式、松散连接通讯应用程序的工具。这些应用程序可以通过不同种类的网络进行通讯,也可以与脱机的计算机通讯。

  消息队列分为用户创建队列和系统队列,用户队列分为:

  1."公共队列"在整个可传递消息的"消息队列"网络中复制并传输,并且有可能由网络连接的所有站点访问。

  2."专用队列"不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。

  3."管理队列"包含确认在给定"消息队列"网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列。

  4."响应队列"包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列。

  系统队列分为:

  1."日记队列"可选地存储发送消息的副本和从队列中移除的消息副本。

  2."死信队列"存储无法传递或已过期的消息的副本。

  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()中我并没连接数据库和请求数据,而是通过发消息来操作数据库的,这个好处是节省了两部分时间:

  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下通过。

远程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。
  • 消息发送方和消息接收方需采用相同的序列化格式,如XML或Binary。
  • 建议每一个消息队列存放相同类型的消息对象,这样可以省掉获取消息对象后,进行类型判别的麻烦。

消息队列在VB.NET数据库开发中的应用的更多相关文章

  1. python【第十一篇】消息队列RabbitMQ、缓存数据库Redis

    大纲 1.RabbitMQ 2.Redis 1.RabbitMQ消息队列 1.1 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议 ...

  2. 消息队列RabbitMQ、缓存数据库Redis

    1.RabbitMQ消息队列 1.1 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中 ...

  3. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现

    写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消息队列,而不想引入新的服务,kafk ...

  4. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  5. SQL数据库开发中的一些经典代码

    1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as  2.数据库加密: ...

  6. .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

    一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ...

  7. 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转

    线程安全使用(四)   这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...

  8. .NET中 kafka消息队列、环境搭建与使用

    前面几篇文章中讲了一些关于消息队列的知识,就每中消息队列中间件,我们并没有做详细的讲解,那么,今天我们就来详细的讲解一下消息队列之一kafka的一些基本的使用与操作. 一.kafka介绍 kafka: ...

  9. ZWave 中的消息队列机制

    文章主题   在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁.高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的.这篇文章就来看看 ZWave 中是通过什 ...

随机推荐

  1. Yet Another Ball Problem CodeForces - 1118E (简单构造)

    大意: 求构造n个pair, 每个pair满足 对于每k组, 让$b_i$为$[1,k]$, $g_i$循环右移就好了 int n, k, cnt; int main() { scanf(" ...

  2. 负载均衡中使用 Redis 实现共享 Session

    最近在研究Web架构方面的知识,包括数据库读写分离,Redis缓存和队列,集群,以及负载均衡(LVS),今天就来先学习下我在负载均衡中遇到的问题,那就是session共享的问题. 一.负载均衡 负载均 ...

  3. 51nod-1605-博弈

    1605 棋盘问题  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在 ...

  4. UVA-1220 Party at Hali-Bula (树的最大独立集)

    题目大意:数的最大独立集问题.特殊在要求回答答案是否唯一. 题目分析:定义状态dp(i,1),dp(i,0)分别表示以i为根节点的子树选不选i最多可选的人数,f(i,1),f(i,0)分别表示以i为根 ...

  5. yield 关键字

    yield 关键字向编译器指示它所在的方法是迭代器块.编译器生成一个类来实现迭代器块中表示的行为.在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值, ...

  6. ADO.NET 体系结构

    两个部分 .NET 数据提供者 DataSet 数据提供者 SqlClient 提供者 OleDb 提供者 Odbc 提供者 数据提供者组件 数据对象 DataSet

  7. node安装问题

    这个是我碰到的 这是解决方法,祝你好运

  8. 51nod1693

    题解: 首先将问题转化,可以发现操作改为两种 一种是s*=k,代价为k,一种是s--,代价为1 转化成图论,spfa跑最短路 然后更据一些证明,代价1的k<=13且为质数,并且不可能操作2连续5 ...

  9. C语言atoi函数(将字符串转化为int)

    头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为:int atoi (const char * str); [函数说明]atoi ...

  10. 部署python3.6下的django

    首先是安装好nginx,配置web目录,配置文件在confi.d中, server { # the port your site will be served on listen ; # the do ...