使用 Service Broker 生成应用程序

任何可运行 Transact-SQL 语句的程序均可使用 Service Broker。Service Broker 应用程序可实现为在 SQL Server 外部运行的程序,也可以实现为用 Transact-SQL 或 .NET 语言编写的存储过程。

使用 Service Broker 的程序通常由一起协同工作以完成某项任务的若干组件组成。启动会话的程序创建一条消息并将其发送到另一服务。该程序可能会等待响应,也可能立即退出并依靠另一程序来处理该响应。对于作为会话目标的服务,程序接收来自服务队列的传入消息、读取消息数据、执行任何必要的处理,如有必要,它还将创建并发送响应消息。

Service Broker 扩展 Transact-SQL。应用程序不需要与 Service Broker 协同工作的特殊的对象模型或库。相反,程序向 SQL Server 发送 Transact-SQL 命令,并处理这些命令的结果。应用程序可由 Service Broker 激活、可作为后台服务运行、可作为预定作业运行,也可以作为对事件的响应而启动。有关启动使用 Service Broker 的应用程序的策略的详细信息,请参阅选择启动策略

有关创建使用 Service Broker 的应用程序的信息,请参阅 用 Service Broker 编程的优点

Service Broker 应用程序概述

下图显示使用 Service Broker 的应用程序中的交互过程:

会话中的关系和消息流

如图所示,首先创建 SubmitExpenseAcceptDenyExpenseReimbursementIssued 消息类型。然后基于这些消息类型创建 ProcessExpenses 约定,它提供一个架构,使会话能够完成退款任务。ProcessExpenses 约定控制 ProcessExpense 服务与 SubmitExpense 服务间的所有会话。ProcessExpenses 约定及其使用的消息类型必须同时存在于特定的数据库中,这些数据库是与拥有基于此约定的会话的所有服务相关的数据库。

Service Broker 在 SubmitExpense 服务的队列中存储发送给该服务的消息。ExpenseSubmission 存储过程接收来自此队列的消息、处理这些消息,如果需要答复的话,则将消息发送到另一服务。

Service Broker 在 ProcessExpense 服务的队列中存储发送给该服务的消息。ExpenseProcessing 存储过程接收来自此队列的消息、处理这些消息,如果需要答复的话,则将消息发送到另一服务。

这两个服务间的会话将按如下方式构造:

  • 用户通过用户界面提交退款申请。应用程序运行 ExpenseSubmission 存储过程,此过程创建一条 SubmitExpense 消息。SubmitExpense 服务启动与 ProcessExpense 服务的会话,然后将 SubmitExpense 消息发送给 ProcessExpense 服务。

  • Service Broker 接收 ProcessExpense 服务的 SubmitExpense 消息,并将消息放到 ExpenseQueue 队列中。ExpenseQueue 队列激活 ProcessExpense 存储过程,此过程将 SubmitExpense 消息从队列中取出并进行处理。然后,ProcessExpense 存储过程创建一条 AcceptDenyExpense 消息,并将此消息发送到 SubmitExpense 服务。如果支出请求被拒绝,则 ProcessExpense 存储过程将结束会话。

  • Service Broker 将 SubmitExpense 服务的 AcceptDenyExpense 消息放到该服务的队列中。如果 ProcessExpense 过程结束了会话,则 Service Broker 将一条 EndDialog 消息放到 Expenses 队列中。该队列激活 ExpenseSubmission 存储过程,此过程将 AcceptDenyExpense 消息从队列中取出并进行处理。如果 ExpenseSubmission 存储过程在队列中找到 EndDialog 消息,则此过程就结束会话。

  • 如果支出请求被接受,则 ProcessExpense 服务创建并发送一条 ReimbursementIssued 消息,确认付款已发出,然后结束会话。Service Broker 将这些消息放到该服务的队列中。此队列激活 ExpenseSubmission 过程,此过程对 ReimbursementIssued 消息进行处理。然后此过程对 EndDialog 消息进行处理,并结束会话。