BROKER_INSTANCE参数是service_broker_guid字段的值,它来自远程服务器上的sys.databases 数据库视图。 在队列之间发送消息,我们必须使用两个命令:第1个是BEGIN DIALOG命令,然后是SEND命令。使用BEGIN DIALOG命令来在发送和接收服务之间创建一个会话。如果我们使用一个已经存在的会话,那么我们就不需要使用BEGIN DIALOG命令。
在使用BEGIN DIALOG命令创建了一个新的会话之后,通过使用BEGIN DIALOG命令返回的会话句柄,我们就可以使用SEND命令在会话上发送消息。 DECLARE/font> ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
BROKER_INSTANCE参数是service_broker_guid字段的值,它来自远程服务器上的sys.databases 数据库视图。
在队列之间发送消息,我们必须使用两个命令:第1个是BEGIN DIALOG命令,然后是SEND命令。使用BEGIN DIALOG命令来在发送和接收服务之间创建一个会话。如果我们使用一个已经存在的会话,那么我们就不需要使用BEGIN DIALOG命令。在使用BEGIN DIALOG命令创建了一个新的会话之后,通过使用BEGIN DIALOG命令返回的会话句柄,我们就可以使用SEND命令在会话上发送消息。
DECLARE/font> @dialog_handle UNIQUEIDENTIFIER, @XMLData XML ; SET @XMLData = (SELECT * FROM sys.tables FOR XML AUTO) BEGIN DIALOG @dialog_handle FROM SERVICE [tcp://SearchSQLServer/SampleService] TO SERVICE 'tcp://SearchSQLServer/SampleService' ON CONTRACT [tcp://SearchSQLServer/SampleContract]; SEND ON CONVERSATION @dialog_handle MESSAGE TYPE [tcp://SearchSQLServer/SampleMessageType] (@XMLData); |
可以使用RECEIVE命令来查看和处理消息。RECEIVE命令与SELECT很相似,它们都返回数据。然而,当使用RECEIVE命令时,消息只能接收一次。在消息被接收之后,如果它是会话的最后一个消息——大多数人在会话中只是输入一个消息——那么,使用END CONVERSATION命令来关闭它。RECEIVE命令可以与WAITFOR命令一起使用,而WHILE循环则在一个运行过程的队列中处理所有消息。
DECLARE @dialog_handle UNIQUEIDENTIFIER, @XMLData XML ; RECEIVE TOP (1) @dialog_handle = conversation_handle, @XMLData = CAST(message_body AS XML) FROM [tcp://SearchSQLServer/SampleQueue] END CONVERSATION @dialog_handle SELECT @XMLData |
当结束会话时,事实上会有一个消息从接收队列发送到发送队列来通知发送队列、服务和SQL Server会话已经关闭了。这个结束会话的消息必须由发送队列来处理,以便从队列删除数据。我们建议在发送队列上使用一个基本过程来自动清除这些消息。
CREATE PROCEDURE usp_ProcessAck AS DECLARE @xml AS XML DECLARE @dialog_handle as uniqueidentifier WHILE 1=1 SET @dialog_handle = NULL WAITFOR ( RECEIVE TOP (1) @dialog_handle = conversation_handle, @xml = cast(message_body as xml) FROM [tcp://SearchSQLServer/SampleQueue]), TIMEOUT 1000 IF @dialog_handle IS NULL break END CONVERSATION @dialog_handle END GO |
在我们创建了这个过程之后,再使用ALTER QUEUE来创建队列来自动地在消息到达时通过使用QUEUE的ACTIVATION命令自动运行该过程。我们可以通过设置MAX_QUEUE_READERS大于1来设置过程的并行执行数目。在繁重负荷的系统中,或者当处理花费一段时间时,额外的队列读取程序可以通过并行队列的数据处理来加速数据处理。
ALTER QUEUE [tcp://SearchSQLServer/SampleQueue] WITH ACTIVATION (STATUS=ON, PROCEDURE_NAME = dbo.usp_ProcessAck, MAX_QUEUE_READERS = 2, EXECUTE AS SELF) |
SQL Server Service Broker的配置可能很复杂,同时在因特网上关于它的文档也不多。然而,一旦配置并且正确地运行了Service Broker,那么它可以提供一个坚实的内部数据库或者外部数据库通信平台来快速一致地在系统之间发送数据。
作者
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
微软发布Linux SQL Server预览版 不只推广新特性
微软最近发布了SQL Server 2016 SP1,它为用户提供了在Linux系统上可用的SQL Server。微软这么做是为了扩大SQL Server的用户群,推广SQL Server的新特性。
-
SQL Server 2005支持服务结束 升级何去何从
SQL Server 2005的支持就要结束了,就在2016年4月12日,SQL Server 2005的客户们应该升级了。
-
SQL Server 2005即将终止服务 你准备好了么?
2016年4月12日,微软将正式终止SQL Server 2005相关服务。微软正在终止扩展支持,这意味着不再有新特性更新,什么都没了。
-
管理Azure SQL数据库的授权安全性
本文深入介绍了一些支持细粒度控制数据访问的Azure SQL数据库授权方法,它们最多可以深入到控制各个数据库对象和语句类型。