Hi,
It is possible to apply if else logic in spring batch, usually we will call this as condition based execution of steps.
In brief if the condition is true go and execute step1 or go and execute step2.
To achieve if - else logic in spring batch we have to use decision tag provided by spring batch.
Following example explains how to achieve if else logic in spring batch.
For More examples on Spring batch and Java .. Please refer
It is possible to apply if else logic in spring batch, usually we will call this as condition based execution of steps.
In brief if the condition is true go and execute step1 or go and execute step2.
To achieve if - else logic in spring batch we have to use decision tag provided by spring batch.
Following example explains how to achieve if else logic in spring batch.
For More examples on Spring batch and Java .. Please refer
jobs.xml
<!-- *************************************************************************************************************************************** -->
<!-- Condition Based excutions (Same as If/Else logic in Java) -->
*************************************************************************************************************************************** -->
<batch:job id="conditionJob" parent="simpleJob">
<batch:step id="masterBrain" next="decision">
<batch:tasklet ref="dummyJob" />
</batch:step>
<batch:decision decider="decider" id="decision">
<batch:next on="masterMind" to="masterMind" />
<batch:next on="dummyMind" to="dummyMind" />
</batch:decision>
<batch:step id="masterMind">
<batch:tasklet ref="sayHello"/>
</batch:step>
<batch:step id="dummyMind">
<batch:tasklet ref="sayBye"/>
</batch:step>
</batch:job>
<!-- Decision maker -->
<bean id="decider" class="com.springbatchdemo.utils.Decider"/>
<bean id="dummyJob" class="com.springbatchdemo.tasklet.Dummy" />
<bean id="sayHello" class="com.springbatchdemo.tasklet.SayHello" />
<bean id="sayBye" class="com.springbatchdemo.tasklet.SayBye" />
Decider.java
public class Decider implements JobExecutionDecider{
@Override
public FlowExecutionStatus decide(JobExecution arg0, StepExecution arg1) {
if(true){
return new FlowExecutionStatus("masterMind");
}else{
return new FlowExecutionStatus("dummyMind");
}
}
Dummy.java
public class Dummy implements Tasklet
{
@Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
{
return RepeatStatus.FINISHED;
}
}
<!-- *************************************************************************************************************************************** -->
<!-- Condition Based excutions (Same as If/Else logic in Java) -->
*************************************************************************************************************************************** -->
<batch:job id="conditionJob" parent="simpleJob">
<batch:step id="masterBrain" next="decision">
<batch:tasklet ref="dummyJob" />
</batch:step>
<batch:decision decider="decider" id="decision">
<batch:next on="masterMind" to="masterMind" />
<batch:next on="dummyMind" to="dummyMind" />
</batch:decision>
<batch:step id="masterMind">
<batch:tasklet ref="sayHello"/>
</batch:step>
<batch:step id="dummyMind">
<batch:tasklet ref="sayBye"/>
</batch:step>
</batch:job>
<!-- Decision maker -->
<bean id="decider" class="com.springbatchdemo.utils.Decider"/>
<bean id="dummyJob" class="com.springbatchdemo.tasklet.Dummy" />
<bean id="sayHello" class="com.springbatchdemo.tasklet.SayHello" />
<bean id="sayBye" class="com.springbatchdemo.tasklet.SayBye" />
Decider.java
public class Decider implements JobExecutionDecider{
@Override
public FlowExecutionStatus decide(JobExecution arg0, StepExecution arg1) {
if(true){
return new FlowExecutionStatus("masterMind");
}else{
return new FlowExecutionStatus("dummyMind");
}
}
Dummy.java
public class Dummy implements Tasklet
{
@Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
{
return RepeatStatus.FINISHED;
}
}
SayHello.java
public class SayHello implements Tasklet
{
@Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
{
System.out.println("From Hi");
return RepeatStatus.FINISHED;
}
}
@Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
{
System.out.println("From Hi");
return RepeatStatus.FINISHED;
}
}
SayBye.java
public class SayBye implements Tasklet
{
@Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
{
System.out.println("From Bye");
return RepeatStatus.FINISHED;
}
}
Hope above small example help you in designing condition based implementation in spring batch.
@Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
{
System.out.println("From Bye");
return RepeatStatus.FINISHED;
}
}
Hope above small example help you in designing condition based implementation in spring batch.
Can you post the complete code?
ReplyDeleteI want to execute a working example of batch:decision to take complex decisions like getting input from previous step and decide next step based on that...
Thanks,
Pratik
Thanks Manu K
ReplyDeleteIt's verry interessant
Thanks for the details manu. I see you have used oly tasklet in this example to return tge status. Can i also send back the status from writer class which is within step so that decider can get called
ReplyDelete