一、重新開機Step
Spring Batch架構支援狀态為非“COMPELETED”的Job執行個體重新啟動,Job執行個體重新開機的時候,會從目前失敗的Step重新開始執行,同時可以通過start-limit屬性控制任務啟動的次數和allow-start-if-complete屬性來決定已完成的任務是否可以重新啟動。
1.start-limit屬性控制啟動次數限制
預設情況下,作業執行個體可以無限次地重複啟動。在有些場景下需要限制作業執行個體的啟動次數。
<batch:step id="startLimitStep">
<batch:tasklet start-limit="1">
<batch:chunk reader="reader" processor="processor" writer="writer"/>
</batch:tasklet>
</batch:step>
定義了startLimitStep隻能啟動1次,第二次啟動的時候就會抛出異常。start-limit預設值是Integer.MAX_VALUE,表示任務可以無限次啟動。
2.allow-start-if-complete屬性控制完成的任務是否可以重新開機
預設情況下,Job Instance重新啟動的時候,已經完成的任務不會再次被執行。僅在特殊的情景下,已經完成的Step在任務重新開機的時候需要再次執行,這可以通過allow-start-if-complete來設定。
<batch:step id="startLimitStep">
<batch:tasklet allow-start-if-complete="true">
<batch:chunk reader="reader" processor="processor" writer="writer"/>
</batch:tasklet>
</batch:step>
通過設定屬性allow-start-if-complete為true,表示已經完成的Step可以被再次啟動。
二、事務
1.事務管理器
為了使用事務管理器,需要在配置檔案中聲明标準Spring方式的事務管理器。
(1)Job執行期的中繼資料,存放在記憶體中的事務管理器配置方式
<batch:step id="startLimitStep">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="reader" processor="processor" writer="writer"/>
</batch:tasklet>
</batch:step>
<!--定義事務管理器,用于Spring Batch架構中對資料操作提供事務能力-->
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
(2)Job執行期的中繼資料,存放在資料庫中的事務管理器配置方式
<batch:step id="startLimitStep">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="reader" processor="processor" writer="writer"/>
</batch:tasklet>
</batch:step>
<!--事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--資料源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/spring_batch_demo2</value>
</property>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</bean>
其中,dataSource指定使用的資料源,在對此資料源的任何操作都将會得到事務的保障。
關于Job執行期的中繼資料存儲方式,可以回看我的另一篇文章:
Spring Batch之配置Job Repository的兩種方式(二)_人……傑的部落格-CSDN部落格
2.事務復原
在業務執行過程中,包括讀、寫、處理資料如果發生了異常會導緻事務復原,Spring Batch架構提供了發生特定異常不觸發事務復原的能力,可以在tasklet中通過子元素no-rollback-exception-classes來定義特定異常不復原。
<batch:step id="startLimitStep">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="reader" processor="processor" writer="writer"/>
<batch:no-rollback-exception-classes>
<batch:include class="org.springframework.batch.item.validator.ValidationException"/>
</batch:no-rollback-exception-classes>
</batch:tasklet>
</batch:step>
配置後,如果發生ValidationException異常或者其子類異常時,不會觸發事務的復原操作。