跳到主要内容

继承自父级 Step

QWen Plus 中英对照 Inheriting from a Parent Step Inheriting from a Parent Step

如果一组 Steps 共享类似的配置,那么定义一个“父级” Step 可能会有所帮助,具体的 Steps 可以从该父级 Step 继承属性。这类似于 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>
xml

id 属性在 job 元素内的 step 中仍然是必需的。这是出于两个原因:

  • 在持久化 StepExecution 时,id 被用作步骤名称。如果作业中的多个步骤引用了同一个独立步骤,则会发生错误。

  • 在创建作业流时,如本章后续部分所述next 属性应引用流中的步骤,而不是独立步骤。

摘要 Step

有时,可能需要定义一个不是完整 Step 配置的父级 Step。例如,如果在 Step 配置中省略了 readerwritertasklet 属性,则初始化将会失败。如果需要定义一个缺少这些属性之一或多个的父级 Step,则应使用 abstract 属性。abstractStep 只能被继承,不能被实例化。

在下面的示例中,如果 StepabstractParentStep)没有被声明为抽象的,则它不会被实例化。StepconcreteStep2)具有 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>
xml

合并列表

Steps 中的一些可配置元素是列表,例如 <listeners/> 元素。如果父级和子级 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>
xml