Inheriting from a Parent Step
如果一组 Steps 共享类似的配置,定义一个“parent`" `Step 可能会有所帮助,具体 Steps 可以从中继承属性。类似于 Java 中的类继承,“child`" `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 属性在工作元素中的步骤上仍然是必需的。原因有二:
-
将
id作为持久化StepExecution时的步骤名称。如果在作业中的多个步骤中引用了相同的独立步骤,则会发生错误。
-
在创建作业流程时,如 later in this chapter 所述,
next属性应引用流程中的步骤,而非独立步骤。
Abstract 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>
Merging Lists
Steps 上的一些可配置元素是列表,例如 <listeners/> 元素。如果父级和子级 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>