Wykryto zduplikowany krok [krok 2] podczas wykonywania zadania = [zadanie]. Jeśli którykolwiek krok się nie powiedzie, oba zostaną ponownie wykonane po ponownym uruchomieniu
Dec 08 2020
Funkcja Spring Batch przechodzi do pętli. Mam poniżej wymagania.
Jeśli Step1
execute, sprawdź decider () if "NO"
then end Job, if "Yes"
then execute Step2
, jeśli Step2 jest ZAKOŃCZONY, wówczas execute decider () f "NO"
then end Job, if "Yes"
then execute Step3
.
Jakieś wskazówki, jak skonfigurować partię?
2020-12-08 11:41:11.473 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
step1
2020-12-08 11:41:11.493 INFO 16800 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step1] executed in 20ms
2020-12-08 11:41:11.508 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2
2020-12-08 11:41:11.513 INFO 16800 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 5ms
2020-12-08 11:41:11.568 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Duplicate step [step2] detected in execution of job=[job]. If either step fails, both will be executed again on restart.
2020-12-08 11:41:11.571 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2
2020-12-08 11:41:11.577 INFO 16800 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 6ms
2020-12-08 11:41:11.585 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Duplicate step [step2] detected in execution of job=[job]. If either step fails, both will be executed again on restart.
2020-12-08 11:41:11.589 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2
2020-12-08 11:41:11.594 INFO 16800 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 5ms
2020-12-08 11:41:11.601 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Duplicate step [step2] detected in execution of job=[job]. If either step fails, both will be executed again on restart.
2020-12-08 11:41:11.604 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2
2020-12-08 11:41:11.608 INFO 16800 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 3ms
2020-12-08 11:41:11.616 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Duplicate step [step2] detected in execution of job=[job]. If either step fails, both will be executed again on restart.
2020-12-08 11:41:11.618 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2
2020-12-08 11:41:11.623 INFO 16800 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 5ms
2020-12-08 11:41:11.630 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Duplicate step [step2] detected in execution of job=[job]. If either step fails, both will be executed again on restart.
2020-12-08 11:41:11.634 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2
2020-12-08 11:41:11.638 INFO 16800 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 4ms
2020-12-08 11:41:11.646 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Duplicate step [step2] detected in execution of job=[job]. If either step fails, both will be executed again on restart.
2020-12-08 11:41:11.648 INFO 16800 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2
Kod Java
@Configuration
public class Config {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
public Step step1() {
return steps.get("step1")
.tasklet((contribution, chunkContext) -> {
System.out.println("step1");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public JobExecutionDecider decider() {
return (jobExecution, stepExecution) -> new FlowExecutionStatus("SUCCESS"); // or NO
}
@Bean
public Step step2() {
return steps.get("step2")
.tasklet((contribution, chunkContext) -> {
System.out.println("step2");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step3() {
return steps.get("step3")
.tasklet((contribution, chunkContext) -> {
System.out.println("step3");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step5() {
return steps.get("step5")
.tasklet((contribution, chunkContext) -> {
System.out.println("Step 5");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step4() {
return steps.get("step4")
.tasklet((contribution, chunkContext) -> {
System.out.println("Step 4");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Job job() {
return jobs.get("job")
.incrementer(new RunIdIncrementer())
.start(step1())
.next(decider())
.from(decider()).on("SUCCESS").to(step2())
.from(decider()).on("NO").end()
.from(step2()).on("COMPLETED").to(decider())
.from(decider()).on("SUCCESS").to(step3())
.from(decider()).on("NO").end()
.end()
.build();
}
}
Uwaga - ze względu na ograniczenia bezpieczeństwa nie mogę załadować diagramu przepływu ze stacji roboczej :(
Odpowiedzi
MahmoudBenHassine Dec 09 2020 at 18:00
Masz błąd w definicji przepływu. SUCCESS
Wynik z decydującym idzie na dwóch różnych etapach:
.from(decider()).on("SUCCESS").to(step2())
...
.from(decider()).on("SUCCESS").to(step3())
Ponadto definicje przejść z step2
są niekompletne. Zdefiniowałeś tylko przejście od kroku 2 COMPLETED
:
.from(step2()).on("COMPLETED").to(decider())
należy również zdefiniować przejście z step2
dla innych przypadków.