我在 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失败时(例如,当body不是xml时),try/catch似乎没有捕获异常。而是调用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上设置异常(exception)
  • 停止任何进一步的路由

  • 这是为了防止错误处理程序之间发生无休止的循环循环,或者防止错误处理程序引发错误时可能出现的其他问题。

    您可以尝试做的(我想我从未尝试过)是为收集错误信息创建专用的direct路由。
    您可以使用.to("direct:collectErrorInformation")从错误处理程序中调用它。
    如果xpath引发错误,则您处于正常路由中,并且如果还为验证错误添加了onException块,则可以正常处理。
    如果您愿意,请尝试一下。

    10-06 01:38