从父 Step 继承

如果一组 Steps 共享类似的配置,则定义一个“父级”Step 可能会有所帮助,具体 Steps 可以从中继承属性。与 Java 中的类继承类似,“子级”Step 将其元素和属性与父级元素和属性结合起来。子级还将覆盖父级的任何 Steps

在以下示例中,StepconcreteStep1 继承自 parentStep。它使用 itemReaderitemProcessoritemWriterstartLimit=5allowStartIfComplete=true 进行实例化。此外,commitInterval5,因为它被 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。例如,如果 readerwritertasklet 属性从 Step 配置中省略,则初始化会失败。如果必须在没有其中一个或多个属性的情况下定义父级,则应使用 abstract 属性。抽象 Step 仅被扩展,从未被实例化。

在以下示例中,如果未声明为抽象,则不会实例化 Step (abstractParentStep)。Step (concreteStep2) 具有 itemReaderitemWritercommit-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” 使用两个侦听器创建:listenerOnelistenerTwo

<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>