1

春のバッチでジョブリポジトリを使用してローカルトランザクションを使用することは可能ですが、分散 XA トランザクションで特定のジョブステップを実行しますか?

XA には Atomicos 3.8.0 を使用します。ステップは、JMS メッセージを読み取り、処理後に DB を更新することになっています。

スプリング構成の関連部分:

<job id="job" xmlns="http://www.springframework.org/schema/batch">
     <step id="inventorySync">
         <tasklet transaction-manager="xaTransactionManager">
            <chunk reader="jmsQueueReader"
                   processor="messageProcessor"
                   writer="dbWriter"
                   reader-transactional-queue="true"/>
         </tasklet>
     </step>
</job> 

    <bean id="xaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"
          lazy-init="true" depends-on="inventoryDataSource">
        <constructor-arg name="transactionManager" ref="userTransactionManager"/>
        <constructor-arg name="userTransaction" ref="userTransaction"/>
        <property name="allowCustomIsolationLevels" value="true"/>
    </bean>

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="dataSource" ref="batchJobsDataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="databaseType" value="${batch.data.source.type}"/>
</bean>

    <jdbc:embedded-database id="batchJobsDataSource" type="HSQL"/>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="batchJobsDataSource"/>
    </bean>
4

1 に答える 1

0

単体テストで Bitronix を使用し、本番環境で WebSphere JTA を正常に使用する前に、これら 3 つのリソースすべてで XA トランザクションを使用しました。ステップの残りの部分とは別のバッチ データベース用のトランザクション マネージャーがある場合、いずれかの場所 (バッチ データベースまたはステップ) で障害が発生した場合に、ステップとバッチ データベースが「非同期」になるリスクがあります)。

たとえば、ステップ (JMS および DB) でコミットが成功し、バッチ データベースで失敗する場合があります。ジョブを再起動すると、基になる実行中に特定のステップが失敗したと見なされます。同じトランザクション マネージャーで 3 つのリソースすべてをカバーすると、これを防ぐことができます。

于 2013-01-17T12:51:44.747 に答える