2

XA トランザクションのしくみを完全には理解していないようです。アトミックだと思いました。トランザクションをコミットすると、新しいメッセージと新しいデータが同時に利用可能になると思いました。

この誤解により、次の問題が発生しました。新しい行が DB に挿入され、メッセージがトランザクション ルートのキューに送信されます。別のルートでメッセージが受信されます。次に、このルートは、前のルートで挿入された行でいくつかの操作を実行しようとします。しかし、それはそれらを見ません!

2 番目のルートは、例外が発生したときにメッセージをキューにロールバックするように構成されています。そして、2 回目の実行後、ルートが行を認識していることがわかります。

結論として、次の質問をします。

  1. XA トランザクションは本当にアトミックですか?
  2. いいえの場合、トランザクション リソースのコミット順序を構成するにはどうすればよいですか?

追記:この問題は Fuse ESB/ServiceMix 4.4.1 で発見されました。


2 Jake: 私のキャメル コンテキスト構成は次のようになります。

<osgi:reference id="osgiPlatformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager"/>
<osgi:reference id="osgiJtaTransactionManager" interface="javax.transaction.TransactionManager"/>

<osgi:reference id="myDataSource"
       interface="javax.sql.DataSource"
       filter="(osgi.jndi.service.name=jdbc/postgresXADB)"/>

 <bean id="PROPAGATION_MANDATORY" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="osgiPlatformTransactionManager"/>
    <property name="propagationBehaviorName" value="PROPAGATION_MANDATORY"/>
 </bean>

 <bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="osgiPlatformTransactionManager"/>
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
 </bean>

<bean id="jmstx" class="org.apache.activemq.camel.component.ActiveMQComponent"> 
    <property name="configuration" ref="jmsTxConfig" /> 
</bean> 

<bean id="jmsTxConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 
    <property name="connectionFactory" ref="jmsXaPoolConnectionFactory"/> 
    <property name="transactionManager" ref="osgiPlatformTransactionManager"/>
    <property name="transacted" value="false"/>
    <property name="cacheLevelName" value="CACHE_NONE"/>
    <property name="concurrentConsumers" value="${jms.concurrentConsumers}" />
</bean> 

<bean id="jmsXaPoolConnectionFactory" class="org.apache.activemq.pool.XaPooledConnectionFactory">
    <property name="maxConnections" value="${jms.maxConnections}" />
    <property name="connectionFactory" ref="jmsXaConnectionFactory" />
    <property name="transactionManager" ref="osgiJtaTransactionManager" />
</bean>

<bean id="jmsXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <property name="brokerURL" value="${jms.broker.url}"/>
    <property name="redeliveryPolicy">
        <bean class="org.apache.activemq.RedeliveryPolicy">
            <property name="maximumRedeliveries" value="-1"/>
            <property name="initialRedeliveryDelay" value="2000" />
            <property name="redeliveryDelay" value="5000" />
        </bean>
    </property>
</bean>

DB データ ソースは次のように構成されます。

<bean id="myDataSource" class="org.postgresql.xa.PGXADataSource">
    <property name="serverName" value="${db.host}"/>
    <property name="databaseName" value="${db.name}"/>
    <property name="portNumber" value="${db.port}"/>
    <property name="user" value="${db.user}"/>
    <property name="password" value="${db.password}"/>
</bean>

<service ref="myDataSource" interface="javax.sql.XADataSource">
    <service-properties>
        <entry key="osgi.jndi.service.name" value="jdbc/postgresXADB"/>
            <entry key="datasource" value="postgresXADB"/>
    </service-properties>
</service>
4

1 に答える 1