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

调解流中的错误处理

本主题提供有关在调解流中处理错误的各种信息,包括使用“停止”和“失败”调解原语的方法、在消息中查找失败信息的位置以及如何处理 WSDL 故障。

fail 终端

处理消息的调解原语具有 fail 终端,该终端在调解流中出现失败时传播异常信息以及输入消息。异常信息将存储在消息上下文中的 failInfo 元素中。您必须将调解原语的 fail 终端连接到另一个调解原语,以便访问 failInfo。原语的 fail 终端仅传播该原语逻辑内故障的故障信息,而不传播任何下游原语的故障信息。

如果未连接原语的 fail 终端,那么故障信息不会存储在 failInfo 元素中。在此情况下,流会失败,并且服务器输出日志中仅显示异常消息。

调解原语中的运行时失败

当调解原语中发生执行失败时,会触发 fail 终端。将会抛出运行时异常,并且将该流视为已失败。如果调解流组件在全局事务下运行,那么使用资源并参与全局事务的原语可以选择回滚。

我们将使用下方显示的示例来说明调解流组件在全局事务下运行时的回滚行为。

示例流

在此流中,假设未配置全局事务,并且在“定制”原语中发生故障。由于尚未连接 fail 终端,因此流失败。由于“变换”原语不会持久保留信息且不与流的外部资源交互,因此会忽略该原语所做的工作。但是,“记录”仍会完成,原因是调解流组件不在全局事务下,因此仍记录到数据库。这是因为它与外部资源进行交互。

在同一个流中,如果配置了全局事务并且“定制”原语中再次发生故障,那么会再次忽略“变换”原语所做的工作。但是,如果“记录”原语将其事务方式属性设置为 same,那么事务将回滚,并且数据库中将不出现任何条目。如果事务方式属性设置为 new,那么事务在全局事务外落实,因此数据库中仍将出现条目。

缺省情况下,未通过全局事务限定符来设置调解流组件。您可以添加限定符以在全局事务下运行调解流组件。这通过在组合件编辑器中的调解流组件上设置限定符来完成;在属性视图的实施页面中,添加属性为 global 的事务限定符。

消息中的故障信息

当调解原语中存在故障时,异常信息存储在消息上下文中的 failInfo 元素中。此处是 XPath 表达式构建器中消息的图像,其中显示了 failnfo:

XPath 中的 failInfo

“停止”调解原语

“停止”原语具有一个 input 终端且没有 output 终端。当调解原语的 fail 或 output 终端连接到“停止”原语时,“停止”原语转至该终端的消息,并且会终止特定流路径。

如果未连接调解原语的 output 终端,那么调解流编辑器会生成警告。使用“停止”原语来禁止这些警告。在运行时中,未连接的 output 终端自动传播到“停止”。

在以下示例中,“消息过滤器”原语的 fail 终端连接到“消息记录器”,以便存储失败消息。为指示无需再执行操作,“消息记录器”会连接到“停止”原语。

此图显示连接到“停止”原语的“消息记录器”

“失败”调解原语

如果要停止流并抛出异常,请使用“失败”原语。 您可以将原语的 outpu 或 fail 终端连接到“失败”原语。 如果调解流组件在全局事务下运行,那么使用资源并参与全局事务的原语可以选择回滚。

示例:错误处理调解流

您可以创建特殊调解流来处理错误,并且从其他调解流调用这些流。例如,假设您具有名为 ErrorFlowModule 的调解模块,其中包含名为 ErrorFlow 的调解流组件和名为 ErrorFlowExport 的导出。在调解流组件中,您可能具有“消息过滤器”原语,该原语将许多错误代码定义为与终端关联的模式。根据错误代码,消息路由至流中的其他路径。

在名为 CreditCheckModule 的调解模块中,创建带有 SCA 绑定的名为 ErrorFlow 的导入,该导入必须具有与调解模块 ErrorFlowModule 的导出相同的接口。 在导入的属性视图的详细信息页面中,选择导入接口,右键单击,然后选择连接(高级)。 选择 ErrorFlowModule 和 ErrorFlowExport 作为此导入的目标。

在调解流组件 CreditCheck 中,您具有用于将其输出消息发送到 CreditLimitService 接口的 getAmount 操作的“消息过滤器”。“消息过滤器”的 fail 终端连接到“映射”原语,然后通过 ErrorFlow 导入接口传播到 ErrorFlowModule。

以下图像显示了 CreditCheck 调解流组件的请求流:

错误处理示例流

WSDL 故障消息的故障节点

WSDL 操作具有三种类型的消息 - 输入、输出和故障。 WSDL 故障是在 WSDL 操作中定义的业务错误条件(例如 StockSymbolNotFound 或 NoSuchUser)。在调解流图中,WSDL 故障通过输入故障和调出故障节点进行处理,这些节点具有针对各唯一故障消息类型的终端。 当在源或目标操作中定义了 WSDL 故障时,将在调解流编辑器中创建输入和调出故障节点:

  • 当源操作定义了 WSDL 故障消息时,将会创建输入故障节点。输入故障节点具有针对源操作中定义的各故障消息类型的 input 终端。任何传播到输入故障节点的消息都将导致从源操作返回 WSDL 故障错误消息。连接到此节点意味着将故障消息返回到客户机。在请求和响应以及错误流中将创建输入故障节点。
  • 在定义了 WSDL 故障消息的各目标操作的响应流中将创建调出故障节点。调出故障节点具有针对目标操作中定义的各故障消息类型的 output 终端。发生 WSDL 故障时,调出故障节点将消息传播到它所连接的原语或节点。 从调出节点的 output 终端进行连接可标识当对该操作的调用产生该特定故障时将生效的流。

让我们举例说明如何连接故障节点。假设您具有包含操作 getQuote 的源接口 StockQuoteService,该操作从服务提供者的 DelayedServicePortType 接口请求库存报价。

  • StockQuoteService 接口包含操作 getQuote,该操作具有输入(名为 customerID 和 symbol)、输出(名为 value)和两个故障(invalidCustomerID 和 invalidSymbol)。
  • DelayedServicePortType 接口包含操作 getQuote,该操作具有输入(名为 stockSymbol)、输出(名为 stockValue)和故障(名为 invalidSymbol)。
在请求流中,可以将输入消息发送到“数据库查找”原语,该原语检索 customerID 并在消息中设置 isValid 属性。然后,可以使用“消息过滤器”原语根据 isValid 的值来路由消息。如果 customerID 有效,那么会将消息发送到目标操作。如果 customerID 无效,那么会通过输入故障节点将消息返回到客户机。以下图像显示了此流:

WSDL 故障:示例请求流

在响应流中,可以将调出故障节点的无效 symbol 终端连接到输入故障节点的无效 symbol 终端,并以“映射变换”原语介于之间。以下图像显示了该响应流:

WSDL 故障示例响应流

如果未连接故障,那么在运行时的行为将如同故障连接到输入响应节点一样。

未建模故障

由 WSDL 操作返回且未定义为 WSDL 故障的错误称为“未建模故障”。在调解流编辑器中没有为这些类型的故障创建输入或调出故障节点。 在此情况下,输入消息类型会传播到调出响应节点的 fail 终端。将在消息上下文的 failinfo 元素中捕获故障信息。

要处理未建模故障,可以将调出响应节点的 fail 终端连接到调解原语。例如,可以将调出响应节点的 fail 终端连接到“消息记录器”调解原语以记录所有未建模故障。您可以在调出响应节点上设置属性,以确定是应该记录整个请求消息还是仅记录消息头信息。

如果未连接 fail 终端并且接收到未建模故障,那么将发生调解运行时异常。

错误流

调解流具有针对各源操作的错误流。错误流对未处理错误执行全部捕获操作。

在缺省情况下,错误流包含以下内容:
  • 具有设置为 anyType 的 catchAll 终端的错误输入节点。 错误输入节点接收包含错误信息的服务消息对象。
  • 用于请求响应操作的输入响应节点。您可以使用此节点将错误消息返回到源操作。
  • 当源操作定义了 WSDL 故障消息时,将会创建输入故障节点。输入故障节点具有针对源操作中定义的各故障消息类型的 input 终端。任何传播到输入故障节点的消息都将导致从源操作返回 WSDL 故障错误消息。连接到此节点意味着将故障消息返回到客户机。
您可以将原语连接到错误输入节点以捕获错误信息。例如,连接到“消息记录器”以记录服务消息对象。您也可以将错误处理逻辑置于可复用子流中。

您可以使用错误流来审计和停止可能在操作请求或响应流中发生的意外错误。例如,可以使用“消息记录器”来捕获服务消息对象,然后将记录器连接到“失败”原语。当请求或响应流中原语的未连接 fail 终端中发生错误时,将执行错误流。

具有“消息记录器”和“失败”原语的错误流

您也可以使用错误流来使用服务消息对象的 failInfo 元素中提供的信息并返回未建模故障消息。 在错误流中,只需将 failureString 从 failInfo 映射到建模故障消息并连接到输入故障节点即可。然后,当请求或响应流中发生 WSDL 故障时,会将故障消息返回到客户机。

具有连接到输入故障节点的“消息记录器”和“映射”原语的错误流