2016-02-27 44 views
0

我想在Mule 3.7中使用带数据库连接器组件的JBoss/XA Transacion。Mule CE:数据库连接器和JBoss/XA Transaction协同工作?

但是引发了一个例外:Transactional action is ALWAYS_JOIN but there is no active transaction (java.lang.IllegalStateException)

我的交易情况是:

  1. 池+数据库组件 - select表一
  2. VM元件。刚开始交易 - ALWAYS_BEGIN
  3. 数据库组件 - MySQL的 - insert表B中
  4. 数据库组件 - 甲骨文 - 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. 是否使用VM组件启动XA事务的正确形式?
  4. 最后,我们想要做什么,在Mule CE中嵌入XA事务,真的有可能吗?

谢谢!从您提供的链接基于

+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

Mule 3.7中的JDBC组件已弃用。不幸的是,我没有找到一个解决方案用于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" /> 

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

在骡子CE事务块,你只能指定交易行为

enter image description here

而是在骡子EE可以指定交易的行动交易类型

enter image description here

弗朗西斯。