具有回滚异常策略的Mule事务范围不起作用

时间:2015-10-31 02:16:51

标签: transactions mule rollback

我有一个Mule流程,我在其中配置了具有事务范围和回滚异常策略的多资源事务,以回滚异常并重新传递消息以再次启动事务。但回滚异常策略不会重新传递消息。以下是流配置。

<ee:multi-transactional action="ALWAYS_BEGIN" doc:name="Transactional">
    <db:insert config-ref="MySQL_Configuration" autoGeneratedKeys="true" autoGeneratedKeysColumnIndexes="1" autoGeneratedKeysColumnNames="generated_key"
    doc:name="Database" transactionalAction="ALWAYS_JOIN">
        <db:parameterized-query>
            <![CDATA[INSERT INTO DEMO(NAME, AGE) VALUES(#[payload.customer.name],#[payload.customer.age])]]>
        </db:parameterized-query>
    </db:insert>
    <component class="org.ram.BusinessComponent" doc:name="Throw Exception" />
    <jms:outbound-endpoint queue="${queue.name}" connector-ref="Active_MQ" doc:name="JMS">
        <ee:multi-transaction action="ALWAYS_JOIN" />
    </jms:outbound-endpoint>
    <rollback-exception-strategy doc:name="Rollback Exception Strategy" maxRedeliveryAttempts="3">
        <logger doc:name="Logger" />
        <on-redelivery-attempts-exceeded>
            <logger level="INFO" doc:name="Logger"/>
        </on-redelivery-attempts-exceeded>
    </rollback-exception-strategy>
</ee:multi-transactional>

有人可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您分享的代码是完整的流程吗? 您计划在DB中插入一些值。 因此,事务范围应该是流程的一部分。 事务范围将确保范围内的操作全部成功或全部失败。

因此,在您的情况下,数据库插入正常,发生错误,消息无法放在JMS队列上,因此正在回滚数据库插入操作,这意味着未提交。

就像文档说: 在这种情况下,提交要么完全完成又要成功,要么不完整而且失败。即使部分完成,提交 - 或事务 - 也会失败。如果交易失败,Mule将回滚交易中的操作,以便任何一个部分都不会导致部分完成。

如果要重新传递,则应将消息保留在某处,尝试使用VM队列并将其用作“缓冲区”。

看看这两个例子: https://www.mulesoft.com/exchange#!/using-transactional-scope-in-jms-to-database

https://www.mulesoft.com/exchange#!/jms-message-rollback-redelivery