2013-04-17 2 views
0

У меня есть следующий поток в 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> 

То, что я пытаюсь достичь является транзакцией JDBC вложенной в сделку Vm: любое исключение внутри транзакционной рамки должно вызвать откат для транзакции 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) 

на ВМ: исходящий конечной точки.

Есть ли альтернативный способ получить то, что я хочу с Мулом?

ответ

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> 
+0

Да, конечно, XA сделки. Я должен обойтись без них, и хорошо, если бы была только одна конечная точка jdbc, я мог бы покончить с транзакционной областью и дать конечной точке jdbc транзакцию jdbc с действием NOT_SUPPORTED, которое будет делать то, что я хочу, я думаю. В этой ситуации нет никакой проблемы с нажатием транзакции vm на изолированном стеке tx и последующим ее извлечением. Это не требует сотрудничества на части транзакции vm. Конечно, я могу не понимать механизм. – Jule

+0

@David, есть ли форма для использования + больше одного ресурса, p.ex. DB1.MySQL + DB2.Oracle, как этот ответ, внутри блока 'transaction' на Mule CE 3.7? – Muka

+0

@Muka Я думаю, вам понадобится EE, чтобы получить блок «ee: xa-transactional» в 3.7. Не 100% уверен, хотя, вы должны попробовать. –

Смежные вопросы