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

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

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