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>