处理消息流中的错误

集成节点为所有消息流提供了基本错误处理功能。 如果基本处理不能彻底解决,且您想对某些出错条件和情况执行特定操作,可使用消息流节点终端增强消息流以提供自己的错误处理。

关于此任务

例如,您可能想将消息流设计为可预测您想以特殊方式处理的某些错误。 另一个示例是消息流更新数据库,并且必须在其他消息处理未成功完成时回滚这些更新。

您可用于该操作的选项在某些情况下相当复杂。 为 MQInput超时通知 节点提供的选项非常广泛,因为这些节点会处理持久消息和事务。 MQInput 节点也受 WebSphere® MQ的配置选项的影响。

由于您决定以不同方式处理不同的错误,因此没有相关固定过程的描述。 本部分提供了有关错误处理的原则以及可用的选项,并且您必须根据本部分提供的详细信息来决定每种情况下所需要的选项组合。

有两种常规方法用于处理消息流中的错误:
  • 失败检查

    通过节点的 Failure 终端来显式检查在该节点中发生的任何错误。 如果发生错误,那么异常列表会传播至 Failure 终端。 执行中的消息会保持与调用节点前的消息相同。

    您可以在节点中引入更多专业化的错误检查,这些检查可使用 ESQL 进行定制。 例如,您可以在这些节点内创建出口处理程序。 有关使用 ESQL 创建出口处理程序的更多信息,请参阅 DECLARE HANDLER 语句

  • 捕获异常

    如果未连接 Failure 终端,那么节点中的故障将转换为从节点抛出的异常。 这样将撤销抛出异常前对执行中的消息进行的任何更改。 异常可能导致回滚当前事务,这意味着将撤销对事务资源进行的任何更新。 Root 和 Local Environment 树并行回滚。 在流的整个事务回滚之前,不会回滚 Environment 树。

    您可以通过在消息流中包含 特赖卡奇 节点来阻止事务回滚,并控制消息更改反向的程度。 如果在 特赖卡奇 节点的 Try 终端之外抛出了异常,那么会将异常列表传播到该节点的 Catch 终端。 正在运行的消息将还原为它在到达 特赖卡奇 节点之前所处的状态。

    大多数消息流节点都有 Catch 终端。 这些节点通常位于事务开始处,在此处未捕获的异常将导致回滚。 在这些节点中, Catch 终端的行为就像 特赖卡奇 节点直接连接到 Out 终端一样。 使用 Catch 终端来处理在消息流节点之外抛出的任何异常。 连接 Failure 终端以处理节点本身的错误。

您可在消息流中选择一个或多个选项:

  • 将节点的 Failure 终端连接到处理节点内部异常的一系列节点(fail 流)。
  • 将节点的 Catch 终端连接到处理节点外部生成的异常的一系列节点(Catch 流)。
  • 在消息流中的特定点插入一个或多个 特赖卡奇 节点,以捕获和处理连接到 Try 终端的流所生成的异常。
  • 包含 抛出 节点,或者对 ESQL THROW 语句进行编码以生成异常。
  • 确保 MQInput 节点接收到的所有消息都在事务中进行处理,或者在事务中未进行处理。
  • 确保 MQInput 节点接收到的所有消息都是持久消息或不是持久消息。

如果您要将用户定义节点包含在消息流里,则必须参考节点提供的信息,以了解如何处理这些节点中的错误。 本部分中的描述仅涵盖内建节点。

当设计您的错误处理方法时,请考虑以下因素:

  • 大多数内建节点都具有 Failure 终端。 例外情况包括 聚集控制聚集请求输入标签输出传递出版跟踪特赖卡奇 节点。

    在节点内检测到异常时,消息和异常信息会传播到此节点的 Failure 终端。 如果该节点没有 Failure 终端或者未连接该终端,那么该集成节点将抛出异常,并将控制权归还给能够处理该异常的最接近上游节点。 此节点可能是 特赖卡奇 节点, AggregateReply 节点,也可能是输入节点。

    如果 MQInput 节点检测到内部错误,那么其行为略有不同。 如果未连接 Failure 终端,那么 MQInput 节点会尝试将消息放入输入队列的回退队列,或者如果未定义该队列,那么会将消息放入与集成节点关联的队列管理器的死信队列。

    有关更多信息,请参阅 处理 MQInput 节点错误

  • 许多内置节点都具有 Catch 终端。 这些节点通常位于事务开始处。 例如:
    • 输入节点: 文件输入HTTPInputJMSInputMQInputPeopleSoftInputSAPInputSCAInput, SiebelInputSOAPInputTCPIPClientInput (TCPIPClientInput)TCPIPServerInput
    • 输出和响应节点: SCAAsyncResponse, SOAPAsyncResponse
    • 路由节点: AggregateReply, 收集器, 重新排序
    • 构造节点: 特赖卡奇
    • 计时器节点: 超时通知

    仅当消息先在节点外部传播(例如,传播到已连接到 Out 终端的节点),此消息才会传播到 Catch 终端。

  • 当消息传播到 Failure 终端或 Catch 终端时,节点会创建新的异常列表并在其中显示一个异常,表明已发生的错误。 异常列表作为消息树的一部分进行传播。 当由于 Out 或 Catch 流中发生的问题(例如,重复的解析错误导致达到回退阈值)而导致将消息传播至 Failure 终端时,原始解析错误不包含在异常列表中;异常列表包含指示已达到回退阈值的异常。
  • MQInput超时通知 节点具有对事务性消息的其他处理 (其他输入节点不处理事务性消息)。

    有关更多信息,请参阅 处理 MQInput 节点错误处理超时通知错误

  • 如果包含指定了以下内容的 跟踪 节点:$Root$Body,将解析完整消息。 这可能会生成其他方式检测不到的解析器错误。
错误处理的一般原则为:
  • 如果您连接输入节点的 Catch 终端,那么表明此流会处理 out 流中任何地方所生成的全部异常。 除非在 catch 流上抛出异常,否则集成节点不会回滚事务。 如果 catch 流成功完成,那么落实消息。 如果要在发生并捕获异常后执行任何回滚操作,则必须在 Catch 流中提供该功能。
  • 如果未连接输入节点的 Catch 终端,那么可以连接至 Failure 终端并提供 fail 流来处理节点所生成的异常。 当节点中发生异常时,会立即启动 fail 流。

    如果在节点外生成了异常,并且您尚未连接 Catch 终端,那么 HTTPInput 节点不会将消息传播到 Failure 终端。

  • 如果节点将消息传播到 Catch 流,且发生另一个异常以致将控制再次返回到相同消息流节点,则节点会以未连接 Catch 终端的情况来处理消息。
  • 如果未连接输入节点的 Failure 终端或 Catch 终端,那么集成节点将提供缺省处理(此处理视输入节点类型不同而有所变化)。
  • 如果需要更全面的错误和恢复方法,请包含一个或多个 特赖卡奇 节点以提供更多本地化的错误处理区域。
  • 如果您对特殊错误采用同一过程进行处理,将可能会发现应创建包含所需的一系列节点的子流。 只要您需要执行该操作时,便包含该子流。
  • 如果您已在输入节点中设置安全处理,并且抛出了安全异常,那么消息不会传播到消息流。 消息将被回退或者返回错误。 有关更多信息,请参阅 安全性异常处理
  • 解析异常直接传递到 Failure 终端。 如果未连接 Failure 终端,或者 fail 流中发生异常,那么将回退消息。 fail 流中的回退继续,直到超出回退阈值一次为止,而不是像以前一样超出两次。

有关更多信息,请参阅 连接故障终端捕获 TryCatch 节点中的异常

如果消息流包含数据库更新,则您配置与那些数据库交互的节点的方式也会影响处理错误的方式:

  • 可指定要落实还是回滚更新。 您可以设置节点属性事务,以指定数据库更新是落实还是随消息流回滚(自动选项),或者是落实还是在节点自身终止时回滚(落实选项)。 必须确保这些属性设置与消息流错误处理的组合给出的结果正确。
  • 可指定处理数据库错误的方式。 可设置属性将警告作为错误处理在数据库出错时抛出异常以更改数据库错误处理的缺省行为。

有关协调数据库更新的更多信息,请参阅 为消息流配置事务性

聚集的消息流还涉及本主题中未讨论的其他因素。 有关用于聚集的消息流的信息,请参阅 处理聚集流中的异常