从父 Step
继承
如果一组 Steps
共享类似的配置,那么定义一个“父” Step
可能会有所帮助,具体的 Steps
可以从该父 Step
继承属性。类似于 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
属性。这有两个原因
-
id
用于在持久化StepExecution
时作为步骤名称。如果在作业中的多个步骤中引用相同的独立步骤,则会发生错误。
-
在创建作业流程时,如 本章后面所述,
next
属性应该引用流程中的步骤,而不是独立步骤。
抽象 Step
有时,可能需要定义一个不是完整 Step
配置的父 Step
。例如,如果 reader
、writer
和 tasklet
属性从 Step
配置中省略,则初始化将失败。如果必须在没有一个或多个这些属性的情况下定义父级,则应使用 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
都声明了 <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>