This topic applies only to the IBM Business Process Manager Advanced configuration.

处理 BPEL 流程中的故障

有许多方法可处理 BPEL 流程中的潜在故障。

故障是指会更改 BPEL 流程正常处理的任何异常条件,如果不进行处理,这些故障会导致意外条件或结果。设计合理的流程会预测可能的故障并采用旨在生成可预测结果的故障处理程序。为此,规划流程时,将需要尽可能多地预测潜在控制问题、预测异常将产生的结果以及必须采取的操作。

下面是 BPEL 流程编辑器中提供的用于处理故障的一些选项: 故障分为三个主要类型,如下列各部分中所述:

业务故障

业务故障是指应用程序中已知且声明的异常。这些故障由于应用程序问题(例如,由于数据内容问题)在 BPEL 流程的特定点发生。故障可以是业务规则违例或约束违例的结果。例如,调用银行服务来转移资金会导致资金不足故障。

发生业务故障时,交易不会回滚,也不会生成失败事件。因此,设计流程时,必须定义故障处理程序来处理业务故障。

在 SCA 编程模型中,业务故障由 ServiceBusinessException 对象进行传播。

系统故障

这些故障因系统相关问题(如服务不可用)或网络故障而发生。这些故障是意外故障,会在流程运行时的任意时间发生。系统故障会触发其他系统操作,如交易回流、失败事件和日志条目。

这些故障可能是短期故障(如与网络的连接临时断开)或长期故障(如磁盘故障)。要解决短期故障,有时可以使用故障处理逻辑,如重试。长期故障可能需要人员介入来更正系统故障,并接着执行恢复机制。

在 SCA 编程模型中,系统故障由 ServiceRuntimeException 对象进行传播。

标准故障

Web Service 业务流程执行语言 (WS-BPEL) 规范定义了常见系统故障的标准故障类型。可以将这些内置故障类型添加到流程定义。这些故障仅在 BPEL 流程中可用,并且在 SCA 编程模型中没有同等故障。Business Process Choreographer 可识别其他错误情境,并生成故障:bpc:timeoutbpc:serviceTerminatedbpc:runtimeFailurebpc:splitFailurebpc:cannotResolveEndpoint

表 1. BPEL 标准故障
故障名称 Description
completionConditionFailure 如果在完成 forEach 活动内直接包含的 scope 活动后,可以确定完成条件永远不会为 true 时抛出。
conflictingReceive 同时对相同伙伴链接、端口类型、操作和关联集启用多个 receive 活动或同等活动(当前是 pick 活动的 onMessage 分支)时抛出。
conflictingRequest 特定端口类型、操作和关联集的同一伙伴链接上的多个同步入站请求处于活动状态时抛出。
correlationViolation 在 invoke、receive 或 reply 活动中处理的消息内容与指定的关联信息不匹配时抛出。
forcedTermination 在包含作用域中存在故障时抛出。
invalidBranchCondition 如果 forEach 活动的分支完成条件中使用的整数值大于直接包含 scope 活动数时抛出。
invalidExpressionValue forEach 活动中使用的表达式对于所需的 XML 模式类型返回无效值时抛出。
invalidReply 已对伙伴链接、portType 和操作发送回复,但尚未对其执行具有相同关联的相应 receive 活动时抛出。
joinFailure 在连接条件求值为 false 时抛出。通过将流程或活动属性 suppressJoinFailure 设置为 yes,可以禁止此故障。
mismatchedAssignmentFailure 在 assign 活动中遇到不兼容类型时抛出。
missingReply inbound message 活动已运行,并且流程实例或作用域实例执行结束,但未运行相应的 reply 活动时抛出。
repeatedCompensation 多次调用安装的补偿处理程序时抛出。
selectionFailure 在函数(例如 bpws:getVariableData)中或在赋值中执行的选择操作遇到错误时抛出。通过将 IBM® 扩展流程属性 ignoreMissingData 设置为 yes,可以禁止此故障。
uninitializedPartnerRole invoke 活动或 assign 活动引用具有未初始化的 partnerRole 端点引用的伙伴链接时抛出。
uninitializedVariable 尝试访问消息变量中未初始化的部分时抛出。通过将 IBM 扩展流程属性 ignoreMissingData 设置为 yes,可以禁止此故障。
表 2. 非 BPEL 标准故障
故障名称 Description
cannotResolveEndpoint 如果流程端点无法解析(例如,流程使用后期绑定来调用子流程,并且该子流程的接口未定义导出)时抛出。
runtimeFailure 调用的服务返回 SCA ServiceRuntimeException 或执行用子语言(XPath 或 Java™)编写的客户代码段而生成运行时异常时抛出。例如,如果执行 Java snippet 活动生成 java.lang.NullPointerException。
serviceTerminated 属于业务流程的人员任务被用户终止时抛出。
splitFailure 属于通用化流活动的活动完成,并且所有出局链接的转换条件求值为 false 时抛出。
timeout 在长时间运行的流程中为异步服务调用指定了到期时间,并且在指定时间内未收到响应时抛出。