Transactions Mule ESB 3.3异常策略和;回退挡板特性

Transactions Mule ESB 3.3异常策略和;回退挡板特性,transactions,esb,mule,rollback,Transactions,Esb,Mule,Rollback,设置: 选项卡:创建表测试(id int主键不为NULL,名称为varchar(25)) 基本测试流程: 前提条件:数据库已经有一个id=2的记录(强制SqlException) 案例1: 当按原样调用基本流时,由于主键冲突,第二次插入失败,第一次插入被回滚。似乎是合理的违约行为 案例2: 通过添加一个回滚异常策略来修改基本流,并在异常策略中添加一个记录器,以便在调用时打印内容。 调用流时,由于主键冲突,第二次插入失败,第一次插入被回滚,但是RollbackExceptionStrategy从

设置:
选项卡:
创建表测试(id int主键不为NULL,名称为varchar(25))

基本测试流程:

前提条件:数据库已经有一个id=2的记录(强制SqlException)

案例1:

当按原样调用基本流时,由于主键冲突,第二次插入失败,第一次插入被回滚。似乎是合理的违约行为

案例2:

通过添加一个回滚异常策略来修改基本流,并在异常策略中添加一个记录器,以便在调用时打印内容。
调用流时,由于主键冲突,第二次插入失败,第一次插入被回滚,但是RollbackExceptionStrategy从未被调用
这几乎不是任何人所期望的

所以这里的问题是:为什么不调用回滚异常策略,我需要做什么才能调用它

案例3:

通过添加一个捕获异常策略来修改基本流,并在异常策略中添加一个记录器,以便在调用时打印内容。
调用流时,由于主键冲突,第二次插入失败。这一次,调用了异常策略,但现在事务被回滚,而不是回滚

这里的问题是:为什么事务没有回滚,以及如何在异常策略中强制回滚不同于回滚策略

任何帮助都将不胜感激


Edit1:以下是流的完整xml(仅基本情况):



Edit2:事实证明,案例2在隔离状态下工作,但在更复杂的流程中不工作,例如:

<mule>
    <spring:beans>
        <spring:bean id="dataSource" name="dataSource" class="org.enhydra.jdbc.standard.StandardDataSource" destroy-method="shutdown">
            <spring:property name="driverName" value="org.h2.Driver" />
            <spring:property name="url" value="jdbc:h2:tcp://localhost/~/mule" />
            <spring:property name="user" value="sa" />
            <spring:property name="password">
                <spring:value></spring:value>
            </spring:property>
        </spring:bean>

        <spring:bean id="transactionFactory" name="transactionFactory" class="org.mule.transport.jdbc.JdbcTransactionFactory" />

    </spring:beans>

    <jdbc:connector name="dbConnector" dataSource-ref="dataSource" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database" />

    <flow name="TriggerTxFlow" doc:name="TriggerTxFlow">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" />
        <set-variable variableName="flow" value="#[message.inboundProperties['http.query.params']['flow']]" doc:name="Variable"/>
        <vm:outbound-endpoint exchange-pattern="request-response" path="#[flow]" doc:name="VM" />
    </flow>

    <flow name="case1Flow" doc:name="case1Flow">
        <vm:inbound-endpoint exchange-pattern="request-response" path="case1" doc:name="case1">
            <custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10" />
        </vm:inbound-endpoint>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert" queryTimeout="-1" connector-ref="dbConnector" doc:name="insert into test values (1, 'Test 1')">
            <jdbc:transaction action="ALWAYS_JOIN" />
            <jdbc:query key="insert" value="insert into test values (1, 'Test 1')" />
        </jdbc:outbound-endpoint>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert2" queryTimeout="-1" connector-ref="dbConnector" doc:name="insert into test values (2, 'Test 2')">
            <jdbc:transaction action="ALWAYS_JOIN" />
            <jdbc:query key="insert2" value="insert into test values (2, 'Test 2')" />
        </jdbc:outbound-endpoint>
    </flow>

    <flow name="case2Flow" doc:name="case2Flow">
        <vm:inbound-endpoint exchange-pattern="request-response" path="case2" doc:name="case2">
            <custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10" />
        </vm:inbound-endpoint>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
            <jdbc:transaction action="ALWAYS_JOIN" />
            <jdbc:query key="insert" value="insert into test values (1, 'Test 1')" />
        </jdbc:outbound-endpoint>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert2" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
            <jdbc:transaction action="ALWAYS_JOIN" />
            <jdbc:query key="insert2" value="insert into test values (2, 'Test 2')" />
        </jdbc:outbound-endpoint>
        <rollback-exception-strategy doc:name="Rollback Exception Strategy" enableNotifications="false" maxRedeliveryAttempts="0">
            <on-redelivery-attempts-exceeded doc:name="Redelivery exhausted">
                <logger message="========= Inside Exception Strategy =========" level="INFO" doc:name="Logger"/>
            </on-redelivery-attempts-exceeded>
        </rollback-exception-strategy>
    </flow>

    <flow name="case3Flow" doc:name="case3Flow">
        <vm:inbound-endpoint exchange-pattern="request-response" path="case3" doc:name="VM">
            <custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10" />
        </vm:inbound-endpoint>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
            <jdbc:transaction action="ALWAYS_JOIN" />
            <jdbc:query key="insert" value="insert into test values (1, 'Test 1')" />
        </jdbc:outbound-endpoint>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert2" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
            <jdbc:transaction action="ALWAYS_JOIN" />
            <jdbc:query key="insert2" value="insert into test values (2, 'Test 2')" />
        </jdbc:outbound-endpoint>
        <catch-exception-strategy doc:name="Catch Exception Strategy">
            <logger message="========= Inside Exception Strategy =========" level="INFO" doc:name="Logger"/>
        </catch-exception-strategy>
    </flow>

</mule>

案例1:耶

案例2

为什么不调用回滚异常策略,我需要做什么才能调用它

根据这项战略,应该调用。这可能是您的配置问题,因为如果我添加:

<rollback-exception-strategy>
    <logger message="---> In Rollback exception strategy!!!" />
</rollback-exception-strategy>

对于“TxFlow”,我可以看到控制台中记录的文本

案例3

为什么事务没有回滚

这是捕获例外策略的主要目的,来自:

确保流处理的事务在发生错误时不会回滚(即,该事务永远不会“回滚”以重新尝试处理;Mule提交该事务)

如何在不同于回滚策略的异常策略中强制回滚


我想你做不到。您可以尝试从策略中抛出异常,但恐怕此时事务已提交。

尝试此操作以强制在ES中回滚:

<custom-exception-strategy class="..." >
    <rollback-transaction exception-pattern="*"/>
</custom-exception-strategy>


我刚刚为基本案例添加了流程的XML。它不是内存中的db,但设置起来非常简单。只需按如下方式启动H2DB:java-cph2-1.3.170.jar org.h2.tools.Server()。这太棒了,我正在研究它。谢谢David,你是对的。案例2在隔离中起作用,但在更复杂的流中则不起作用。我刚刚添加了用于测试的实际流。它包括3个案例。您调用每个传递参数到触发器流,如下所示:Wait,您在
回滚异常策略中使用
对超过的重新交付尝试执行
:您从未提到过这一点。还可以在入站VM端点上使用JDBC事务工厂。难道你不想在VM和JDBC之间进行XA事务,这样VM交付也会回滚,从而导致重新交付,从而可能在超过重新交付尝试时触发
。哎呀,当我在Mule Studio中拖放它时,我没有注意到记录器进入了标记体而不是标记体!大卫,我怎么付钱给你?你回答每一个问题。真的,你应该开始向我收费。
<custom-exception-strategy class="..." >
    <rollback-transaction exception-pattern="*"/>
</custom-exception-strategy>