天天看點

Spring Batch之配置Tasklet(十四)一、重新開機Step二、事務

一、重新開機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異常或者其子類異常時,不會觸發事務的復原操作。