Условный поток Spring Batch Не выполняет остальную часть - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь добиться потока, показанного на изображении ниже, с помощью пакета Spring.Я имел в виду конфигурацию Java на странице 85 https://docs.spring.io/spring-batch/4.0.x/reference/pdf/spring-batch-reference.pdf, где говорится о конфигурации Java.

Requirement

По какой-то причине, когда Decider возвращает TYPE2, партия завершается с ошибочным состоянием без какого-либо сообщения об ошибке.Ниже приведена конфигурация java моей работы:

jobBuilderFactory.get("myJob")
            .incrementer(new RunIdIncrementer())
            .preventRestart()
            .start(firstStep())
            .next(typeDecider()).on("TYPE1").to(stepType1()).next(lastStep())
            .from(typeDecider()).on("TYPE2").to(stepType2()).next(lastStep())
            .end()
            .build();

Я думаю, что-то не так с конфигурацией java, хотя она совпадает с документом Spring.Поток может быть полезен здесь, но я уверен, что был бы выход без него.Есть идеи, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Натолкнулся на аналогичную проблему, когда еще не вызывается часть (технически вызывается только сначала ())

Почти все веб-сайты, связанные с примерами потока и принятия решения, имеют схожие конфигурации заданий ине смог понять, в чем заключалась проблема.

После некоторых исследований выяснил, каким образом весна поддерживает решающих и принимающих решения.На высоком уровне, при инициализации приложения, на основе конфигурации задания Spring поддерживает список решений для объекта-решателя (например, decsion0, solution1 и т. Д.).

, когда мы вызываем метод decider (), он всегдавозвращает новый объект для решающего.Поскольку он возвращает новый объект, список содержит только одно сопоставление для каждого объекта (т. Е. Solution0) и, поскольку он является списком, он всегда возвращает первое сконфигурированное решение. Так что это причина того, почему только первый сконфигурированный переход былcall.

Решение: Вместо вызова метода для решающего устройства создайте однотонный компонент для решающего устройства и используйте его в конфигурации задания

Пример:

@Bean
public JobExecutionDecider stepDecider() {
    return new CustomStepDecider();
}

внедрите его и используйте в компоненте создания вакансии

@Bean
public Job sampleJob(Step step1, Step step2,Step step3,
JobExecutionDecider stepDecider) {

return jobBuilderFactory.get("sampleJob")                    
        .start(step1)
        .next(stepDecider).on("TYPE1").to(step2)
        .from(stepDecider).on("TYPE2").to(step3)


}

Надеюсь, это поможет.

0 голосов
/ 18 сентября 2018

Вам необходимо определить поток не только от решающего элемента до следующих шагов, но также начиная с stepType1 и stepType2 до lastStep.Вот пример:

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.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.JobExecutionDecider;
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 firstStep() {
        return steps.get("firstStep")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("firstStep");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

    @Bean
    public JobExecutionDecider decider() {
        return (jobExecution, stepExecution) -> new FlowExecutionStatus("TYPE1"); // or TYPE2
    }

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

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

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

    @Bean
    public Job job() {
        return jobs.get("job")
                .start(firstStep())
                .next(decider())
                    .on("TYPE1").to(stepType1())
                    .from(decider()).on("TYPE2").to(stepType2())
                    .from(stepType1()).on("*").to(lastStep())
                    .from(stepType2()).on("*").to(lastStep())
                    .build()
                .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());
    }

}

Это печатает:

firstStep
stepType1
lastStep

Если решающее значение возвращает TYPE2, образец печатает:

firstStep
stepType2
lastStep

Надеюсь, это поможет.

...