Параллельная обработка Spring создает шаги, основанные на результате step1 - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь реализовать параллельную обработку с использованием пружинной загрузки и пакетной обработки. Эта партия будет запущена из пользовательского интерфейса с некоторыми обязательными параметрами

Мне нужно создать шаги на основе параметров запроса, я попробовал, как показано ниже,

Контроллер покоя выглядит,

JobParameters jobParameters = new JobParametersBuilder().addLong("JobID",System.currentTimeMillis())
                    .addString("fileName", filename) 
                    .addString("buisinessDate", model.getGeneralServiceModel().getBusinessDate()) 
                    .addString("source", model.getGeneralServiceModel().getSource()) 
                    .toJobParameters();
            jobLauncher.run(job, jobParameters);

И пакетный конфиг:

Flow masterFlow = (Flow)new FlowBuilder("masterFlow").start(stepOne()).build();

    List<Step> steps = new ArrayList<Step>();
    for (ConcurrentLinkedQueue date : taskOne.readFile()) {
        steps.add(createStep(date));
    }

    return jobs.get("myJob")
            .start(masterFlow)
             .next(createParallelFlow(steps))
             .end()
             .build();

masterFlow считывает параметры задания в его переменные, а readFile () выдает список (на основании этого должны быть созданы шаги), для этого требуются параметры jobParameters.

Проблема:

При запуске самого приложения readFile () выполняется. но мне нужно, чтобы он выполнялся, когда задание запускается через RestController, поскольку оно имеет необходимые параметры.

Пожалуйста, помогите мне, как я могу остановить это выполнение при запуске приложения.

1 Ответ

0 голосов
/ 11 марта 2019

Мне нужно создать шаги на основе результата step1

Создание шагов - это то, что вы делаете во время настройки. Результат шага 1 может быть известен только во время выполнения. Таким образом, чтобы сделать это, вам необходимо получить доступ к контексту приложения во время выполнения и динамически зарегистрировать шаговые бины на основе результата шага 1. Я не уверен, действительно ли это то, к чему вы стремитесь.

Однако, если вы хотите выполнить (не создавать, а выполнить) эти шаги на основе результата шага 1, тогда вы можете использовать JobExecutionDecider. Пожалуйста, обратитесь к Программные решения потока для более подробной информации и примера кода. Подобный вопрос можно найти здесь: Как использовать decider в Spring batch?

Но для обработки шага 1 мне нужны параметры запроса.

Я вижу, вам удалось получить параметры запроса и установить их в качестве параметров задания. Что вы можете сделать, так это получить доступ к этим параметрам задания на вашем шаге выполнения шага. Вот пример, если ваш шаг - простой тасклет:

class MyTasklet implements Tasklet {
    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        Map<String, Object> jobParameters = chunkContext.getStepContext().getJobParameters();
        // use job parameters
        return RepeatStatus.FINISHED;
    }
}

Если ваш шаг является тасклетом, ориентированным на чанк, вы можете использовать StepListener#beforeStep, чтобы получить доступ к выполнению шага.

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

...