Mule ESB 3事务流单个Jdbc资源不回滚(MSSQL&jtds) [英] Mule ESB 3 Transactional Flow Single Jdbc Resource Not Rolling Back (MSSQL & jtds)
问题描述
编辑:仅在MSSQL& jtds 1.2.6仍在调查中...
**重复项: 3.3.0 Jdbc事务意外提交
** M鼠文档糟透了.
EDIT: This only happens with MSSQL & jtds 1.2.6 Still investigating...
**Duplicate of : Mule 3.3.0 Jdbc Transaction Undesired Commit
**Mule Documentation sucks.
我想回滚具有多个数据库端点的流中的所有内容.
我只有一个JDBC数据源资源(即无需花哨的XA,2PC等).
我已经设法将Mule配置为至少不会抱怨没有配置任何Transaction Manager,等等.即发生异常时不会回滚事务.
由于我是独立运行Mule的,所以我没有花哨的weblogic,jboss等事务管理器,因此我认为我可以使用Spring的DataSourceTransactionManager.我对此还有什么选择?
I want to rollback everything inside a flow that has several database endpoints.
I have a single JDBC datasource resource (i.e. no need for fancy XA, 2PC, etc).
I have managed to configure Mule to, at least, not complain that no Transaction Manager is configured, etc.... but: It doesn't work; i.e it does not rollback the transaction when an exception occurs.
Since I'm running Mule standalone, I don't have fancy weblogic, jboss, etc transactionmanagers so I thought I could use Spring's DataSourceTransactionManager. What other choice I have for this?
这是我的流程(flow1仅用于触发flow2,这是我要进行交易的流程):
Here is my flow (flow1 is just for triggering flow2, wich is the one I want to be transactional):
和XML:
<?xml version="1.0" encoding="UTF-8"?>
<mule version="CE-3.3.0">
<spring:beans>
<spring:bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<spring:property name="dataSource" ref="dataSource" />
</spring:bean>
<spring:bean id="transactionFactory"
class="org.mule.module.spring.transaction.SpringTransactionFactory">
<spring:property name="manager" ref="transactionManager" />
</spring:bean>
<spring:bean id="dataSource" name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<spring:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<spring:property name="url" value="jdbc:mysql://localhost/mydb"/>
<spring:property name="username" value="sa"/>
<spring:property name="password" value=""/>
</spring:bean>
</spring:beans>
<jdbc:connector name="jdbcConnector" dataSource-ref="dataSource"
transactionPerMessage="true" queryTimeout="20000" pollingFrequency="10000"
doc:name="Database" validateConnections="false"></jdbc:connector>
<flow name="flow1" doc:name="flow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/>
<vm:outbound-endpoint exchange-pattern="request-response" path="toFlow2" doc:name="VM"/>
</flow>
<flow name="flow2" doc:name="flow2">
<vm:inbound-endpoint exchange-pattern="request-response" path="toFlow2" doc:name="VM">
<custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10"/>
</vm:inbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="query1" queryTimeout="-1" connector-ref="jdbcConnector" doc:name="Database">
<jdbc:query key="query1" value="insert into Foo (field1) values ('bar')"/>
<jdbc:transaction action="ALWAYS_JOIN"/>
</jdbc:outbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="query2" queryTimeout="-1" connector-ref="jdbcConnector" doc:name="Database">
<jdbc:query key="query2" value="insert into Bar (field1) values ('foo')"/>
<jdbc:transaction action="ALWAYS_JOIN"/>
</jdbc:outbound-endpoint>
</flow>
</mule>
这里没有显示,我还有一个默认的异常捕获策略,该策略只是将错误的有效负载写入文件.我不知道是否需要显式进行回滚,但是我没有找到方法.
Not shown here, I also have a default exception catch strategy, that simply writes the faulty payload to a file. I don't know if I need to do a rollback explicitly, but I didn't find how.
任何帮助将不胜感激.
推荐答案
经过两天与Mule的碰撞,我终于设法完成了这项工作.
结论:
After two days of banging my head against Mule I finally managed to make this work.
Conclusions:
- 您需要使用 jTDS 自己的数据源(net.sourceforge.jtds.jdbcx.JtdsDataSource)
- 您需要使用m子的TransactionFactory(org.mule.transport.jdbc.JdbcTransactionFactory)
- 您需要使用未记录(或至少记录不足)的标签来开始交易
- jTDS ando/或Mule很烂(我不知道是谁负责这个特殊问题).
- Mule文档浪费大量时间:此和此
- MuleStudio占用大量时间(Sloooow,越野车,无法通过GUI进行交易,断言异常,如果拖放脚本等会弄乱流程等).
- You need to use jTDS's own DataSource (net.sourceforge.jtds.jdbcx.JtdsDataSource)
- You need to use mule's TransactionFactory (org.mule.transport.jdbc.JdbcTransactionFactory)
- You need to use the undocumented (or at least, under-documented) tag to start transaction
- jTDS ando/or Mule sucks (I don't know who is responsible for this particular issue).
- Mule Documentation sucks big time: this and this
- MuleStudio sucks big time (Sloooow, buggy, no way to wire transactions via the GUI, assertexceptions, flows gets messed up if you drag and drop scripts, etc, etc).
最终工作流程:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:jdbc="http://www.mulesoft.org/schema/mule/jdbc" xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns:vm="http://www.mulesoft.org/schema/mule/vm" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans"
version="CE-3.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/jdbc http://www.mulesoft.org/schema/mule/jdbc/current/mule-jdbc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd ">
<spring:beans>
<spring:bean id="jtdsDataSource" name="jtdsDataSource" class="net.sourceforge.jtds.jdbcx.JtdsDataSource">
<spring:property name="user" value="your_user" />
<spring:property name="password" value="your_password" />
<spring:property name="databaseName" value="your_database" />
<spring:property name="serverName" value="your_host" />
</spring:bean>
<spring:bean id="transactionFactory" name="transactionFactory" class="org.mule.transport.jdbc.JdbcTransactionFactory" />
</spring:beans>
<jdbc:connector name="dbConnector" dataSource-ref="jtdsDataSource" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database" />
<flow name="TriggerTxFlow" doc:name="TriggerTxFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" />
<vm:outbound-endpoint exchange-pattern="request-response" path="toTxFlow" doc:name="VM" />
</flow>
<flow name="TxFlow" doc:name="TxFlow">
<vm:inbound-endpoint exchange-pattern="request-response" path="toTxFlow" doc:name="VM">
<custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10" />
</vm:inbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
<jdbc:transaction action="ALWAYS_JOIN" />
<jdbc:query key="insert" value="insert into test values (1, 'Test 1')" />
</jdbc:outbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert2" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
<jdbc:transaction action="ALWAYS_JOIN" />
<jdbc:query key="insert2" value="insert into test values (2, 'Test 2')" />
</jdbc:outbound-endpoint>
</flow>
</mule>
这篇关于Mule ESB 3事务流单个Jdbc资源不回滚(MSSQL&jtds)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!