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