骆驼尝试在 onException 中捕获

Camel try catch in onException

我在 Camel 上下文中遇到 onException 问题。我正在使用一个通用错误处理程序,它会在发生异常时尝试使用 xpath 从交换中提取额外的错误信息。 onException 包含一个 try/catch 子句,防止引发其他错误。

<onException>
  <exception>java.lang.Exception</exception>
  <handled>
    <constant>true</constant>
  </handled>
  <!-- Try to get additional error information from the exchange-->
  <doTry>
    <setProperty name="error.code">
      <xpath resultType="java.lang.String">//*[local-name()='error'][1]/@code</xpath>
    </setProperty>
    <doCatch>
      <exception>java.lang.Exception</exception>
    </doCatch>
  </doTry>
</onException>

问题是当 xpath 失败时,try/catch 似乎没有捕捉到异常,例如当 body 不是 xml 时。而是调用 FatalFallbackErrorHandler 并记录以下异常:

Content is not allowed in prolog.: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

如您所见,onException 块中的 try/catch 没有任何帮助。

只要在错误处理过程中发生异常FatalFallbackErrorHandler就会启动。这就是Camel的“紧急中断”。您无法更改它,它会执行以下操作:

  • 捕获异常
  • 记录警告
  • 在 Exchange 上设置例外
  • 停止任何进一步路由

这是为了防止错误处理程序之间的无限循环或错误处理程序抛出错误时可能出现的其他问题。


您可以尝试(我想我从未尝试过)创建一个专门的 direct 路由来收集错误信息。

您使用 .to("direct:collectErrorInformation") 从错误处理程序中调用它。

如果xpath报错,你走的是正常路线,如果你也加了一个onException block用于验证错误,你可以正常处理。

喜欢就试试吧

当 xpath 失败时,try/catch 实际上会捕获异常,并且 不会 调用 FatalFallbackErrorHandler。 doTry/doCatch 即使在 onException 内也能按预期工作。

Camels jaxp XmlConverter 记录了回溯错误,但没有从 onException 引发异常。

https://github.com/apache/camel/blob/639eba1f66d0e001a033d417baa07b814c3d6994/core/camel-xml-jaxp/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java#L1105