使用 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 的应用程序中的交互过程:
如图所示,首先创建 SubmitExpense、AcceptDenyExpense 和 ReimbursementIssued 消息类型。然后基于这些消息类型创建 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 消息进行处理,并结束会话。