Spring Data Flow переопределяет параметры задания при запуске

В настоящее время у меня проблема с вызовом задач в Spring Cloud Data Flow.

У меня есть приложение Spring Batch (содержащее одношаговое задание), зарегистрированное в SCDF, и определение задачи на основе этого приложения. Во время моего первого запуска этой задачи я использовал пару параметров / аргументов задания. По причине, которую я теперь знаю, все мои последующие запуски переопределяют свои параметры первым набором, который я использовал.

Я использую базу данных SCDF 1.4.0 + MSSQL, но то же самое происходит и с SCDF 1.3.2 + H2 или MSSQL.

BatchConfig.java

    @Configuration
    public class BatchConfig {

        @Autowired
        TaskletStep taskletStep;

        @Autowired
        public JobBuilderFactory jobBuilderFactory;

        @Autowired
        public StepBuilderFactory stepBuilderFactory;


        @Bean
        public Step step1() {
            return stepBuilderFactory.get("step1")
                    .tasklet(taskletStep)
                    .build();
        }

        @Bean
        public Job job() throws Exception {
            return jobBuilderFactory.get("job")
                    .incrementer(new RunIdIncrementer())
                    .start(step1())
                    .build();
        }
}

TaskletStep.java:

@Configuration
@StepScope
public class TaskletStep  implements Tasklet{


    @Value("#{jobParameters['filePath']}")
    private String filePath;

    @Value("#{jobParameters['informante']}")
    private String informante;

    @Autowired
    RemessaParser remessaParserService;

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        GICLogger.info("Recebido job com path: " + filePath + " para o informante "+ informante);
        try{
            Path remessa = Paths.get(filePath);
            if(Files.exists(remessa)){
                String idRemessa = remessaParserService.remessaReader(remessa, informante);
                GICLogger.info("### TaskletStep:" + idRemessa + " é o ID da Remessa!");
                return RepeatStatus.FINISHED;
            }else{
                GICLogger.error("Não foi possível encontrar a remessa em "+filePath);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return RepeatStatus.FINISHED;
    }
}

Моя команда запуска:

dataflow> task launch negTask --arguments "filePath=/tmp/jars/remessa.txt informante=CaixaB --spring.cloud.task.closecontext_enable=false"

Журнал приложений:

2018-04-04 13:33:28 [main] INFO c.b.g.n.BatchNegativacaoApp - Запуск BatchNegativacaoApp за 13,938 секунды (JVM работает на 14,599)

2018-04-04 13:33:28 [main] INFO osbabJobLauncherCommandLineRunner - Запуск командной строки по умолчанию с: [filePath = / tmp / jars / Remessa.txt, informante = Caixa, --spring.cloud.task.closecontext_enable = false , --spring.cloud.task.executionid = 17]

2018-04-04 13:33:28 [main] INFO osbclsupport.SimpleJobLauncher - Задание: [SimpleJob: [name = job]] запущено со следующими параметрами: [{filePath = / home / enrico / PROJETOS / GIC / java /remessa.txt, -spring.cloud.task.executionid = 8, informante = Caixa, -spring.cloud.task.closecontext_enable = false, run.id = 12, time = 1522842134819}]

Вы хоть представляете, почему это происходит?

Спасибо за внимание и любой вклад!

С уважением, Энрико


person Enrico Bergamo    schedule 04.04.2018    source источник
comment
Не то чтобы проблема в этом, но вам не нужно @Configuration на TaskletStep. Просто используйте @Component. Каков был результат предыдущего запуска (COMPLETE или FAILED)?   -  person Michael Minella    schedule 04.04.2018
comment
Нужно ли мне тогда сканировать пакет компонентов в моем классе SpringBootApp? В любом случае статус был FAILED, потому что я тестировал только часть тасклета, он не должен быть успешным. Влияет ли это на предстоящие задачи?   -  person Enrico Bergamo    schedule 04.04.2018
comment
Быстрое обновление. Удалив реестры из BATCH_JOB_EXECUTION_PARAMS, мне удалось запустить новую задачу с правильными параметрами, но предстоящие задачи продолжают давать мне такое же поведение.   -  person Enrico Bergamo    schedule 04.04.2018
comment
Если ваше задание выполняется с теми же идентификационными параметрами и последняя попытка не удалась, оно будет пытаться перезапустить предыдущий запуск по умолчанию.   -  person Michael Minella    schedule 05.04.2018
comment
Спасибо, что прояснили это для меня! Есть ли способ избежать такого поведения или изменить его? Под идентификацией параметров вы подразумеваете одинаковые имена параметров, а не их значения, верно? Есть ли какая-нибудь передовая практика, как программно завершить задачу с правильным статусом, чтобы этого не произошло? Заранее спасибо!   -  person Enrico Bergamo    schedule 05.04.2018
comment
На этот вопрос, вероятно, лучше ответить на канале Gitter gitter.im/spring-cloud/spring-cloud -dataflow   -  person Michael Minella    schedule 05.04.2018


Ответы (1)


Привет, Энрико, у меня была проблема схожести, попробуй, это работает.

@Bean
@Qualifier("load")
public Job load(JobCompletionNotificationListener listener, Step step1, 
@Qualifier("stepValidation") Step stepValidation) {
    return jobBuilderFactory.get("load")
            .incrementer(new SampleIncrementer())
            .listener(listener)
            .flow(stepValidation)
            .next(step1)
            .end().build();
}

public class SampleIncrementer implements JobParametersIncrementer {

    public JobParameters getNext(JobParameters parameters) {
        if (parameters==null || parameters.isEmpty()) {
            return new JobParametersBuilder().addLong("run.id", 1L).toJobParameters();
        }

        long id = parameters.getLong("run.id",1L) + 1;
        return new JobParametersBuilder().addLong("run.id", id)
            .toJobParameters();
    }
}
person Guilherme Chafy    schedule 07.04.2018
comment
Спасибо, Гильерме. Ваш класс SampleIncrementer отлично справился с задачей! - person Enrico Bergamo; 03.05.2018