当发生事务提交时,路由级别<onexception>不会捕获异常吗?

时间:2015-07-02 15:18:19

标签: exception-handling apache-camel spring-transactions

使用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>

当第二个订单尝试插入此inflight表时,一旦事务尝试提交,就会抛出PK违例异常。这也很好。

我的问题是,当此路由的事务由于PK违规而无法提交时,将跳过路由级别<onException>。我找回了不太好的PK违规异常,而不是客户看到的可读异常

  1. 路由级<onException>是否应该能够处理在事务提交期间引起的异常?我想是的......
  2. 我想注意一个路由级别 <onCompletion onFailureOnly="true"> 会像我想要的那样重新解释,但它基本上是一个使用它的wireTap没有好处,因为我需要将重新解释的异常传递给原始线程上的复杂全局错误处理程序。

2 个答案:

答案 0 :(得分:0)

如果您希望路由级别onException改变原始交换/消息,您需要将其设置为处理它,例如processed = true,然后在bean中您可以在交换机上设置新的异常,或抛出异常。

答案 1 :(得分:0)

我有一个解决方案来解决我的问题,虽然不像我想的那样理想。

我回到了呼叫路线并将<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>