親 Step からの継承

Steps のグループが同様の構成を共有している場合、具体的な Steps がプロパティを継承できる「親」 Step を定義すると役立つ場合があります。Java のクラス継承と同様に、「子」 Step はその要素と属性を親のものと結合します。子は、親の Steps もオーバーライドします。

次の例では、StepconcreteStep1 は parentStep から継承しています。itemReaderitemProcessoritemWriterstartLimit=5allowStartIfComplete=true でインスタンス化されます。さらに、次の例に示すように、concreteStep1Step によってオーバーライドされるため、commitInterval は 5 です。

<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 属性は、ジョブ要素内のステップで引き続き必要です。これには 2 つの理由があります。

  • id は、StepExecution を永続化する際のステップ名として使用されます。同じスタンドアロンステップがジョブの複数のステップで参照されている場合、エラーが発生します。

  • この章で後述するように、ジョブフローを作成する場合、next 属性は、スタンドアロンステップではなく、フロー内のステップを参照する必要があります。

抽象 Step

完全な Step 構成ではない親 Step を定義する必要がある場合があります。たとえば、readerwritertasklet 属性が Step 構成から除外されている場合、初期化は失敗します。これらのプロパティを 1 つ以上指定せずに親を定義する必要がある場合は、abstract 属性を使用する必要があります。abstractStep は拡張されるだけで、インスタンス化されることはありません。

次の例では、抽象として宣言されていない場合、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 が <listeners/> 要素を宣言する場合、子のリストが親のリストをオーバーライドします。子が親によって定義されたリストに追加のリスナーを追加できるようにするために、すべてのリスト要素に merge 属性があります。エレメントで merge="true" が指定されている場合、子のリストはオーバーライドされるのではなく、親のリストと結合されます。

次の例では、Step "concreteStep3" が 2 つのリスナー 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>