繼承自父 Step

如果一組 Steps 共用相似的設定,那麼定義一個「父」Step 可能會很有幫助,具體的 Steps 可以從中繼承屬性。類似於 Java 中的類別繼承,「子」Step 將其元素和屬性與父元素結合。子元素也會覆寫父 Steps 的任何屬性。

在以下範例中,StepconcreteStep1,繼承自 parentStep。它使用 itemReaderitemProcessoritemWriterstartLimit=5allowStartIfComplete=true 進行實例化。此外,commitInterval5,因為它被 concreteStep1 Step 覆寫,如下列範例所示

<step id="parentStep">
    <tasklet allow-start-if-complete="true">
        <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
    </tasklet>
</step>

<step id="concreteStep1" parent="parentStep">
    <tasklet start-limit="5">
        <chunk processor="itemProcessor" commit-interval="5"/>
    </tasklet>
</step>

在 job 元素中,步驟上仍然需要 id 屬性。這有兩個原因

  • 當持久化 StepExecution 時,id 會用作步驟名稱。如果同一個獨立步驟在 job 中的多個步驟中被引用,則會發生錯誤。

  • 當建立 job 流程時,如本章稍後的章節中所述,next 屬性應參照流程中的步驟,而不是獨立步驟。

抽象 Step

有時,可能需要定義一個父 Step,它不是完整的 Step 設定。例如,如果從 Step 設定中省略了 readerwritertasklet 屬性,則初始化會失敗。如果必須在沒有其中一個或多個屬性的情況下定義父項,則應使用 abstract 屬性。abstract Step 僅被擴展,永遠不會被實例化。

在以下範例中,如果 Step (abstractParentStep) 未聲明為抽象,則不會被實例化。Step (concreteStep2) 具有 itemReaderitemWritercommit-interval=10

<step id="abstractParentStep" abstract="true">
    <tasklet>
        <chunk commit-interval="10"/>
    </tasklet>
</step>

<step id="concreteStep2" parent="abstractParentStep">
    <tasklet>
        <chunk reader="itemReader" writer="itemWriter"/>
    </tasklet>
</step>

合併列表

Steps 上的一些可設定元素是列表,例如 <listeners/> 元素。如果父 Steps 和子 Steps 都宣告了 <listeners/> 元素,則子元素的列表會覆寫父元素的列表。為了允許子元素將額外的監聽器添加到父元素定義的列表中,每個列表元素都有一個 merge 屬性。如果元素指定 merge="true",則子元素的列表會與父元素的列表合併,而不是覆寫它。

在以下範例中,Step "concreteStep3" 是使用兩個監聽器建立的:listenerOnelistenerTwo

<step id="listenersParentStep" abstract="true">
    <listeners>
        <listener ref="listenerOne"/>
    <listeners>
</step>

<step id="concreteStep3" parent="listenersParentStep">
    <tasklet>
        <chunk reader="itemReader" writer="itemWriter" commit-interval="5"/>
    </tasklet>
    <listeners merge="true">
        <listener ref="listenerTwo"/>
    <listeners>
</step>