技术开发 频道

配置SQL Server服务代理来发送存储过程数据

  【IT168 技术文档】在SQL Server 2005中,Microsoft引进了一个令人振奋的新特性即服务代理(Service Broker),同时这也给许多数据库管理人员带来了一个新的概念。这个概念,进程外消息,是一个开发人员在一些产品中使用多年的应用,如Microsoft Message Queue (MSMQ)。实现这个功能,需要运行一个SQL Server命令,并且对该命令的数据进行处理。但是,因为用户不需要命令的输出,因此它不需要立刻进行处理。这里就是消息队列发挥作用地方。
 
  正常情况下,当用户在SQL Server中启动存储过程时,他们必须等待存储过程完成数据处理,然后再进行下一个动作。通过使用服务代理,他们可以让实际数据处理排队等候一下。在这种情况下,用户将运行存储过程而非数据处理。我们将输入数据打包作为一个消息,然后将消息发到队列去。我们配置队列自动读取信息,并处理信息中的数据。

 

CREATE SERVICE [tcp://SearchSQLServer/SampleService] AUTHORIZATION dbo
ON QUEUE [tcp://SearchSQLServer/SampleQueue]
(
[tcp://SearchSQLServer/SampleContract]
)  

  消息可以在同一个数据库中发送,可以在一个服务器上的一个数据库发送到另一个数据库,或在服务器之间包括因特网上的服务器之间发送。这个过程就如同邮件一样。当我给我的朋友发一封邮件,他接收到邮件之后可以进行读取(信息处理),接着可以就根据内容做点什么。服务代理就是以这样的方式运作的。

  设置服务代理发送和接收消息的四个步骤:

  在实际发送和接收消息之前,服务代理有几个组件需要配置。比如,我们将消息输入一个队列来作自动处理。这些消息的处理可以是自动的,或者是某个Windows应用所需要的,或者队列中读取消息的服务。

  与其它对象一样,服务代理名称在数据库中必须是唯一的。然而,如果准备在服务器之间发送消息,那么在设置服务代理对象名称时,就必须加倍细心。一般情况下,我们都推荐将系统名称和功能名称组合起来作为服务代理对象名称。这样可以确保在整个企业中,对象名称都是唯一的。当在内部使用了服务代理的系统之间发送消息并且想要避免对象命名问题时,你会发现这样做是非常方便的。可以使用UNC形式名称来保证唯一性。比如,我们将从tcp://SearchSQLServer/开始对象的命名。

  1、第一步需要在服务代理中设置的对象是消息类型,它告诉SQL Server消息的基本信息。服务代理消息可以是任意数据类型:文本、二进制、XML、数据等等。推荐使用的是XML,因为它可以包含其它任意数据类型。我们使用CREATE MESSAGE TYPE命令来创建消息类型。其中有四个验证选项。如果想要执行有效的XML格式化,可以选择WELL_FORMED_XML或VALID_XML WITH SCHEMA COLLECTION(使用一个XSD来执行XML模式)。

CREATE MESSAGE TYPE [tcp://SearchSQLServer/SampleMessageType] AUTHORIZATION  
dbo
VALIDATION
= NONE  

  2、下一步我们需要配置的对象是契约(Contract)。它告诉SQL Server哪些消息类型是相关的。我个人倾向于在一个特定进程中对所有的通信使用一个的消息类型,以保持简单。然而,Microsoft SQL Server Books OnLine的例子在发送系统使用一个消息类型,而接收系统使用另一个类型。

CREATE CONTRACT [tcp://SearchSQLServer/SampleContract] AUTHORIZATION dbo
(
[tcp://SearchSQLServer/SampleMessageType] SENT BY ANY
)  

  3、现在让我们来看看服务代理上的实际队列。这个队列有点像一个表格。在这里存储了等待处理的的消息。与表格不一样的是,你无法定义队列的模式。因此,推荐使用XML来发送,这样你才可以在XML中来定义模式。

CREATE QUEUE [tcp://SearchSQLServer/SampleQueue] AUTHORIZATION dbo  

  下一个服务代理的配置对象是服务。服务是服务代理用来在数据库中消息传送到正确的队列,同时将契约绑定到队列消息中。

0
相关文章