MuleSoft - Mule 错误处理


新的 Mule 错误处理是 Mule 4 中最大、最重要的变化之一。新的错误处理可能看起来很复杂,但它更好、更高效。在本章中,我们将讨论 Mule 错误的组件、错误类型、Mule 错误的类别以及处理 Mule 错误的组件。

Mule 错误的组成部分

Mule 错误是 Mule 异常失败的结果,具有以下组成部分 -

描述

它是 Mule 错误的重要组成部分,它将给出有关问题的描述。其表达式如下:

#[error.description]

类型

Mule 错误的类型组件用于表征问题。它还允许在错误处理程序内进行路由。其表达式如下:

#[error.errorType]

原因

Mule 错误的 Cause 组件给出了导致失败的底层 java throwable。其表达式如下:

#[error.cause]

信息

Mule 错误的消息组件显示有关错误的可选消息。其表达式如下:

#[error.errorMessage]

子错误

Mule 错误的子错误组件提供了内部错误的可选集合。这些内部错误主要由 Scatter-Gather 等元素用来提供聚合的路由错误。其表达式如下:

#[error.childErrors]

例子

如果 HTTP 请求失败并出现 401 状态代码,Mule 错误如下:

Description: HTTP GET on resource ‘http://localhost:8181/TestApp’ 
failed: unauthorized (401)
Type: HTTP:UNAUTHORIZED
Cause: a ResponseValidatorTypedException instance
Error Message: { "message" : "Could not authorize the user." }
硝酸锶 错误类型和描述
1

转型

此错误类型表示转换值时发生错误。该转换是 Mule Runtime 内部转换,而不是 DataWeave 转换。

2

表达

这种错误类型表示在计算表达式时发生错误。

3

验证

这种错误类型表示发生了验证错误。

4

DUPLICATE_MESSAGE

消息被处理两次时发生的一种验证错误。

5

再次交付_EXHAUSTED

当重新处理来自源的消息的最大尝试次数已用完时,就会出现这种错误类型。

6

连接性

此错误类型表示建立连接时出现问题。

7

路由

此错误类型指示路由消息时发生错误。

8

安全

此错误类型表示发生了安全错误。例如,收到无效凭据。

9

STREAM_MAXIMUM_SIZE_EXCEEDED

当流允许的最大大小耗尽时,会发生此错误类型。

10

暂停

它指示处理消息时的超时时间。

11

未知

此错误类型表示发生了意外错误。

12

来源

它表示流的源发生错误。

13

SOURCE_RESPONSE

它表示在处理成功响应时流源中发生错误。

在上面的示例中,您可以看到mule 错误的消息组件。

错误类型

让我们借助其特征来了解错误类型 -

  • Mule 错误类型的第一个特征是它由命名空间和标识符组成。这使我们能够根据它们的域来区分类型。在上面的示例中,错误类型为HTTP: UNAUTHORIZED

  • 第二个也是重要的特征是错误类型可能有父类型。例如,错误类型HTTP: UNAUTHORIZEDMULE:CLIENT_SECURITY作为父级,而该父级又具有名为MULE:SECURITY的父级。此特性将错误类型建立为更全局项目的规范。

错误类型的种类

以下是所有错误所属的类别 -

任何

该类别下的错误是Flow中可能发生的错误。它们并不那么严重,很容易处理。

批判的

此类错误是无法处理的严重错误。以下是该类别下的错误类型列表 -

硝酸锶 错误类型和描述
1

超载

此错误类型表示由于过载问题而发生错误。在这种情况下,执行将被拒绝。

2

致命_JVM_错误

这种错误类型表示发生了致命错误。例如,堆栈溢出。

自定义错误类型

自定义错误类型是我们定义的错误。它们可以在映射或引发错误时定义。我们必须为这些错误类型提供一个特定的自定义命名空间,以将它们与 Mule 应用程序中其他现有的错误类型区分开来。例如,在使用HTTP的Mule应用程序中,我们不能使用HTTP作为自定义错误类型。

Mule 错误的类别

从广义上讲,Mule 中的错误可以分为两类,即消息传递错误和系统错误

消息错误

此类 Mule 错误与 Mule 流程相关。每当 Mule 流程中出现问题时,Mule 就会抛出消息错误。我们可以在错误处理组件中设置On Error组件来处理这些 Mule 错误。

系统错误

系统错误表示系统级别发生异常。如果没有 Mule 事件,则系统错误由系统错误处理程序处理。以下类型的异常由系统错误处理程序处理 -

  • 应用程序启动期间发生的异常。
  • 与外部系统的连接失败时发生的异常。

如果发生系统错误,Mule 会向注册的监听器发送错误通知。它还会记录错误。另一方面,如果错误是由连接失败引起的,Mule 会执行重新连接策略。

处理 Mule 错误

Mule 有以下两个错误处理程序来处理错误 -

错误错误处理程序

第一个 Mule 错误处理程序是 On-Error 组件,它定义了它们可以处理的错误类型。如前所述,我们可以在类似作用域的错误处理程序组件内配置 On-Error 组件。每个 Mule 流只包含一个错误处理程序,但是这个错误处理程序可以包含我们需要的任意多个 On-Error 范围。在 On-Error 组件的帮助下处理流程中的 Mule 错误的步骤如下:

  • 首先,每当 Mule 流程引发错误时,正常流程执行就会停止。

  • 接下来,该流程将转移到已经具有On Error 组件的Error Handler 组件来匹配错误类型和表达式。

  • 最后,错误处理程序组件将错误路由到与该错误匹配的第一个On Error 作用域。

处理消息传递

以下是 Mule 支持的两种类型的 On-Error 组件:

错误传播

On-Error Propagate 组件会执行,但会将错误传播到下一个级别并中断所有者的执行。如果事务由On Error Propagate组件处理,则该事务将被回滚。

出错时继续

与错误传播组件一样,错误继续组件也执行事务。唯一的条件是,如果所有者已成功完成执行,则该组件将使用执行结果作为其所有者的结果。如果事务由 On-ErrorContinue 组件处理,则该事务将被提交。

尝试范围组件

Try Scope 是 Mule 4 中提供的众多新功能之一。它的工作原理类似于 JAVA 的 try 块,我们在其中将可能出现异常的代码括起来,以便在不破坏整个代码的情况下对其进行处理。

我们可以将一个或多个 Mule 事件处理器包装在 Try 作用域中,之后,try 作用域将捕获并处理这些事件处理器抛出的任何异常。try 作用域的主要工作围绕它自己的错误处理策略,该策略支持对其内部组件而不是整个流程进行错误处理。这就是为什么我们不需要将流提取到单独的流中。

例子

以下是使用 try 范围的示例 -

尝试范围

配置处理事务的尝试范围

众所周知,事务是一系列永远不应该部分执行的操作。事务范围内的所有操作都在同一线程中执行,如果发生错误,则应导致回滚或提交。我们可以通过以下方式配置 try 范围,以便它将子操作视为事务。

配置尝试范围
  • INDIFFERENT [默认] - 如果我们在 try 块上选择此配置,则子操作将不会被视为事务。在这种情况下,错误既不会导致回滚也不会提交。

  • ALWAYS_BEGIN - 它表示每次执行作用域时都会启动一个新事务。

  • BEGIN_OR_JOIN - 它表示如果流的当前处理已经启动了一个事务,则加入它。否则,开始一个新的。