CyberProwler
CyberProwler

Reputation: 73

Can I define one common StepListener for all steps? Java Batch Jobs API

I have written a JobStepListener which needs to be executed before and after each step. However each job contains many steps (over 1000 steps) and it would be tedious to insert the listener inside each step, especially since I have multiple jobs which require this feature. So instead of writing each step like:

<step id="step_001" next="step_002">
    <listeners>
        <listener ref="jobStepMonitoring"/>
    </listeners>
    <batchlet ref="batchJob"/>
</step>
<step id="step_002" next="step_003">
    <listeners>
        <listener ref="jobStepMonitoring"/>
    </listeners>
    <batchlet ref="batchJob"/>
</step>
<step id="step_003">
    <listeners>
        <listener ref="jobStepMonitoring"/>
    </listeners>
    <batchlet ref="batchJob"/>
</step>

Is there a way to do it once like defining the job listener but for each step?

    <listeners>
        <listener ref="jobStepMonitoring"/>
    </listeners>
    <step id="step_001" next="step_002">
        <batchlet ref="batchJob"/>
    </step>
    <step id="step_002" next="step_003">
        <batchlet ref="batchJob"/>
    </step>
    <step id="step_003">
        <batchlet ref="batchJob"/>
    </step>

Upvotes: 2

Views: 367

Answers (1)

Mahmoud Ben Hassine
Mahmoud Ben Hassine

Reputation: 31600

Spring's Bean definition inheritance is what you are looking for. You need to define an abstract step definition in which you declare the common listener:

<step id="parent_step" abstract="true">
   <listeners>
      <listener ref="jobStepMonitoring"/>
   </listeners>
</step>

Then each step could inherit from the parent step:

<step id="step_001" next="step_002" parent="parent_step">
   <!-- concrete step definition here -->
   <!-- the listener will be inherited and can be overridden if needed -->
</step>

Upvotes: 1

Related Questions