Mule 4 sftp 读取文件 - 使用直到成功的重试机制,无法捕获异常

Mule 4 sftp read file - retry mechanism using Until successful , unable to catch exception

这个问题是之前一个问题的后续问题

所以: 我正在尝试从 SFTP 位置读取文件。我正在使用 Mule 4.4 社区版。如果连接到 SFTP 服务器时出现任何错误或文件不存在,请让 mule 重试 2 次。

根据@aled 的回答,我现在正在使用 'until successful'

代码如下:

<sftp:config name="SFTP_Config" doc:name="SFTP Config">
        <sftp:connection host="abcd" username="xyz" password="pwd" />
    </sftp:config>

<flow name="get:employee">
        <logger level="INFO" doc:name="Logger"  message="starting search" category="get-employee"/>
        <until-successful maxRetries="1" doc:name="Until Successful" millisBetweenRetries="30000">
                <sftp:read doc:name="Read"  config-ref="SFTP_Config" path="/a/employees.unl">
            <repeatable-in-memory-stream />
            <reconnect />
        </sftp:read>
       </until-successful>
        <error-handler ></error-handler>    
</flow>

现在代码每隔 30 秒重试从 sftp 读取文件 1 次。 一切都好到这里

让我感到困惑的是错误处理。 在我的例子中,我在没有文件存在于 sftp 中的情况下进行测试,所以我得到了错误:

SFTP:ILLEGAL_PATH

但是在最大重试后错误类型是:

SFTP:RETRY_EXHAUSTED

IN 错误处理程序,当我给出要捕获的错误类型时:SFTP:RETRY_EXHAUSTED 它没有被抓住!

<on-error-continue enableNotifications="false" logException="false" doc:name="On Error Continue" type="SFTP:RETRY_EXHAUSTED">
</on-error-continue>

当我给 catch 块捕获两种错误类型时: SFTP:RETRY_EXHAUSTED 和 SFTP:ILLEGAL_PATH

<on-error-continue enableNotifications="false" logException="false" doc:name="On Error Continue"  type=" SFTP:RETRY_EXHAUSTED,SFTP:ILLEGAL_PATH">
</on-error-continue>

捕获到异常,但在日志中有警告:

Expected error type from flow 'get:employee/errorHandler/2' has matched the following underlying error: ILLEGAL_PATH. Consider changing it to match the reported error: RETRY_EXHAUSTED.

我无法理解这种行为,错误处理的最佳方式是什么?

不是 SFTP:RETRY_EXHAUSTED,而是 MULE:RETRY_EXHAUSTED。尝试在错误处理程序中捕获 MULE:RETRY_EXHAUSTED 或简单地 RETRY_EXHAUSTED

您可以参考 until-success 文档了解更多详情。

RETRY_EXHAUSTED 错误仅包含 最新错误 失败的 until-success 范围,在大多数情况下,这是您想要的知道。您可以使用 error.suppressedErrors[0].

得到这个错误

例如: 如果你想根据最新的错误以不同的方式处理错误,你可以在错误处理程序的 when 表达式中添加一个条件。像 error.suppressedErrors[0].errorType == SOME_ERROR_TYPE