Mule CE:数据库连接器和JBoss / XA事务协同工作?

时间:2016-02-27 20:50:43

标签: jboss transactions mule mule-studio spring-transactions

我想在Mule 3.7中使用JBoss / XA Transacion和Database Connector组件。

但抛出异常:Transactional action is ALWAYS_JOIN but there is no active transaction (java.lang.IllegalStateException)

我的交易场景是:

  1. 池+数据库组件 - select表A
  2. VM组件。只是为了开始交易 - ALWAYS_BEGIN
  3. 数据库组件 - MySQL - insert表B
  4. 数据库组件 - Oracle - insert表C
  5. 我们必须确保两个插入一起运行并提交或一起回滚。

    遵循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. 使用VM Component启动XA事务是否正确?
    4. 最后,我们想要做什么,在Mule CE中嵌入XA事务,真的可能吗?
    5. 谢谢!

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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"  />

我已经注意到CE和EE之间Anypoint Studio的这种差异。

在Mule CE交易块中,您只能指定交易操作

enter image description here

您可以在Mule EE中指定交易操作交易类型

enter image description here

弗朗西斯。