繼承自父 Step
如果一組 Steps
共用相似的設定,那麼定義一個「父」Step
可能會很有幫助,具體的 Steps
可以從中繼承屬性。類似於 Java 中的類別繼承,「子」Step
將其元素和屬性與父元素結合。子元素也會覆寫父 Steps
的任何屬性。
在以下範例中,Step
,concreteStep1
,繼承自 parentStep
。它使用 itemReader
、itemProcessor
、itemWriter
、startLimit=5
和 allowStartIfComplete=true
進行實例化。此外,commitInterval
為 5
,因為它被 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
設定中省略了 reader
、writer
和 tasklet
屬性,則初始化會失敗。如果必須在沒有其中一個或多個屬性的情況下定義父項,則應使用 abstract
屬性。abstract
Step
僅被擴展,永遠不會被實例化。
在以下範例中,如果 Step
(abstractParentStep
) 未聲明為抽象,則不會被實例化。Step
(concreteStep2
) 具有 itemReader
、itemWriter
和 commit-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" 是使用兩個監聽器建立的:listenerOne
和 listenerTwo
<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>