从父级 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>
id 属性在 job 元素内的 step 上仍然是必需的。这有两个原因:
-
当持久化
StepExecution时,id被用作步骤名称。如果在作业的多个步骤中引用了同一个独立步骤,则会发生错误。
-
在创建作业流时,如本章后文所述,
next属性应引用流程中的步骤,而非独立步骤。
摘要Step
有时,可能需要定义一个父Step,但它并非完整的Step配置。例如,如果在Step配置中省略了reader、writer和tasklet属性,则初始化会失败。如果必须定义缺少其中一个或多个这些属性的父节点,则应使用abstract属性。abstractStep仅被扩展,永远不会被实例化。
在以下示例中,如果未将 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 都声明了 <listeners/> 元素,
则子元素的列表将覆盖父元素的列表。为了允许子元素向父元素定义的列表中添加额外的监听器,每个列表元素都有一个 merge 属性。
如果该元素指定了 merge="true",则子元素的列表将与父元素的列表合并,而不是覆盖它。
在以下示例中,Step“concreteStep3
<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>