春季批次和XA和本地交易(Spring batch and XA and local transac

2019-08-07 03:25发布

它可以在Spring Batch的一个jobRepository使用本地事务,但是在执行XA分布式事务处理特定的工作步骤是什么?

对于XA我用Atomicos 3.8.0。 步骤应该是阅读JMS消息和处理后更新数据库。

Spring配置的相关部分:

<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>

Answer 1:

我已经在生产单元测试和WebSphere JTA成功使用Bitronix前跨越这些资源的所有3使用的XA事务。 如果你从你的步伐其余批次数据库中的一个单独的事务管理器,你的风险步骤和批处理数据库是“失同步”在地方的一方在发生故障的情况下(批数据库或步)。

例如,你可以有一个成功提交您的步(JMS和DB),然后失败在你的批处理数据库。 当你重新启动你的工作它会认为某一步失败,而您的底层执行了。 涵盖了所有的资源3在同一个事务管理器将防止这一点。



文章来源: Spring batch and XA and local transactions