Я хотел бы использовать 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)
.
Мой транзакционной сценарий:
- Pool + База данных компонент -
select
таблица А - VM компонентов. Просто чтобы начать транзакцию -
ALWAYS_BEGIN
- базы данных компонент - MySQL -
insert
таблица B - компонент 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}&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
.
Вопросы:
- ли мы что-то не так?
- Является ли компонент подключения к базе данных осведомленным о транзакции JBoss/XA?
- Правильная форма для начала транзакции XA с компонентом VM?
- И, наконец, что мы хотим сделать, внедрить транзакцию XA в Mule CE, действительно возможно?
Спасибо!
Я нахожу что-то вроде этого: http://blogs.mulesoft.com/dev/mule-dev/how-to-work-with-jdbc-and-xa-transactions/. Но произошла ошибка с этой конфигурацией. Это должно работать в Mule CE 3.7? – Muka