SQL Server 2008中Service Broker基础应用(下 )

【转载】http://blog.csdn.net/downmoon/archive/2011/04/12/6317360.aspx

导读:在上篇《 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开关。
  1. -- 设置会话优先级  
  2. --启用会话优先级选项  
  3. ALTER DATABASE BookStore  
  4. SET HONOR_BROKER_PRIORITY ON  
  5. --启用会话优先级选项  
  6. ALTER DATABASE BOOKDistribution  
  7. SET HONOR_BROKER_PRIORITY ON  
  8. --查看设置结果  
  9. SELECT name, is_honor_broker_priority_on  
  10. FROM sys.databases  
  11. WHERE name IN ('BookStore''BookDistribution')  
  12. /*  
  13. name is_honor_broker_priority_on  
  14. BookStore 1  
  15. BookDistribution 1  
  16. */  
  17. USE BookStore  
  18. GO  
  19. CREATE BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService  
  20. FOR CONVERSATION  
  21. SET (CONTRACT_NAME = [//SackConsulting/BookOrderContract],--特定的契约  
  22. LOCAL_SERVICE_NAME = [//SackConsulting/BookOrderService],--本地服务  
  23. REMOTE_SERVICE_NAME = ANY,--远程服务为ANY,即Service Broker端点的任何相关服务  
  24. PRIORITY_LEVEL = 10)--设置优先级为10  
 
  通过sys.conversation_priorities目录视图,查询优先级
  1. SELECT name, priority, service_contract_id,  
  2. local_service_id,remote_service_name  
  3. FROM sys.conversation_priorities cp  
  4. /*  
  5. name priority service_contract_id local_service_id remote_service_name  
  6. Conv_Priority_BookOrderContract_BookOrderService 10 65536 65536 NULL  
  7. */  
 
  如果你希望包含服务和契约名称,可以将服务和从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  )目录视图关联起来。
  1. USE BookDistribution  
  2. GO  
  3. --创建目标服务的优先级,与发起方的优先级保持一致,  
  4. --以使会话的优先级设置覆盖整个会话的生命周期  
  5. CREATE BROKER PRIORITY Conv_Priority_BookOrderContract_BookDistributionService  
  6. FOR CONVERSATION  
  7. SET (CONTRACT_NAME = [//SackConsulting/BookOrderContract],  
  8. LOCAL_SERVICE_NAME = [//SackConsulting/BookDistributionService],  
  9. REMOTE_SERVICE_NAME = ANY,  
  10. PRIORITY_LEVEL = 10)  
  11. USE BookStore  
  12. GO  
  13. ALTER BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService  
  14. FOR CONVERSATION  
  15. SET (REMOTE_SERVICE_NAME = '//SackConsulting/BookDistributionService')  
  16. --修改远程服务名称  
  17. ALTER BROKER PRIORITY Conv_Priority_BookOrderContract_BookOrderService  
  18. FOR CONVERSATION  
  19. SET (PRIORITY_LEVEL = 9)  
  20. --设置优先级  
  21. --删除优先级设置  
  22. 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  )选项,也可以指定可以激活并处理在同一队列中传入的消息的、同时执行的相同服务程序的数量。
继续上文的示例:
  1. -- Creating the Bookstore Stored Procedure  
  2. USE BookDistribution  
  3. GO  
  4. CREATE PROCEDURE dbo.usp_SB_ReceiveOrders  
  5. AS  
  6. DECLARE @Conv_Handler uniqueidentifier  
  7. DECLARE @Conv_Group uniqueidentifier  
  8. DECLARE @OrderMsg xml  
  9. DECLARE @TextResponseMsg varchar(8000)  
  10. DECLARE @ResponseMsg xml  
  11. DECLARE @Message_Type_Name nvarchar(256);  
  12. DECLARE @OrderID int;  
  13. -- XACT_ABORT automatically rolls back the transaction when a runtime error occurs  
  14. SET XACT_ABORT ON  
  15. BEGIN TRAN;  
  16. RECEIVE TOP(1) @OrderMsg = message_body,  
  17. @Conv_Handler = conversation_handle,  
  18. @Conv_Group = conversation_group_id,  
  19. @Message_Type_Name = message_type_name  
  20. FROM dbo.BookDistributionQueue;  
  21. IF @Message_Type_Name = '//SackConsulting/SendBookOrder'  
  22. BEGIN  
  23. INSERT dbo.BookOrderReceived  
  24. (conversation_handle, conversation_group_id, message_body)  
  25. VALUES  
  26. (@Conv_Handler,@Conv_Group@OrderMsg )  
  27. SELECT @OrderID = @OrderMsg.value('(/order/@id)[1]''int' )  
  28. SELECT @TextResponseMsg =  
  29. '<orderreceived id= "' +  
  30. CAST(@OrderID as varchar(10)) +  
  31. '"/>';  
  32. SELECT @ResponseMsg = CAST(@TextResponseMsg as xml);  
  33. SEND ON CONVERSATION @Conv_Handler  
  34. MESSAGE TYPE [//SackConsulting/BookOrderReceived]  
  35. (@ResponseMsg );  
  36. END  
  37. IF @Message_Type_Name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'  
  38. BEGIN  
  39. END CONVERSATION @Conv_Handler;  
  40. END  
  41. COMMIT TRAN  
  42. GO  
 
  解析: 该存储过程包含处理//SackConsulting/SendBookOrder和http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog消息类型的逻辑。如果发送发后者,特定会话的句柄的特定会话会结束。如果接收到图书订单消息类型,它的消息将插入到表中,并且返回订单确认信息。
  可以使用Alter Queue命令修改既有的队列。这个命令使用与Create Queue相同的选项,它允许改变队列的状态与保持期、待激活的存储过程、队列读取存储过程实例的最大数量以及过程的安全模式契约。
  Alter Queue包括一个额外的参数Drop,它用来删除队列的所有存储过程激活设置。
  使用Alter Queue命令将存储过程绑定到既有的队列:
  1. ----使用Alter Queue命令将存储过程绑定到既有的队列  
  2. ALTER QUEUE dbo.BookDistributionQueue  
  3. WITH ACTIVATION (STATUS = ON,  
  4. PROCEDURE_NAME = dbo.usp_SB_ReceiveOrders,  
  5. MAX_QUEUE_READERS = 2,--独立处理队列中不同消息的同一存储过程同时执行的最大数量  
  6. EXECUTE AS SELF)--即存储过程将以与执行Alter Queue命令的主体的相同的权限来执行  
 
  为了测试BookStore数据库的新服务程序,开始一个会话并设置新顺序:
  1. Use BookStore  
  2. GO  
  3. DECLARE @Conv_Handler uniqueidentifier  
  4. DECLARE @OrderMsg xml;  
  5. BEGIN DIALOG CONVERSATION @conv_handler  
  6. FROM SERVICE [//SackConsulting/BookOrderService]  
  7. TO SERVICE '//SackConsulting/BookDistributionService'  
  8. ON CONTRACT [//SackConsulting/BookOrderContract];  
  9. SET @OrderMsg =  
  10. '<order id="3490" customer="29" orderdate="7/22/2008">  
  11. <LineItem ItemNumber="1" ISBN="1-59059-592-0" Quantity="2" />  
  12. </order>';  
  13. SEND ON CONVERSATION @Conv_Handler  
  14. MESSAGE TYPE [//SackConsulting/SendBookOrder]  
  15. (@OrderMsg);   
 
  当队列Status=ON并且队列中到到达新消息时,执行存储过程来处理传入的消息。可以使用存储过程或外部程序,但使用存储过程的好处是,它们提供了处理消息、自动执行所有需要的响应和相关业务任务的简单的封装好的组件。
  如果在目标队列上有存储过程被执行,并且激活新的接收到的消息,那么应该已经有订单确认消息返回到dbo.BookStoreQueue:
  1. SELECT conversation_handle, CAST(message_body as xml) message  
  2. FROM dbo.BookStoreQueue  
  3. /*  
  4. conversation_handle message  
  5. A7B7FA73-5B5F-E011-8B4E-001C23FA56DD <orderreceived id="3439" />  
  6. */  
 
小结: 本文主要介绍Service Broker的设置会话优先级,存储过程中实现。

转载于:https://www.cnblogs.com/lipton/archive/2011/05/09/2041658.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值