Broker 系统消息

Service Broker 使用三种系统消息类型来传递来自 Service Broker 的状态和错误信息。

处理系统消息

Service Broker 会话中的大多数消息都是应用程序定义的用来在服务间进行通信的消息。每个消息都必须符合由 CREATE MESSAGE TYPE 语句定义的消息类型格式。会话可以使用的消息类型集由 BEGIN DIALOG CONVERSATION 语句中指定的约定定义。

除了约定中指定的由应用程序定义的消息类型以外,任何会话还都可以接收类型为三种系统定义消息类型之一的消息。这些消息类型由 Service Broker 用来报告对话的错误和状态。每个应用程序必须包含用于处理错误消息和结束对话消息的逻辑。如果应用程序为对话会话设置了会话计时器,则应用程序必须包含用于处理对话计时器消息的逻辑。Service Broker 向每个服务都提供这些消息类型,无论它们是否出现在服务的约定中。有关详细信息,请参阅处理 Service Broker 错误消息

错误消息

当远程服务以错误结束对话,或者本地 Broker 在对话中检测到无法恢复的错误时,本地 Broker 会创建一个错误消息。错误消息的消息类型为 **https://schemas.microsoft.com/SQL/ServiceBroker/Error**。错误消息验证为格式正确的 XML。

错误消息中包含的 XML 文档使用命名空间 **https://schemas.microsoft.com/SQL/ServiceBroker**。文档根元素的本地名称为 Error,它包含一个名为 Code 的元素和一个名为 Message 的元素。Code 元素中是一个整数值。Message 元素中是供人阅读的消息文本。

例如,某一处理费用报表的服务生成的错误消息可以包含下列 XML(已重新设置格式以提高可读性):

<?xml version="1.0"?>
<Error xmlns="https://schemas.microsoft.com/SQL/ServiceBroker">
  <Code>12</Code>
  <Description>
    Unknown cost center "127-1000". Please check the cost center list
    and resubmit the report.
  </Description>
</Error>

在接收对话消息之前,接收操作先接收错误消息而非对话计时器消息。无论错误消息以何种顺序到达队列,情况均是如此。当队列既包含对话计时器消息又包含错误消息时,接收操作先接收对话计时器消息,然后再接收错误消息。

对话的错误消息到达后,如果应用程序尝试向该对话发送消息,则 Broker 会引发错误。但是,即使在应用程序收到错误消息之后,应用程序也可以接收该对话的任何剩余消息。

结束对话消息

当应用程序结束对话且没有指定错误时,本地 Broker 会向远程 Broker 发送结束对话消息。结束对话消息的消息类型为 **https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog**。

结束对话消息为空消息。接收操作按照结束对话消息在队列中的到达顺序接收该消息。

对话计时器消息

对话计时器消息指示对话的会话计时器已过期。这些消息的消息类型为 **https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer**。会话计时器只针对会话的一端;Service Broker 从不将对话计时器消息发送给会话的另一端。

对话计时器消息为空消息。无论超时消息到达队列的先后顺序如何,接收操作都先接收对话的对话计时器消息,然后才接收对话的其他消息。