我希望在我的Spring Batch应用程序中使用JobExecutionDecider
。我已参考:How to use decider in Spring batch?。
对于我编写的代码,我遇到了以下错误。注意:当然,我不想覆盖代码中的bean。任何建议为什么会出现此错误?
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);
}
}
我已经尝试过您的例子。基本上,我复制了您的代码并运行(除了我在Tasklet中删除了一行)。一切正常。我已将代码推送到github的https://github.com/bigzidane/spring-batch-validate-reader
请拉扯并自己尝试。如果您遇到相同的问题,请发表评论。
如果决策者是,则它正在执行步骤1和步骤2
2020-01-01 12:03:32.415 INFO 7300 --- [ main] c.b.e.s.d.SpringBatchDeciderApplication : Starting SpringBatchDeciderApplication on WINDOWS-ESDA5FC with PID 7300 (C:\Users\dotha\IdeaProjects\spring-boot-batch\target\classes started by dotha in C:\Users\dotha\IdeaProjects\spring-boot-batch)
2020-01-01 12:03:32.419 INFO 7300 --- [ main] c.b.e.s.d.SpringBatchDeciderApplication : No active profile set, falling back to default profiles: default
2020-01-01 12:03:33.650 INFO 7300 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-01-01 12:03:33.910 INFO 7300 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-01-01 12:03:34.045 INFO 7300 --- [ main] o.s.b.c.r.s.JobRepositoryFactoryBean : No database type set, using meta data indicating: H2
2020-01-01 12:03:34.305 INFO 7300 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : No TaskExecutor has been set, defaulting to synchronous executor.
2020-01-01 12:03:34.493 INFO 7300 --- [ main] c.b.e.s.d.SpringBatchDeciderApplication : Started SpringBatchDeciderApplication in 2.525 seconds (JVM running for 3.001)
2020-01-01 12:03:34.495 INFO 7300 --- [ main] o.s.b.a.b.JobLauncherCommandLineRunner : Running default command line with: []
2020-01-01 12:03:34.617 INFO 7300 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [FlowJob: [name=myJob]] launched with the following parameters: [{run.id=1}]
2020-01-01 12:03:34.638 INFO 7300 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
2020-01-01 12:03:34.652 INFO 7300 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
world
2020-01-01 12:03:34.660 INFO 7300 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [FlowJob: [name=myJob]] completed with the following parameters: [{run.id=1}] and the following status: [COMPLETED]
2020-01-01 12:03:34.663 INFO 7300 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2020-01-01 12:03:34.664 INFO 7300 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
如果决策者为否,它正在执行步骤1和步骤3
2020-01-01 12:00:45.046 INFO 20384 --- [ main] c.b.e.s.d.SpringBatchDeciderApplication : Starting SpringBatchDeciderApplication on WINDOWS-ESDA5FC with PID 20384 (C:\Users\dotha\IdeaProjects\spring-boot-batch\target\classes started by dotha in C:\Users\dotha\IdeaProjects\spring-boot-batch)
2020-01-01 12:00:45.049 INFO 20384 --- [ main] c.b.e.s.d.SpringBatchDeciderApplication : No active profile set, falling back to default profiles: default
2020-01-01 12:00:46.176 INFO 20384 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-01-01 12:00:46.393 INFO 20384 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-01-01 12:00:46.499 INFO 20384 --- [ main] o.s.b.c.r.s.JobRepositoryFactoryBean : No database type set, using meta data indicating: H2
2020-01-01 12:00:46.703 INFO 20384 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : No TaskExecutor has been set, defaulting to synchronous executor.
2020-01-01 12:00:46.862 INFO 20384 --- [ main] c.b.e.s.d.SpringBatchDeciderApplication : Started SpringBatchDeciderApplication in 2.205 seconds (JVM running for 2.705)
2020-01-01 12:00:46.864 INFO 20384 --- [ main] o.s.b.a.b.JobLauncherCommandLineRunner : Running default command line with: []
2020-01-01 12:00:46.954 INFO 20384 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [FlowJob: [name=myJob]] launched with the following parameters: [{run.id=1}]
2020-01-01 12:00:46.982 INFO 20384 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
2020-01-01 12:00:47.006 INFO 20384 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step3]
2020-01-01 12:00:47.017 INFO 20384 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [FlowJob: [name=myJob]] completed with the following parameters: [{run.id=1}] and the following status: [COMPLETED]
2020-01-01 12:00:47.030 INFO 20384 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2020-01-01 12:00:47.033 INFO 20384 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.