Mule ESB 3事务流单个Jdbc资源不回滚(MSSQL&jtds) [英] Mule ESB 3 Transactional Flow Single Jdbc Resource Not Rolling Back (MSSQL & jtds)

查看:92
本文介绍了Mule ESB 3事务流单个Jdbc资源不回滚(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆