Service Broker整个实践过程

 一、启动Service Broker

  1. 检查Service Broker的状态
  2. SELECT is_broker_enabled FROM sys.databases WHERE database_id = db_id()

  3. 启动Service Broker
  4. ALTER DATABASE DMWSNewFunction SET ENABLE_BROKER

    二、执行服务

1. 在设计Servcie Broker应用程序时,你必须考虑到以下设计方案

  1. 消息类型(message type)
  2. 合同(conract)
  3. 队列(queues)
  4. 服务(services)
  5. 服务编程逻辑services program  logic)

2. 怎样去创造一个合同

  1. 合同定义了服务之间的消息传递类型,创造一个合同必须执行以下2个步骤:

a). 创造消息类型

  1. 用以下的语法创造消息类型:

    CREATE MESSAGE TYPE message_type_name
    [AUTHORIZATION owner_name]
    [VALIDATION =
     {NONE | EMPTY | WELL_FORMED_XML |
      VALID_XML WITH SCHEMA COLLECTION schema_collection_name}]

    VALIDATION 定义了消息包含的类型

    NONE:消息可以不被验证

    EMPTY:消息必须为空

    WELL_FORMED_XML:消息必须是XML格式

    VALID_XML:消息必须是经过符合XML Schema

    AUTHORIZATION是数据库用户或角色

    例子:

    CREATE MESSAGE TYPE 
    [//Adventure-Works.com/Expenses/ExpenseClaim] 
    VALIDATION = WELL_FORMED_XML

     

    CREATE MESSAGE TYPE 
    [//Adventure-Works.com/Expenses/ClaimResponse] 
    VALIDATION = VALID_XML WITH SCHEMA COLLECTION awschemas

b). 创造合同

  1. CREATE CONTRACT contract_name
    [ AUTHORIZATION owner_name ]
     ( message_type_name SENT BY { INITIATOR | TARGET | ANY } 
    [ ,...n] ) 

     

    message_type_name 是先前定义的消息类型,SENT BY 表示在传输过程中消息的方向。

    例子:

    CREATE CONTRACT 
    [//Adventure-Works.com/Expenses/ExpenseSubmission] 
    ( [//Adventure-Works.com/Expenses/ExpenseClaim] 
      SENT BY INITIATOR, 
      [//Adventure-Works.com/Expenses/ClaimResponse] 
      SENT BY TARGET )

    在这个例子中只有发起者可以传输ExpenseClaim消息类型,目标者传输ClaimResponse类型

3.去创造队列:他是临时存储消息的:

  1. CREATE QUEUE queue_name
       [ WITH  
         [ STATUS = { ON | OFF }  [ , ] ]
         [ RETENTION = { ON | OFF }  [ , ] ]
         [ ACTIVATION (
          [ STATUS = { ON | OFF } , ] 
          PROCEDURE_NAME = stored_procedure_name ,
          MAX_QUEUE_READERS = max_readers , 
          EXECUTE AS { SELF | USER = 'user_name' }  ) ] ]
       [ ON { filegroup | [ DEFAULT ] } ]

    例子:

    CREATE QUEUE ExpenseQueue
    CREATE QUEUE ExpenseQueueWithActivation
    WITH STATUS = OFF, 
    ACTIVATION ( PROCEDURE_NAME = ProcessExpense,  
         MAX_QUEUE_READERS = 5, 
         EXECUTE AS SELF)

     

    ExpenseQueueWithActivation 队列激活 ProcessExpense存储过程当消息到达的时候。在任何时候最大邮5个存储过程实例存在。队列刚开始是

    不可用的,在接受到消息之前我们必须用ALTER Queue去更改它的状态。

4. 去创造服务:服务连接了服务的消费者和生产者。服务包括了从会话开始到整个会话的结束。

  1. 去创造服务你必须按以下步骤:服务的名称;当服务的消费者送达消息时提供存储消息的队列;指定合同;选择在会话期间是否保存消息

    CREATE SERVICE service_name
       [ AUTHORIZATION owner_name ]
       ON QUEUE queue_name
       [ ( contract_name [ ,...n ] ) ]

    例子:

    CREATE SERVICE [//Adventure-Works.com/SubmitExpense] 
    ON QUEUE ExpensesInitiator
    ( [//Adventure-Works.com/Expenses/ProcessExpense] )
     
    CREATE SERVICE [//Adventure-Works.com/ProcessExpense] 
    ON QUEUE ExpensesTarget
    ( [//Adventure-Works.com/Expenses/ProcessExpense] )

     

5. 怎样去发送消息,在创造Service Broker各个组件后,你可以发送消息:按以下步骤发送消息:声明一个可用的对话句柄;

  1. 创造一个会话;用会话句柄和消息类型发送消息。

    DECLARE @dialog_handle uniqueidentifier  //声明会话句柄

    BEGIN DIALOG [CONVERSATION] dialog_handle_identifier  //利用BEGIN DIALOG CONVERSATION 开启对话
       FROM SERVICE service_name
       TO SERVICE 'service_name' [ , broker_instance ] 
       ON CONTRACT contract_name
       [ WITH
       [  { RELATED_CONVERSATION = conversation_handle 
          | RELATED_CONVERSATION_GROUP = conversation_group_id } ] 
       [ [ , ] LIFETIME = dialog_lifetime ] 
       [ [ , ] ENCRYPTION = { ON | OFF }  ] ]

    例子:

    BEGIN DIALOG CONVERSATION @dialog_handle
      FROM SERVICE [//Adventure-Works.com/SubmitExpense]
      TO SERVICE '//Adventure-Works.com/ProcessExpense'
     ON CONTRACT [//Adventure-Works.com/Expenses/ProcessExpense]

    发送消息:一旦会话开启,就可以用send语句去send消息了

    SEND ON CONVERSATION conversation_handle
       MESSAGE TYPE message_type_name
       [ ( message_body_expression ) ]

    例子:

    DECLARE @msgString NVARCHAR(MAX)
    SET @msgString = NCHAR(0xFEFF) + N'<root>xml data</root>'

    ;SEND ON CONVERSATION @dialog_handle
    MESSAGE TYPE [//Adventure-Works.com/Expenses/ExpenseClaim]
    (@msgString)

6. 怎样去接受消息:一旦你发送消息后,服务就会从消息队列中读取消息并处理。接受消息必须执行以下步骤:声明变量存储消息详细信息;执行Receive语句;检查消息类型并处理消息;如果会话结束,执行END CONVERSATION.

  1.  

    DECLARE @conversation UNIQUEIDENTIFIER
    DECLARE @msg NVARCHAR(MAX)
    DECLARE @msgType NVARCHAR(256)

     

    [ WAITFOR ( ]
       RECEIVE [ TOP (n) ] 
          < column_specifier > [ ,...n ]
          FROM queue_name
          [ INTO table_variable ]
          [ WHERE { conversation_handle = conversation_handle
          | conversation_group_id = conversation_group_id } ]
    [ ) ] [ , TIMEOUT timeout ]

    例子:

    ;RECEIVE TOP(1) @conversation = conversation_handle,
     @msgType = message_type_name, @msg = message_body
    FROM ExpenseQueue

7. 检查消息类型和处理消息:为了确保你接受到的是合同里的消息类型,你可以用IF语句去检查结果集中的message_type_name列。可能的消息类型有以下几种:

  1. The expected message type.
  2. An error message of the message type http://schemas.microsoft.com/SQL/ServiceBroker/Error.
  3. A dialog timeout message of the message type http://schemas.Microsoft.com/SQL/ServiceBroker/DialogTimer.
  4. An end dialog message of the message type http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog.
  5. An unknown or unexpected message type.
  6. 如果消息不是你想得到的类型,你可以结束对话并且返回一个错误消息给服务。

    例子:

    IF (@msgType = '//Adventure-Works.com/Expenses/ExpenseClaim')
      -- process @msg ...
     
    ELSE IF (@msgType =
    '
    http://schemas.microsoft.com/SQL/ServiceBroker/Error') OR
     (@msgType =
    '
    http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog')
     
     END CONVERSATION @conversation
     
    ELSE
      END CONVERSATION @conversation 
      WITH ERROR = 500 DESCRIPTION = 'Invalid message type.'

8. 结束对话:

  1.  

    END CONVERSATION conversation_handle
       [ WITH ERROR = failure_code DESCRIPTION = failure_text ]

     

    Answers

    Q.1- What is Service Oriented Architecture?

    Answer.1- SOA is a type of architecture that encourages loosely coupled communication between software services.

     

    Q.2- What are the names of the constructs, which are required to develop a service broker application?

    Answer.2- Dialog, Service instance, Route, and Remote service binding.

     

    Q.3- What type of security is supported by Service broker?

    Answer.3- Transport security and Dialog security.

     

    Q.4- When you design a Service Broker application, which parts of a service-oriented solution you must consider.

    Answer.4- Message types, Contracts, Queues, Services, and Service program logic

     

    源文档 <http://www.programmersheaven.com/2/SQL-server-2005-school-lesson-8-p4>

    http://www.programmersheaven.com/2/SQL-server-2005-school-lesson-8

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 2005 的一个主要成就是可以实现可靠、可扩展且功能完善的数据库应用程序。与 .NET Framework 2.0 公共语言运行库 (CLR) 的集成使开发人员可以将重要的业务逻辑与存储过程合并,而 T-SQL 和 XML 中的新增功能扩展了数据操作的可用范围以及开发人员可用的存储功能。另一个重要功能是 SQL Server Service Broker,它为数据库应用程序增加了可靠、可扩展、分布式异步功能。 为什么要编写异步排队操作? 在开发 SQL Server 2005 时,我们与成功开发过大型可扩展数据库应用程序的人员进行了交谈。结果发现他们几乎所有的应用程序中都有一个或多个操作是以异步排队方式执行的。股票交易系统中的结算活动是排队的,这样可以在后台进行结算,在前端处理其他交易。订单输入系统中的发货信息放在一个排队中,稍后将由另一台服务器(通常位于其他位置)上运行的发货系统读取。旅行预订系统在客户填写完路线后再进行实际的预订,并在预订完成后发送确认电子邮件。在所有这些示例中,许多工作都是通过异步方式完成的,从而提高了系统的响应速度,因此用户无须等待工作完成就可以收到响应。 在大多数大型系统中,经过仔细分析后都可以发现,许多处理都可以通过异步方式完成。虽然应用程序中的排队任务无须立即完成,但系统必须确保这些任务能够可靠地完成。Service Broker 使异步排队任务的执行可靠并且易于实现。 使应用程序中的部分任务异步执行的另一个优势是这些任务的处理工作可以在资源可用时完成。如果订单输入系统中的发货任务可以从队列中执行,发货系统就无需具有处理峰值订单负载的能力。在许多订单输入系统中,峰值订单率可能是平均订单率的两倍或三倍。由于订单输入系统必须具有处理峰值负载的能力,因此大量处理能力在很大一部分时间内都处于闲置状态。如果在出现峰值时对异步任务进行排队并在空闲时执行,将显著提高系统的利用率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值