0

編集:これはMSSQLとjtds1.2.6でのみ発生します。まだ調査中です...
**重複:Mule 3.3.0 Jdbc Transaction Undesired Commit
**Muleドキュメントは最悪です。

複数のデータベースエンドポイントを持つフロー内のすべてをロールバックしたいと思います。
私は単一のJDBCデータソースリソースを持っています(つまり、派手なXA、2PCなどは必要ありません)。
少なくとも、Transaction Managerが構成されていないことなどを文句を言わないようにMuleを構成できましたが、機能しません。つまり、例外が発生したときにトランザクションをロールバックしません。
Muleをスタンドアロンで実行しているので、派手なweblogicやjbossなどのtransactionmanagerがないので、SpringのDataSourceTransactionManagerを使用できると思いました。これには他にどのような選択肢がありますか?

これが私のフローです(flow1はflow2をトリガーするためのものであり、トランザクションになりたいものです):

フロー

そして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>

ここには示されていませんが、デフォルトの例外キャッチ戦略もあります。これは、障害のあるペイロードをファイルに書き込むだけです。ロールバックを明示的に行う必要があるかどうかはわかりませんが、その方法がわかりませんでした。

どんな助けでも大歓迎です。

4

2 に答える 2

3

Mule に 2 日間頭を悩ませた後、ようやくこの作業を行うことができました。
結論:

  • jTDS独自の DataSource (net.sourceforge.jtds.jdbcx.JtdsDataSource)を使用する必要があります。
  • Mule の TransactionFactory (org.mule.transport.jdbc.JdbcTransactionFactory) を使用する必要があります。
  • 文書化されていない (または少なくとも文書化されていない) タグを使用してトランザクションを開始する必要があります
  • jTDS ando/or Mule は最悪です (この特定の問題の責任者が誰なのかはわかりません)。
  • Mule のドキュメンテーションには時間がかかります:これこれ
  • MuleStudio は非常に時間がかかります (遅い、バグがある、GUI を介してトランザクションを接続する方法がない、assertexceptions、スクリプトをドラッグ アンド ドロップするとフローがめちゃくちゃになる、など)。

最終的なワークフロー:

<?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>
于 2012-12-05T02:39:54.173 に答える