Langkah duplikat [langkah2] terdeteksi dalam pelaksanaan pekerjaan = [pekerjaan]. Jika salah satu langkah gagal, keduanya akan dijalankan lagi saat memulai ulang
Penentu Batch Musim Semi akan mengalami forloop. Saya memiliki persyaratan di bawah ini.
Jika Step1
dieksekusi, periksa decider () jika "NO"
kemudian akhiri Job, jika "Yes"
kemudian jalankan Step2
, jika Step2 SELESAI maka jalankan decider () f "NO"
kemudian akhiri Job, jika "Yes"
kemudian jalankan Step3
.
Ada panduan bagaimana kita bisa mengkonfigurasi dalam batch?
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
Kode 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();
}
}
Catatan - Karena batasan keamanan, saya tidak dapat memuat diagram Alir dari workstation kantor :(
Jawaban
Anda memiliki bug dalam definisi aliran Anda. The SUCCESS
Hasil dari penentuan pergi ke dua langkah yang berbeda:
.from(decider()).on("SUCCESS").to(step2())
...
.from(decider()).on("SUCCESS").to(step3())
Selain itu, definisi transisi dari step2
tidak lengkap. Anda hanya menentukan transisi dari langkah2 pada COMPLETED
:
.from(step2()).on("COMPLETED").to(decider())
Anda juga harus menentukan transisi dari step2
untuk kasus lain.