本主题仅适用于 IBM Business Process Manager Advanced 配置。

用于 BPEL 流程中的活动的状态过渡图

在活动实例的执行过程中遇到重要步骤时,该活动实例的状态将更改。状态和状态过渡取决于活动的类型。

状态和状态过渡在基本活动的生命周期内十分重要。基本活动分组为下列活动类型。状态过渡图根据活动类型的不同而有所变化:

与流程实例的状态图不同,活动结束状态并不显式公开。活动的生命周期取决于外层流程。活动始终随流程实例一起删除。

这些图中使用的约定

图中的状态过渡由编号指示。随后的支持文本对这些编号进行了说明。此外,这些图还包含下列类型的符号:
符号 说明
此符号代表瞬态状态。
瞬态状态。这些状态不可视。
此符号代表持久状态。
持久状态。
此符号代表自动触发的状态过渡。
由业务流程管理器自动触发的状态过渡。
此符号代表外部交互引起的状态过渡。
用户交互(例如,通过 API 请求)引起的状态过渡。
此符号代表由业务流程管理器或用户交互控制的状态过渡。
由业务流程管理器或用户交互控制的状态过渡。

生存期较短的活动类型的状态过渡图

以下状态图显示了生存期较短的简单活动类型的状态和状态过渡,如:分配、清空、应答、重抛、抛出、终止和 Java 片段活动。它引入了以下状态:不活动、已跳过、已完成、已失败、已停止和已终止。这些状态是所有基本活动类型的公共状态。

此图显示了生存期较短的活动从“不活动”状态到其中一种结束状态的状态和状态过渡。

创建活动后,它处于“不活动”状态 (1)。封闭在流中的活动可以有多个入局链接和连接条件。必须对所有入局链接进行导航,才能启动此类活动。活动的 suppressJoinFailure 属性和连接条件求值结果确定了该活动的后续行为:
  • 连接条件求值为 false 并且 suppressJoinFailure 属性设置为 true

    活动状态更改为“已跳过”(2),并且离开该活动的链接将作为死路径进行导航。

  • 连接条件求值为 false 并且 suppressJoinFailure 属性设置为 false

    该活动尚未启动,因此仍处于“不活动”状态,并且将引发 bpws:joinFailure 标准故障。

  • 连接条件求值为 true
    对于未封闭在流中的活动而言,这是预期的行为。 活动的后续行为取决于它是否具有在活动入口进行求值的出口条件。
    • 如果出口条件求值为 true,那么活动状态更改为“已跳过”(2),并且将对离开该活动的链接的过渡条件求值。
    • 如果出口条件求值为 false 或者未指定出口条件,那么将激活该活动,并且其状态更改为“正在运行”(3a)。将运行活动实施,并且在活动成功完成时,其后续行为取决于它是否具有在活动入口进行求值的出口条件。
      • 如果这种出口条件已指定并且求值为 true,或者如果未指定这种出口条件,那么活动状态将更改为“已完成”(3b),并且将对离开该活动的链接的过渡条件进行求值。
      • 如果出口条件求值为 false,那么活动状态将更改为“已停止”(9b)。
      如果出错时继续设置设为“”并且实施失败(例如,当分配活动中复制语句的语法不正确时),那么活动状态将更改为“已失败”(3c)。所有生存期较短的活动都不可中断。因此,“正在运行”状态永远不可视。

可以跳过处于任何状态(包括“不活动”状态)的活动实例。如果活动处于“不活动”状态,那么通过导航遇到该活动时,状态将从“不活动”更改为“已跳过”(2),而与连接条件的结果无关。 还将对离开活动的链接的过渡条件进行求值。如果自动跳过了该活动,那么不会对这些条件求值。

流程的出错时继续设置设为“”时的故障处理行为
如果出错时继续设置设为“”,那么未由故障链接或直接外层故障处理程序捕获的故障将导致该活动进入“已停止”状态 (9a - 9d)。在以下情况下,可以到达“已停止”状态:
  • 激活活动失败(例如,如果对连接条件求值期间发生异常)。

    活动状态从“不活动”更改为“已停止”(9a)。该活动可以由管理员借助于 forceRetryforceJoinCondition API 请求进行修复。对于 forceRetry API 请求,活动状态将更改为“不活动”(10a),并将重试对活动的激活。如果重试成功,那么状态将更改为“正在运行”(3a),并最终更改为“已完成”(3b)。如果重试不成功,那么活动将再次进入“已停止”状态 (14)。 对于 forceJoinCondition API 请求,活动状态将更改为“不活动”(10a),然后,根据作为 API 参数传递的条件值,状态将更改为“正在运行”(3a) 或“已跳过”(2)。

    您可以使用 API 修复请求来更改“出错时继续”行为。如果这样做之后激活再次失败,那么活动将以“不活动”状态 (10a) 结束,并且故障会传播给外层作用域的故障处理程序。

  • 活动的实施失败(例如,由于分配语句中的 XPath 表达式导致异常)。

    活动状态将从“正在运行”更改为“已停止”(9b)。由于状态更改发生在单个事务中,因此“正在运行”状态不可视。

    该活动可以由管理员借助于 forceRetry API 请求进行修复。该活动将重新进入“正在运行”状态 (10b)。该活动也可以通过 forceComplete API 请求进行修复。 在这种情况下,该活动将进入“已完成”状态 (11),而流程的导航会继续。

    如果活动已修复,那么在修复步骤期间活动实施再次失败时,会再次进入“已停止”状态 (14)。如果使用 API 修复请求更改了“出错时继续”行为并且实施再次失败,那么活动将以“已失败”状态结束,并且故障会传播给外层作用域的故障处理程序。

  • 对离开活动的链接上过渡条件的求值失败。

    发生错误之前活动状态为“已完成”或“已跳过”(9c 或 9d)。该活动可以由管理员借助于 forceComplete API 请求进行修复。如果求值成功,那么状态再次为“已完成”(11)。如果求值不成功,那么活动状态为“已停止”(14) 或“已失败”(12)。

    或者,该活动可以借助于 forceNavigate API 请求进行修复。在这种情况下,管理员可以确定应该遵循活动的哪些出局链接。活动状态将更改回“已完成”(11),不会对过渡条件求值,但指定链接的过渡条件将视为求值为 true。这意味着,如果活动处于并行流中,那么所有其他链接将作为死路径进行导航。

如果活动处于“已停止”状态并且外层作用域已终止(例如,由于并行分支中未捕获的故障),那么该活动将终止。其状态更改为“已终止”状态 (13)。

等待外部事件的活动的状态过渡图

下图显示了等待或接收活动的生命周期内可能发生的状态和状态过渡。

此图显示接收和等待活动从“不活动”状态到其中一种结束状态的状态过渡。

接收和等待活动的开始阶段以及与“已停止”状态的状态过渡与生存期较短的活动相同。 但是,在激活接收活动和等待活动后,状态将更改为“正在等待”而不是“正在运行”(3)。现在,接收活动或等待活动已准备好接收外部请求或等待指定的超时,然后才能完成并移入“已完成”状态 (4)。 对于接收活动而言,到“已完成”状态的过渡由所接收的消息触发。对于等待活动而言,此过渡在经过所指定等待时间后自动执行,或者可以使用强制完成 API 请求强制执行。但是,如果接收或等待活动具有其条件求值属性设置为 on exit 的出口条件,并且该出口条件求值为 false,那么活动状态将更改为“已停止”(9b) 而不是“已完成”。如果为活动定义了失效,那么活动或者外层作用域或流程的管理员可以在它失效时重新调度 (21),而不更改活动的状态。

等待活动或接收活动可能会在活动启动完成前失败,例如,对等待活动的等待时间的求值失败时。如果出错时继续设置设为“”,或者故障由外层作用域内的故障链接或故障处理程序处理,那么故障会导致活动状态更改为“已失败”(6),使其无法进入“正在等待”状态。

当活动处于“正在等待”状态时,外层流程可能会接收到终止请求,与等待活动或接收活动并行的分支中也可能会发生故障。如果发生其中任何事件,那么等待活动或接收活动将终止,并且活动状态将更改为“已终止”(5)。

当等待活动或接收活动处于“正在等待”状态时,可以跳过该活动。 活动状态会立即更改为“已跳过”状态 (20)。在这种情况下,将对离开活动的链接的过渡条件进行求值。

选取(接收选择)活动的状态过渡图

以下状态图中显示了选取活动(也称为接收选择活动)的状态和状态过渡。此图显示了选取活动从“不活动”状态到其中一种结束状态的状态过渡。

对于选取活动,状态和状态过渡 (1) 到 (6) 以及与“已停止”和“已跳过”状态之间的过渡与接收活动相同。

此外,如果正在等待的选取活动的警报分支在选取活动的请求到达前激活,那么选取活动可能会失效。这样一来,该活动将进入“已失效”状态 (7)。

调用活动的状态过渡图

对于调用活动,状态图取决于对应服务是以同步方式还是异步方式调用的。下图显示了采用异步实施的调用活动的生命周期内可能发生的状态和状态过渡。 如果服务应答在服务请求事务的后续事务中发生,那么该实施是异步实施。

此图显示了调用活动从“不活动”状态到其中一种结束状态的状态过渡。

调用活动的激活与所有其他活动类型的激活相同 (1) (2)。

当调用活动正常运行至完成时,该活动将启动,并且状态将更改为“正在运行”(3)。如果服务调用成功返回,那么该活动将进入“已完成”状态 (4)。

只要服务未应答或活动处于“已停止”状态,管理员就可以强制重试或强制完成活动。如果服务无法应答(例如,由于系统停运),那么此功能会很有用。对应 API 也可能使状态从“正在运行”过渡到“已停止”(9)、“已失败”(8) 和“已完成”(4)。

与所有其他活动一样,调用活动也可以停止 (9)。接着,它可能由管理操作修复,也可能由于外层作用域或流程终止而终止 (13)。

如果对活动定义了失效,处于“正在运行”状态的活动可能会失效。 这样一来,该活动将进入“已失效”状态 (7),并将抛出超时故障。 此故障可以由故障处理程序进行处理。

如果该活动的外层作用域终止(例如,由于流程中某条并行路径发生故障),并且该活动处于“正在运行”状态,那么该活动也将终止并进入“已终止”状态 (5)。

具有同步服务调用的调用活动的状态过渡与 Java 片段的状态过渡相同。 同步调用与异步调用之间的状态和状态过渡的差别如下所示:
  • 具有同步服务调用的调用活动的“正在运行”状态永远不可视。
  • 失效不适用于具有同步调用的调用活动;这些活动永远不会进入“已失效”状态。
  • 具有同步服务调用的调用活动永远不会终止。

具有单一或顺序所有权的人员任务活动的状态过渡图

下图显示了具有单一或顺序所有权的任务的人员任务活动生命周期内可能发生的状态和状态过渡。
此图显示检取活动从“不活动”状态到其中一种结束状态的状态过渡。

人员任务活动的运行时行为与调用活动类似。调用活动的“正在运行”状态与人员任务活动的“就绪”状态和“已申领”状态相对应。“就绪”状态表明该活动可供人员处理。 当某个人员申领该活动以便对其进行处理时,该活动将进入“已申领”状态 (15)。

处理该活动的人员负责提供所需的信息并完成该活动。 接着,该活动将进入“已完成”、“已失败”或“已停止”状态。或者,申领该活动的人员也可能确定该活动无法完成。于是,该人员释放该活动,以由其他人员对其进行处理。在这种情况下,该活动将回到“就绪”状态 (16)。

当人员任务活动处于“就绪”或“已申领”状态时,可以跳过该活动。在这两种情况下,状态将更改为“已跳过”,并且内联人员任务将终止。在以下导航步骤中,将对离开活动的链接的过渡条件进行求值。

其他状态过渡与具有异步服务调用的调用活动相同。

具有并行所有权的人员任务活动的状态过渡图

具有并行所有权的任务的状态图类似于异步调用活动的状态图。激活人员任务活动后,该活动将进入“正在运行”状态。当所有必需的潜在所有者均已完成其工作后,该活动即完成。“就绪”和“已申领”状态不能用于与具有并行所有权的任务相关联的活动。