Service Broker基础应用(下)

导读:在上篇《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开关。

-- 设置会话优先级

--启用会话优先级选项
ALTERDATABASE BookStore
SET HONOR_BROKER_PRIORITY ON

--启用会话优先级选项
ALTERDATABASE BOOKDistribution
SET HONOR_BROKER_PRIORITY ON

--查看设置结果
SELECT name, is_honor_broker_priority_on
FROM sys.databases
WHERE name IN ('BookStore', 'BookDistribution')

/*
name is_honor_broker_priority_on
BookStore 1
BookDistribution 1
*/

USE BookStore
GO
CREATE BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService
FOR CONVERSATION
SET (CONTRACT_NAME =[//SackConsulting/BookOrderContract],--特定的契约
LOCAL_SERVICE_NAME =[//SackConsulting/BookOrderService],--本地服务
REMOTE_SERVICE_NAME =ANY,--远程服务为ANY,即Service Broker端点的任何相关服务
PRIORITY_LEVEL =10)--设置优先级为10 

通过sys.conversation_priorities目录视图,查询优先级

SELECT name, priority, service_contract_id,
local_service_id,remote_service_name
FROM sys.conversation_priorities cp

/*
name priority service_contract_id local_service_id remote_service_name
Conv_Priority_BookOrderContract_BookOrderService 10 65536 65536 NULL
*/

如果你希望包含服务和契约名称,可以将服务和从sys.conversation_priorities(http://msdn.microsoft.com/zh-cn/library/bb895280%28v=sql.100%29.aspx)返回的契约ID与sys.service_contracts(http://msdn.microsoft.com/en-us/library/ms184378.aspx),sys.services(http://msdn.microsoft.com/en-us/library/ms174429.aspx)目录视图关联起来。

USE BookDistribution
GO
--创建目标服务的优先级,与发起方的优先级保持一致,
--
以使会话的优先级设置覆盖整个会话的生命周期

CREATE BROKER PRIORITY Conv_Priority_BookOrderContract_BookDistributionService
FOR CONVERSATION
SET (CONTRACT_NAME =[//SackConsulting/BookOrderContract],
LOCAL_SERVICE_NAME
=[//SackConsulting/BookDistributionService],
REMOTE_SERVICE_NAME
=ANY,
PRIORITY_LEVEL
=10)

USE BookStore
GO
ALTER BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService
FOR CONVERSATION
SET (REMOTE_SERVICE_NAME ='//SackConsulting/BookDistributionService')
--修改远程服务名称

ALTER BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService
FOR CONVERSATION
SET (PRIORITY_LEVEL =9)
--设置优先级

--删除优先级设置
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
GO
CREATEPROCEDURE dbo.usp_SB_ReceiveOrders
AS
DECLARE@Conv_Handleruniqueidentifier
DECLARE@Conv_Groupuniqueidentifier
DECLARE@OrderMsg xml
DECLARE@TextResponseMsgvarchar(8000)
DECLARE@ResponseMsg xml
DECLARE@Message_Type_Namenvarchar(256);
DECLARE@OrderIDint;

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

BEGINTRAN;

RECEIVE
TOP(1) @OrderMsg= message_body,
@Conv_Handler= conversation_handle,
@Conv_Group= conversation_group_id,
@Message_Type_Name= message_type_name
FROM dbo.BookDistributionQueue;

IF@Message_Type_Name='//SackConsulting/SendBookOrder'
BEGIN
INSERT dbo.BookOrderReceived
(conversation_handle, conversation_group_id, message_body)
VALUES
(
@Conv_Handler,@Conv_Group, @OrderMsg )
SELECT@OrderID=@OrderMsg.value('(/order/@id)[1]', 'int' )
SELECT@TextResponseMsg=
'<orderreceived id= "'+
CAST(@OrderIDasvarchar(10)) +
'"/>';
SELECT@ResponseMsg=CAST(@TextResponseMsgas xml);
SEND
ON CONVERSATION @Conv_Handler
MESSAGE TYPE
[//SackConsulting/BookOrderReceived]
(
@ResponseMsg );
END

IF@Message_Type_Name='http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
BEGIN
END CONVERSATION @Conv_Handler;
END
COMMITTRAN
GO

解析:该存储过程包含处理//SackConsulting/SendBookOrder和http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog消息类型的逻辑。如果发送发后者,特定会话的句柄的特定会话会结束。如果接收到图书订单消息类型,它的消息将插入到表中,并且返回订单确认信息。

可以使用Alter Queue命令修改既有的队列。这个命令使用与Create Queue相同的选项,它允许改变队列的状态与保持期、待激活的存储过程、队列读取存储过程实例的最大数量以及过程的安全模式契约。

Alter Queue包括一个额外的参数Drop,它用来删除队列的所有存储过程激活设置。

使用Alter Queue命令将存储过程绑定到既有的队列:

----使用Alter Queue命令将存储过程绑定到既有的队列
ALTER QUEUE dbo.BookDistributionQueue
WITH ACTIVATION (STATUS =ON,
PROCEDURE_NAME
= dbo.usp_SB_ReceiveOrders,
MAX_QUEUE_READERS
=2,--独立处理队列中不同消息的同一存储过程同时执行的最大数量
EXECUTEAS SELF)--即存储过程将以与执行Alter Queue命令的主体的相同的权限来执行

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

Use BookStore
GO

DECLARE@Conv_Handleruniqueidentifier
DECLARE@OrderMsg xml;

BEGIN DIALOG CONVERSATION @conv_handler
FROM SERVICE [//SackConsulting/BookOrderService]
TO SERVICE '//SackConsulting/BookDistributionService'
ON CONTRACT [//SackConsulting/BookOrderContract];

SET@OrderMsg=
'<order id="3490" customer="29" orderdate="7/22/2008">
<LineItem ItemNumber="1" ISBN="1-59059-592-0" Quantity="2" />
</order>
';

SEND
ON CONVERSATION @Conv_Handler
MESSAGE TYPE
[//SackConsulting/SendBookOrder]
(
@OrderMsg);

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

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

SELECT conversation_handle, CAST(message_body as xml) message
FROM dbo.BookStoreQueue
/*
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

【编辑推荐】

  1. Service Broker基础应用(上)
  2. 简述Service Broker事件通知功能
  3. 一个Excel导入SQL Server的例子
  4. 优化你的DiscuzNT,让它跑起来
  5. 浅述当前模式读与一致性读的区别

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/287006.html<

(0)
管理的头像管理
上一篇2025-05-15 15:05
下一篇 2025-05-15 15:07

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注