首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mule :数据库连接器和JBoss/XA事务一起工作?

Mule :数据库连接器和JBoss/XA事务一起工作?
EN

Stack Overflow用户
提问于 2016-02-27 20:50:43
回答 2查看 369关注 0票数 0

我想使用JBoss/XA Transacion和Mule 3.7中的数据库连接器组件。

但是一个例外是抛出: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

我们必须确保插入一起运行和提交,或者一起回滚。

以下XML代码:

代码语言:javascript
复制
<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组件启动XA事务的正确形式?
  4. 最后,我们想要做的是,在Mule CE中嵌入XA事务,这真的是可能的吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-03-01 08:29:18

根据您提供的链接,由于您使用了驱动程序类oracle.jdbc.xa.client.OracleXADataSource和oracle.jdbc.xa.client.OracleXADataSource,所以需要更新配置,如下所示:

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2016-09-14 09:58:58

根据我的经验,我发现使用XA事务的唯一方法是使用Mule EE。

您必须将您的事务操作(例如数据库更新和JMS发布)包含在这个块中。

代码语言:javascript
复制
<ee:xa-transactional action="ALWAYS_BEGIN" doc:name="Transactional">

并确保使用数据库XA数据源、JMS XA连接工厂和这样的事务管理器

代码语言:javascript
复制
<jbossts:transaction-manager  doc:name="JBoss Transaction Manager"  />

我注意到在CE和EE之间的任意点Studio中都存在这种差异。

在Mule CE事务性块中,只能指定事务操作。

相反,在Mule EE中,可以指定事务操作事务类型

弗朗西斯科。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35675297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档