0

I have this Spring Batch flow:

return jobBuilderFactory.get(JOB).preventRestart().incrementer(new RunIdIncrementer()).listener(jobCompletionListener)
        .start(clean).next(generateFiles1).next(callApi1)
        .next(clean).next(generateFiles2).next(callApi2)
        .next(clean).next(generateFiles3).next(callApi3)
        .next(clean).next(generateFiles4).next(callApi4)
        .build();

I must repeat the first three steps (clean, generateFiles1 and callApi1) until a certain criteria is met (I have to count some data in the database to check if I need to call the API again). And so on for the next three steps. enter image description here

I have seen the on and to functions explained there, but it seems to me that it does not allow to write such loops.

I could define such flows:

final FlowBuilder<Flow> flowBuilderStep1 = new FlowBuilder<>("Step1");
flowBuilderStep1.start(clean).next(generateFiles1).next(callApi1).end();
final Flow step1 = flowBuilderStep1.build();

final FlowBuilder<Flow> flowBuilderStep2 = new FlowBuilder<>("Step2");
flowBuilderStep2.start(clean).next(generateFiles2).next(callApi2).end();
final Flow step2 = flowBuilderStep2.build();

And then build the conditional structure (maybe after adding Decider or afterStep() some place):

return jobBuilderFactory.get(JOB).preventRestart().incrementer(new RunIdIncrementer()).listener(jobCompletionListener)
        .start(step1).on("RETRY").to(step1).on("CONTINUE")
        .to(step2).on("RETRY").to(step2).on("CONTINUE")
        .to(step3).on("RETRY").to(step3).on("CONTINUE")
        .to(step4)
        .end().build();

But I don't think it would loop properly. Am I right? Can a loop be accomplished (without a xml config)?

Samuel
  • 594
  • 1
  • 6
  • 22

1 Answers1

0

I had to do something like that to make it work.

        return jobBuilderFactory.get(JOB).preventRestart().incrementer(new RunIdIncrementer()).listener(jobCompletionListener)                
                .start(step1).next(step1Decider).on(RETRY).to(step1).from(step1Decider).on(CONTINUE)
                .to(step2).next(step2Decider).on(RETRY).to(step2).from(step2Decider).on(CONTINUE)
        ...
Samuel
  • 594
  • 1
  • 6
  • 22