骡子中的嵌套交易:它们可能吗?

时间:2013-04-17 12:56:28

标签: transactions mule

我在Mule 3.3.2中有以下流程:

<flow name="testFlow" processingStrategy="synchronous">
    <vm:inbound-endpoint
            connector-ref="vmConnector"
            path="in">
        <vm:transaction action="ALWAYS_BEGIN"/>
    </vm:inbound-endpoint>

    <transactional action="ALWAYS_BEGIN">
        <jdbc:outbound-endpoint
                connector-ref="jdbcConnector"
                queryKey="insertTest"
        />

        <jdbc:outbound-endpoint
                connector-ref="jdbcConnector"
                queryKey="insertTest2"
        />
        <rollback-exception-strategy/>
    </transactional>

    <vm:outbound-endpoint
            connector-ref="vmConnector"
            path="outErrorQueue">
        <vm:transaction action="ALWAYS_JOIN"/>
    </vm:outbound-endpoint>
 </flow>

我想要实现的是嵌入到vm事务中的jdbc事务:事务范围内的任何异常都应该触发jdbc事务的回滚,传播到事务流的范围并触发默认的异常策略vm交易。当然,事务范围之外的任何异常都应该触发流的默认异常策略。

阅读来源,例如org.mule.transaction.TransactionCoordination让我相信这可能有用,至少transactional会接受ACTION_NOT_SUPPORTED作为行动(它不会 - 我可以做到吗?)。

我得到的是

org.mule.transaction.IllegalTransactionStateException: A transaction is not available for this session, but transaction action is "Always Join"
at org.mule.execution.ValidateTransactionalStateInterceptor.execute(ValidateTransactionalStateInterceptor.java:41)
at org.mule.execution.IsolateCurrentTransactionInterceptor.execute(IsolateCurrentTransactionInterceptor.java:44)
at org.mule.execution.ExternalTransactionInterceptor.execute(ExternalTransactionInterceptor.java:52)

在vm:outbound-endpoint。

有没有其他方法可以用Mule获得我想要的东西?

1 个答案:

答案 0 :(得分:0)

我认为VM连接器不支持嵌套事务。

我会尝试将XA用于此用例,因为XA事务可以暂停和恢复,这将发生在transactional块的边界:

<jbossts:transaction-manager />

<flow name="testFlow" processingStrategy="synchronous">
    <vm:inbound-endpoint
            connector-ref="vmConnector"
            path="in">
        <xa-transaction action="ALWAYS_BEGIN"/>
    </vm:inbound-endpoint>

    <transactional action="ALWAYS_BEGIN">
        <jdbc:outbound-endpoint
                connector-ref="jdbcConnector"
                queryKey="insertTest"
        />

        <jdbc:outbound-endpoint
                connector-ref="jdbcConnector"
                queryKey="insertTest2"
        />
        <rollback-exception-strategy/>
    </transactional>

    <vm:outbound-endpoint
            connector-ref="vmConnector"
            path="outErrorQueue">
        <xa-transaction action="ALWAYS_JOIN"/>
    </vm:outbound-endpoint>
</flow>