2016-02-27 2 views
0

Я хотел бы использовать JBoss/XA Transacion с компонентом Connector Database в Mule 3.7.Mule CE: соединитель базы данных и транзакция JBoss/XA работают вместе?

Но исключением являются броски: Transactional action is ALWAYS_JOIN but there is no active transaction (java.lang.IllegalStateException).

Мой транзакционной сценарий:

  1. Pool + База данных компонент - select таблица А
  2. VM компонентов. Просто чтобы начать транзакцию - ALWAYS_BEGIN
  3. базы данных компонент - MySQL - insert таблица B
  4. компонент Database - Oracle - insert таблицы C

Мы должны убедиться, что обе вставки работает и совершить вместе или откатить вместе.

следующий код XML:

<jbossts:transaction-manager doc:name="JBoss Transaction Manager"> 
    <property key="com.arjuna.ats.arjuna.coordinator.defaultTimeout" value="50" /> 
    <property key="com.arjuna.ats.arjuna.coordinator.txReaperTimeout" value="108000"/>< 
</jbossts:transaction-manager> 
<spring:beans> 
    <spring:bean id="oraDataSource" class="oracle.ucp.jdbc.PoolXADataSourceImpl" name="Bean"> 
    <spring:property name="URL" value="jdbc:oracle:thin:@//${db.host}:${db.port}/${db.instance}"/> 
    <spring:property name="user" value="${db.user}"/> 
    <spring:property name="password" value="${db.password}"/> 
    <spring:property name="connectionFactoryClassName" value="oracle.jdbc.xa.client.OracleXADataSource"/> 
    <spring:property name="minPoolSize" value="1"/> 
    <spring:property name="maxPoolSize" value="20"/> 
    <spring:property name="connectionWaitTimeout" value="30"/> 
    </spring:bean> 
</spring:beans> 

<spring:bean id="mysqlDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"> 
    <spring:property name="url" value="jdbc:mysql://${mysql.host}:${mysql.port}/${mysql.instance}?user=${mysql.user}&amp;password=${mysql.password}" /> 
</spring:bean> 

<db:oracle-config name="Oracle_Configuration" doc:name="Oracle Configuration Bean" dataSource-ref="oraDataSource"/> 
<db:mysql-config name="MySQL_Configuration" doc:name="MySQL Configuration Bean" dataSource-ref="mysqlDataSource"/> 

<vm:connector name="VM" validateConnections="true" doc:name="VM"/> 

<flow name="propostaFlow" processingStrategy="synchronous"> 
    <poll doc:name="Poll"> 
     <fixed-frequency-scheduler frequency="1000"/> 
     <watermark variable="carimboTempo" default-expression="2016-01-01 00:00:00" selector="MAX" selector-expression="#[payload.date_modified]"/> 
     <db:select config-ref="MySQL_Configuration" doc:name="Database Proposta"> 
      <db:parameterized-query><![CDATA[select a.id, a.number, a.date_modified from table_a a where a.date_modified > #[flowVars.carimboTempo]]]></db:parameterized-query> 
     </db:select> 
    </poll> 
    <foreach doc:name="For Each - Proposta"> 
     <vm:outbound-endpoint exchange-pattern="one-way" path="in" connector-ref="VM" doc:name="VM"> 
      <xa-transaction action="ALWAYS_BEGIN" timeout="10000"/> 
     </vm:outbound-endpoint> 
     <enricher target="#[flowVars.resultadoInsert1]" doc:name="Message Enricher"> 
     <db:insert config-ref="Oracle_Configuration" transactionalAction="ALWAYS_JOIN" doc:name="Database 1"> 
       <db:parameterized-query><![CDATA[insert into table_b(ID, NAME) values(#[payload.id],#[payload.name])]]></db:parameterized-query> 
     </db:insert> 
     </enricher> 
     <db:insert config-ref="MySQL_Configuration" transactionalAction="ALWAYS_JOIN" doc:name="Database 2"> 
      <db:parameterized-query><![CDATA[insert into table_c(ID, NAME) values(#[payload.id],#[payload.name])]]></db:parameterized-query> 
     </db:insert> 
    </foreach> 
</flow> 

ВАЖНО: Мы используем Mule 3.7.0 CE. Мы знаем, что в Mule EE решение очень просто с <transaction> и XA.

Вопросы:

  1. ли мы что-то не так?
  2. Является ли компонент подключения к базе данных осведомленным о транзакции JBoss/XA?
  3. Правильная форма для начала транзакции XA с компонентом VM?
  4. И, наконец, что мы хотим сделать, внедрить транзакцию XA в Mule CE, действительно возможно?

Спасибо!

+0

Я нахожу что-то вроде этого: http://blogs.mulesoft.com/dev/mule-dev/how-to-work-with-jdbc-and-xa-transactions/. Но произошла ошибка с этой конфигурацией. Это должно работать в Mule CE 3.7? – Muka

ответ

0

Исходя из ссылки вы предоставили, так как вы используете классы драйверов oracle.jdbc.xa.client.OracleXADataSource и com.mysql.jdbc.jdbc2.optional.MysqlXADataSource вам необходимо обновить конфигурацию, как следующее:

<jdbc:inbound-endpoint queryKey="selectQuery" 
    connector-ref="jdbcConnectorSource" pollingFrequency="10000"> 
    <xa-transaction action="ALWAYS_BEGIN" /> 
</jdbc:inbound-endpoint> 

<jdbc:outbound-endpoint queryKey="insert_call" 
    connector-ref="jdbcConnectorDest"> 
    <xa-transaction action="ALWAYS_JOIN" /> 
</jdbc:outbound-endpoint> 
+0

Компонент JDBC в Mule 3.7 устарел. К сожалению, я не нашел решения для использования в транзакции XA Mule CE. – Muka

0

Основываясь на моем опыте, я обнаружил, что единственный способ использовать транзакции XA - использовать Mule EE.

Вы должны включить ваши транзакционные операции (для обновления пример базы данных и JMS публикации) в этом блоке

<ee:xa-transactional action="ALWAYS_BEGIN" doc:name="Transactional"> 

и обязательно использовать XA базы данных источника данных, JMS XA фабрику соединений и менеджер транзакций, как это

<jbossts:transaction-manager doc:name="JBoss Transaction Manager" /> 

Я заметил эту разницу в Anypoint Studio между CE и EE.

В Mule CE транзакционного блока, можно только указать Действие транзакция

enter image description here

Вместо этого в Mule EE можно указать действие транзакции и тип транзакции

enter image description here

Франческо.

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