2016-02-27 49 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

弗朗西斯。