您需要定义从
validateCsvHeaderStep
COMPLETED
如下所示:
.start(validateCsvHeaderStep)
.on(ExitStatus.COMPLETED.exitCode).to(processCsvStep)
.from(validateCsvHeaderStep)on("*").to(decider())
下面是两个可能导致validateCsvHeaderStep和processCsvStep失败的步骤。我想有一个流程时,错误处理将去markCsvAsFailedStep和moveFailedCsvStep,但当一切正常工作,它应该去moveCsvStep。
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class MyJob {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
public Step validateCsvHeaderStep() {
return steps.get("validateCsvHeaderStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("validateCsvHeaderStep");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step processCsvStep() {
return steps.get("processCsvStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("processCsvStep");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step markCsvAsFailedStep() {
return steps.get("markCsvAsFailedStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("markCsvAsFailedStep");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step moveFailedCsvStep() {
return steps.get("moveFailedCsvStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("moveFailedCsvStep");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step moveCsvStep() {
return steps.get("moveCsvStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("moveCsvStep");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Job job() {
return jobs.get("job")
.flow(validateCsvHeaderStep())
.on(ExitStatus.FAILED.getExitCode()).to(markCsvAsFailedStep())
.from(validateCsvHeaderStep()).on("*").to(processCsvStep())
.from(processCsvStep()).on(ExitStatus.FAILED.getExitCode()).to(markCsvAsFailedStep())
.from(processCsvStep()).on("*").to(moveCsvStep())
.from(markCsvAsFailedStep()).on("*").to(moveFailedCsvStep())
.from(moveFailedCsvStep()).end()
.build();
}
public static void main(String[] args) throws Exception {
ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
Job job = context.getBean(Job.class);
jobLauncher.run(job, new JobParameters());
}
}
它打印:
validateCsvHeaderStep
processCsvStep
moveCsvStep
验证CsvHeaderStep
失败:
@Bean
public Step validateCsvHeaderStep() {
return steps.get("validateCsvHeaderStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("validateCsvHeaderStep");
chunkContext.getStepContext().getStepExecution().setExitStatus(ExitStatus.FAILED);
return RepeatStatus.FINISHED;
})
.build();
}
它打印:
validateCsvHeaderStep
markCsvAsFailedStep
moveFailedCsvStep
如果
processCsvStep
失败:
@Bean
public Step processCsvStep() {
return steps.get("processCsvStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("processCsvStep");
chunkContext.getStepContext().getStepExecution().setExitStatus(ExitStatus.FAILED);
return RepeatStatus.FINISHED;
})
.build();
}
validateCsvHeaderStep
processCsvStep
markCsvAsFailedStep
moveFailedCsvStep
希望这有帮助。