I am looking to make the use of JobExecutionDecider in my Spring Batch App. I've taken reference: How to use decider in Spring batch?.
For the code I written I am getting below error. Note: Surely I dont want to override the beans in my code. Any suggestion why this error?
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-01-01 19:32:30.859 ERROR 13800 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'step1', defined in class path resource [com/example/config/JobConfig.class], could not be registered. A bean with that name has already been defined in class path resource [com/example/JobConfiguration.class] and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
JobConfig.java
@Slf4j
@Configuration
public class JobConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Tasklet step1Tasklet() {
return new Step1Tasklet();
}
@Bean
public JobExecutionDecider decider() {
return new MyJobExecutionDecider();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(step1Tasklet())
.build();
}
// Here I used inbuild Tasklet
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet((contribution, chunkContext) -> {
log.debug("Step2Tasklet is executed...");
System.out.println("world");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet((contribution, chunkContext) -> {
log.debug("Step3Tasklet is executed...");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Job job() {
return jobBuilderFactory.get("myJob")
.start(step1())
.next(decider())
.on("YES").to(step2())
.from(decider()).on("NO").to(step3())
.end()
.build();
}
}
MyJobExecutionDecider.java
public class MyJobExecutionDecider implements JobExecutionDecider{
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
return new FlowExecutionStatus("YES");
}
}
Step1Tasklet.java
@Slf4j
public class Step1Tasklet implements Tasklet{
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
log.debug("Step1Tasklet is executed...");
chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("YES")); // or NO
return RepeatStatus.FINISHED;
}
}
SpringBatchDeciderApplication.java
@SpringBootApplication
@EnableBatchProcessing
public class SpringBatchDeciderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBatchDeciderApplication.class, args);
}
}