BizTalk Server 中的僵停

什么是僵停?

  • 僵停消息是指这样的消息:从 messagebox 路由到一个正在运行的业务流程,但在该业务流程结束时仍处于“正在处理”状态。 “正在处理”的消息是已经路由到服务实例的消息,因此它位于以该服务实例为目标的 messagebox 队列中。 由于该消息不能再被订阅业务流程实例所处理,因此该消息将被挂起,其 ServiceInstance/State 值标记为“已挂起(不可恢复)”。

  • 僵停服务实例是指这样一种业务流程实例:消息已从 messagebox 路由到该业务流程实例,而该业务流程实例完成时消息处于“正在处理”状态。 由于该业务流程实例已结束,不能再处理“正在处理”中的消息,因此该业务流程将被挂起,其 ServiceInstance/State 值标记为“已挂起(不可恢复)”。

典型原因

僵停通常发生在以下几种情况下:

  1. 终止控制消息 – 业务流程引擎允许使用控制消息来取消特定业务流程实例中当前正在运行的所有工作。 由于控制消息会立即停止正在运行的业务流程,因此出现僵停实例是意料之中的。 一些与工作流相关的设计和其他一些设计倾向于使用此机制。

  2. 并行侦听接收 – 在此方案中,服务实例等待 n 条消息中的 1 条消息,当收到某些消息时,它会执行一些工作并终止。 如果服务实例终止时并行分支上收到消息,则会产生僵停。

  3. 具有非确定性终结点的顺序护送 – 在此方案中,主业务流程计划旨在处理特定类型的所有消息,以满足某种类型的系统设计要求。 这些设计要求可能包括按序送达、资源分配器和批处理。 对于这种方案,通常定义一个围绕侦听的 while 循环,其中一个分支包含接收形状,而另一个分支包含延迟形状,后跟某种构造,构造中设置一些变量,用以指明该 while 循环的结束条件。 此机制具有不确定性,因为可以触发延迟,但仍然能够传送消息。 类似这样的不确定性终结点都有可能造成僵停。

    当僵尸服务实例挂起时,将生成以下错误消息:

0xC0C01B4C The instance completed without consuming all of its messages. The instance and its unconsumed messages have been suspended.

可以使用 BizTalk 终止符 来帮助删除僵尸。

另请参阅

UI 指南和开发人员 API 命名空间参考中删除挂起的服务实例