0

在spring批處理中可以使用jobRepository來使用本地事務,但在分佈式XA事務中執行特定的作業步驟?Spring批處理以及XA和本地事務

對於XA我使用Atomicos 3.8.0。步驟應該是讀取JMS消息並在處理後更新數據庫。

彈簧結構的相關部分:

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

回答

0

我已經在生產中的單元測試和WebSphere JTA成功使用Bitronix之前使用跨這些資源的所有3 XA事務。如果您從步驟的其餘步驟開始爲批處理數據庫提供單獨的事務管理器,那麼在發生任一地點(批處理數據庫或步驟)失敗的情況下,步驟和批處理數據庫可能會「不同步」 )。

例如,您可能在步驟(JMS和數據庫)上成功提交,然後在批處理數據庫上失敗。當你重新開始工作時,它會認爲某個步驟在您的基礎執行過程中不成功。覆蓋同一個事務管理器中的所有3個資源將會阻止這一點。

+0

我明白2管理員方法的缺點,但對於我的工作,重啓時再次執行相同的步驟並不重要。 – Vladimir

相關問題