IT技术网www.itjs.cn

当前位置:首页 > 数据库 > MySQL > Service Broker基础应用(下)

Service Broker基础应用(下)

发布时间:2011-05-06 15:48 来源:未知

导读:在上篇《SQL Server 2008中Service Broker基础应用(上)》中,简要介绍了Service Broker的一般步骤,本文继续介绍Service Broker的设置会话优先级,存储过程中实现。

一、Service Broker的设置会话优先级

自SQL Server 2008起,对非常活跃的Service Broker应用程序,提供了设置优先级的命令CREATE BROKER PRIORITY(http://msdn.microsoft.com/en-us/library/bb934170.aspx)。通过该命令,可以设置从1至10共10个等级的颗粒度来调试会话的优先级,默认为5。在此之前,你必须得首先打开HONOR_BROKER_PRIORITY开关。

-- 设置会话优先级

--启用会话优先级选项

ALTER DATABASE BOOKDistribution

SELECT name, is_honor_broker_priority_on

/*

CREATE BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService

LOCAL_SERVICE_NAME = [//SackConsulting/BookOrderService],--本地服务

PRIORITY_LEVEL = 10)--设置优先级为10 

/*

--创建目标服务的优先级,与发起方的优先级保持一致,

USE BookStore

ALTER BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService

DROP BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService

二、Service Broker的存储过程实现

在上文中,我们使用的临时T-SQL来演示Service broker的步骤,事实上, 我们完全可以通过存储过程或外部应用程序自动激活并处理队列中的消息。使用Create Queue(http://msdn.microsoft.com/en-us/library/ms190495.aspx)和Alter Queue(http://msdn.microsoft.com/en-us/library/ms189529.aspx)选项,也可以指定可以激活并处理在同一队列中传入的消息的、同时执行的相同服务程序的数量。

继续上文的示例:

-- Creating the Bookstore Stored Procedure

USE BookDistribution

CREATE PROCEDURE dbo.usp_SB_ReceiveOrders

DECLARE @Conv_Handler uniqueidentifier

DECLARE @OrderMsg xml

-- XACT_ABORT automatically rolls back the transaction when a runtime error occurs

RECEIVE TOP(1) @OrderMsg = message_body,

IF @Message_Type_Name = '//SackConsulting/SendBookOrder'

INSERT dbo.BookOrderReceived

(@Conv_Handler,@Conv_Group, @OrderMsg )

'<orderreceived id= "' +

'"/>';

MESSAGE TYPE [//SackConsulting/BookOrderReceived]

BEGIN

COMMIT TRAN

ALTER QUEUE dbo.BookDistributionQueue

EXECUTE AS SELF)--即存储过程将以与执行Alter Queue命令的主体的相同的权限来执行

为了测试BookStore数据库的新服务程序,开始一个会话并设置新顺序:

Use BookStore

DECLARE @OrderMsg xml;

BEGIN DIALOG CONVERSATION @conv_handler

TO SERVICE '//SackConsulting/BookDistributionService'

SET @OrderMsg =

SEND ON CONVERSATION @Conv_Handler

(@OrderMsg);

当队列Status=ON并且队列中到到达新消息时,执行存储过程来处理传入的消息。可以使用存储过程或外部程序,但使用存储过程的好处是,它们提供了处理消息、自动执行所有需要的响应和相关业务任务的简单的封装好的组件。

假如在目标队列上有存储过程被执行,并且激活新的接收到的消息,那么应该已经有订单确认消息返回到dbo.BookStoreQueue:

SELECT conversation_handle, CAST(message_body as xml) message

conversation_handle message

A7B7FA73-5B5F-E011-8B4E-001C23FA56DD <orderreceived id="3439" />

*/

小结:

本文主要介绍Service Broker的设置会话优先级,存储过程中实现。下文将介绍Service broker的远程实现。

原文链接:http://www.cnblogs.com/downmoon/archive/2011/04/12/2013333.html