從父 Step 繼承
如果一組 Step 共享相似的配置,那麼定義一個“父” Step 可能很有用,具體的 Step 可以從它繼承屬性。與 Java 中的類繼承類似,“子” Step 會將其元素和屬性與父級的元素和屬性結合起來。子級還會覆蓋父級 Step 的任何屬性。
在以下示例中,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>
在作業元素中的步驟上,id 屬性仍然是必需的。這有兩個原因
-
當持久化
StepExecution時,id用作步驟名稱。如果同一個獨立步驟在作業中的多個步驟中被引用,則會發生錯誤。
-
當建立作業流時,如本章後面所述,
next屬性應該引用流中的步驟,而不是獨立步驟。
抽象 Step
有時,可能需要定義一個不完整 Step 配置的父 Step。例如,如果 reader、writer 和 tasklet 屬性從 Step 配置中省略,則初始化會失敗。如果必須在沒有這些屬性中的一個或多個的情況下定義父級,則應使用 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>
合併列表
Step 上的一些可配置元素是列表,例如 <listeners/> 元素。如果父級和子級 Step 都聲明瞭 <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>