Пакет Spring — выполнение шагов на основе проблемы с решениями

#spring #spring-batch

#spring #пакет spring-batch

Вопрос:

Я разрабатываю весенний пакет, в котором я Steps-1 Step-10 выполняю последовательно. В моем случае для шага с 4 по шаг 7 я должен принять условное решение, на основе которого я выполнил Step-X, Step-Y и и Step-Z т. Д.

Пример: Шаг-4 — Предварительное условие, если Step-X выдает какой-либо статус, отличный от ошибки, затем выполнить Step-4 , если Step-X не удалось, затем выполнить failedStep() шаг.

Шаг-5 — Предварительное условие, если Step-Y выдает какой-либо статус, отличный от ошибки, затем выполнить Step-5 , если Step-Y не удалось, затем выполнить failedStep() шаг.

Шаг-6 — Предварительное условие, если Step-Z выдает какой-либо статус, отличный от ошибки, затем выполнить Step-6 , если Step-z не удалось, затем выполнить failedStep() шаг и step-8 to step-10 . Я хочу сделать все только в одном пакетном задании.

Я разработал некоторый код, но, похоже, ему не нравится условие.

Ошибка — метод on(String) не определен для типа Step

 @Configuration
public class JobConfig {
    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Bean
    public Step step1() {
        return steps.get("step1")
                .tasklet((StepContribution contribution, ChunkContext chunkContext) -> {
                    System.out.println("Step1");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

    @Bean
    public Step step2() {
        return steps.get("step2")
                .tasklet((StepContribution contribution, ChunkContext chunkContext) -> {
                    System.out.println("step2");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

    @Bean
    public Step step3() {
        return steps.get("step3")
                .tasklet((StepContribution contribution, ChunkContext chunkContext) -> {
                    System.out.println("step3");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }


    @Bean
    public Step step4() {
        return steps.get("step4")
                .tasklet((StepContribution contribution, ChunkContext chunkContext) -> {
                    System.out.println("step4");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    @Bean
    public Step step5() {
        return steps.get("step5")
                .tasklet((StepContribution contribution, ChunkContext chunkContext) -> {
                    System.out.println("step5");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

    @Bean
    public Step stepX() {
        return steps.get("stepX")
                .tasklet((StepContribution contribution, ChunkContext chunkContext) -> {
                    System.out.println("step4Check");
                    // int update = jdbcTemplate.update("Query", "SBC"); // Perform some meaningful DB operations
                    int update = 1; // To simulate issue locally !
                    if(update == 1) {
                        chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("COMPLETED"));
                    }else {
                        chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("FAILED"));
                    }
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

    @Bean
    public Step stepY() {
        return steps.get("stepY")
                .tasklet((StepContribution contribution, ChunkContext chunkContext) -> {
                    System.out.println("step4Check");
                    // int update = jdbcTemplate.update("Query", "XYZ"); // Perform some meaningful DB operations
                    int update = 1; // To simulate issue locally !
                    if(update == 1) {
                        chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("COMPLETED"));
                    }else {
                        chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("FAILED"));
                    }
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    
    @Bean
    public Step failedStep() {
        return steps.get("failedStep")
                .tasklet((contribution, chunkContext) -> {
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

    @Bean
    public Job job() {
        return jobs.get("job")
                .start(step1())
                .next(step2())
                .next(step3())
                .next(stepX().on(ExitStatus.FAILED.getExitCode()).to(failedStep())
                .from(stepX()).on("*").to(step4())
                
                .from(stepY()).on(ExitStatus.FAILED.getExitCode()).to(failedStep())
                .from(stepY()).on("*").to(step5())
                .build();
    }
}
 

введите описание изображения здесь

Комментарии:

1. Я не смог следовать вашему определению потока из всех этих условий в текстовом формате. Можете ли вы опубликовать диаграмму, похожую на docs.spring.io/spring-batch/docs/4.3.x/reference/html /… того, чего вы пытаетесь достичь?

2. @MahmoudBenHassine — Я добавил поток, не могли бы вы указать, пожалуйста? Я хочу сделать все это за одно задание (если это возможно).

3. Я только что увидел ваше обновление, спасибо. Картинка стоит тысячи слов! Рад видеть, что вы смогли реализовать свой поток по мере необходимости.

Ответ №1:

Я смог решить проблему, используя следующий код — для меня это работает отлично.

Подход-1

 @Bean
    public Job job() {
        return jobs.get("job")
                .start(step1())
                .next(step2())
                .next(step3()).on(ExitStatus.FAILED.getExitCode()).to(failedStep())
                .from(step3()).on("*").to(stepX())
                
                .from(stepX()).on(ExitStatus.FAILED.getExitCode()).to(failedStep())
                .from(stepX()).on("*").to(step4())

                .from(step4()).on(ExitStatus.FAILED.getExitCode()).to(failedStep())
                .from(step4()).on("*").to(stepY())

                .from(stepY()).on(ExitStatus.FAILED.getExitCode()).to(failedStep())
                .from(stepY()).on("*").to(step5())
                .next(step6())
                .build()
                .build();
    }
 

Подход-2

 @Bean
public Job job() {
    return jobs.get("job")
            .start(step1())
            .next(step2())
            .next(step3())
            .next(stepX()).on(ExitStatus.FAILED.getExitCode()).to(failedStep())
            .from(stepX()).on("*").to(step4())

            .next(stepY()).on(ExitStatus.FAILED.getExitCode()).to(failedStep())
            .from(stepY()).on("*").to(step5())
            .next(step6())
            .build()
            .build();
}