发生事务提交时,路由级别 <onException> 没有捕获异常?

Route-Level <onException> doesn't catch exception when transacitonal commit occurs?

使用 Camel 2.13.2。耐心等待我解决问题:

我有一个子流程需要跟踪机上订单。主流程使用一个长事务,在一些冗长的验证结束时持久保存订单信息。如果两个具有相同键的订单以亚秒级间隔提交,则挂单验证有可能不会标记最后一个订单。因此,我有一个使用 PROPIGATION_REQIRES_NEW 的新事务来持久化的路由机上信息以补充挂起的订单验证,直到相关的订单信息被下线提交:

<route id="insertInflightRoute">
        <from uri="direct-vm:insertInflightEndpoint"/>          
        <transacted ref="PROPAGATION_REQUIRES_NEW" />

<exception>java.lang.Exception</exception>

            <bean ref="inflightService" method="setInflightException"/>
        </onException>

        <!-- DB insert via Mybatis autowired in bean. Working fine-->
        <bean ref="inflightService" method="insert"/>
    </route>

当第二个订单尝试插入此飞行中table时,一旦事务尝试提交,就会抛出 PK 违规异常。这也很好用。

我的问题是,当此路由的事务因 PK 违规而未能提交时,路由级别 <onException> 被跳过。我取回了不太好的 PK 违规异常,而不是客户会看到的可读异常

  1. 路由级别 <onException> 是否应该能够处理事务提交期间引起的异常?我也这么认为...

我想指出,路线级别 <onCompletion onFailureOnly="true"> 确实按照我的意愿进行了重新解释,但是它基本上是一个 wireTap,对我没有好处,因为我需要将重新解释的异常传递给原始线程上的复杂全局错误处理程序。

如果你想让路由级别的onException改变原来的exchange/message你需要设置它来处理它,例如handled=true,然后在bean中你可以在exchange上设置一个新的exception,或抛出异常。

我有一个解决我的问题的解决方案,但并不像我想要的那样理想。

我回到调用路由并将 <to uri...> 封装在 <doTry> 中并在那里重新解释我的异常。事务提交失败现在按照我希望的方式处理,方法是从 setInflightException bean 调用中抛出异常:

        <doTry>
            <!-- insert into inflight mdn table immediately -->
            <to uri="direct-vm:insertInflightEndpoint"/>
        <doCatch>
            <exception>java.sql.SQLException</exception>
            <bean ref="inflightService" method="setInflightException"/>
        </doCatch>
        </doTry>