Как передать JobParameters в myBatisPagingItemReader без использования @StepScope - PullRequest
0 голосов
/ 02 февраля 2019

Я использую функциональность весеннего пакетного перезапуска, чтобы он читал с последней неудачной точки вперед.Мой перезапуск работает нормально, пока я не использую аннотацию @StepScope для моего метода myBatisPagingItemReader.

Мне нужно использовать @StepScope, чтобы я мог выполнить позднее связывание, чтобы получить jobParameters с помощьювходной параметр для моего метода bean myBatisPagingItemReader @Value("#{JobParameters['run-date']}"))

Если я использую @StepScope, перезапуск не работает.

Я попытался добавить прослушиватель new JobParameterExecutionContextCopyListener(), чтобы скопировать JobParameters в ExecutionContext.Но как я получу доступ к ExecutionContext внутри myBatisPagingItemReader, поскольку у меня нет открытых методов ItemReader?

Не знаете, как я могу получить доступ к jobParameters при запуске myBatisPagingItemReader без использования @StepScope?Пожалуйста, любые входные данные.

Также не уверен, что мое понимание правильного перезапуска пружины правильно относительно того, как он работает, когда новый экземпляр (с состоянием) используется при использовании @StepScope.

@Configuration
@EnableBatchProcessing
public class BatchConfig {
    @Bean
    public Step step1(StepBuilderFactory stepBuilderFactory,
        ItemReader<Model> myBatisPagingItemReader,
        ItemProcessor<Model, Model> itemProcessor,
        ItemWriter<Model> itemWriter) {

        return stepBuilderFactory.get("data-load")
            .<Model, Model>chunk(10)
            .reader(myBatisPagingItemReader)
            .processor(itemProcessor)
            .writer(itemWriter)
            .listener(itemReadListener())
             .listener(new JobParameterExecutionContextCopyListener())
            .build();
   }

   @Bean
    public Job job(JobBuilderFactory jobBuilderFactory, @Qualifier("step1") 
               Step step1) {
           return jobBuilderFactory.get("load-job")
            .incrementer(new RunIdIncrementer())
            .start(step1)
            .listener(jobExecutionListener())
            .build();
      }
}

@Component
public class BatchInputReader {

    @Bean
    //@StepScope
    public ItemReader<Model> myBatisPagingItemReader(
             SqlSessionFactory sqlSessionFactory) {
         MyBatisPagingItemReader<Model> reader = new 
         MyBatisPagingItemReader<>();
         Map<String, Object> parameterValues = new HashMap<>();
     // populate parameterValues  from jobParameters ??
         reader.setSqlSessionFactory(sqlSessionFactory);
         reader.setParameterValues(parameterValues);
         reader.setQueryId("query");
         return reader;
    }
 }

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Добавление к моему вопросу.Я добавил myBatisPagingItemReader (), как это было предложено для класса, аннотированного для конфигурации.

Перезапустите пример, когда я использую аннотацию @Stepscope для myBatisPagingItemReader (), программа чтения выбирает 5 записей, и у меня установлен размер чанка (commit-interval)3. 3. 1003 *

Экземпляр задания - 01 - Параметр задания - 01/02 / 2019.
чанк-1:
- запись процесса-1
- запись процесса-2
- запись процесса-3
Writer - запись всех 3 записей
успешная фиксация чанка-1

chunk-2: запись-процесса 4-запись процесса-5 - Работа и исключениязавершается и устанавливается в состояние «СБОЙ»

Теперь задание снова запускается с использованием того же параметра задания.
Экземпляр задания - 01 - Параметр задания - 01/02 / 2019.

chunk-1:
запись процесса-1
запись процесса-2
запись процесса-3
Writer - запись всех 3 записей
успешное принятие фрагмента-1

chunk-2:
запись процесса-4
запись процесса-5 - сбои и исключение
Job completes и установлен в состояние «FAILED»

Обратите внимание: здесь, когда я использую аннотацию @Stepscope для метода bean myBatisPagingItemReader (), задание создает новый экземпляр, см. ниже сообщение журнала.
Создание объекта в области действия = шаг, имя = scopedTarget.myBatisPagingItemReader
Зарегистрированный обратный вызов уничтожения в области действия = шаг, имя = scopedTarget.myBatisPagingItemReader

Поскольку это новый экземпляр, он запускает процесс с начала, а не с запуска скусок-2.

Если я не использую Stepscope, он перезапускается с чанка-2, когда устанавливается перезапущенный шаг задания - MyBatisPagingItemReader.read.count = 3.

Я хотел бы использовать Stepscope для использования поздних привязок, если я использую stepscope, возможно ли, чтобы мой myBatisPagingItemReader установил read.count после последнего сбоя, чтобы перезапустить работу?

или
Если я не использую @Stepscope, есть ли способ получить параметры задания внутри myBatisPagingItemReader?

0 голосов
/ 03 февраля 2019

Вы объявляете Spring Bean (myBatisPagingItemReader) в классе, помеченном @Component (BatchInputReader).Это не правильно.

Что вам нужно сделать, это объявить mybatis reader как bean-компонент в вашем классе конфигурации BatchConfig.После того, как это будет сделано, и компонент будет помечен @StepScope, вы можете передать параметры задания передачи следующим образом:

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Bean
    @StepScope
    public ItemReader<Model> myBatisPagingItemReader(
            SqlSessionFactory sqlSessionFactory,
            @Value("#{jobParameters['param1']}") String param1,
            @Value("#{jobParameters['param2']}") String param2) {
        MyBatisPagingItemReader<Model> reader = new
                MyBatisPagingItemReader<>();
        Map<String, Object> parameterValues = new HashMap<>();
        // populate parameterValues  from jobParameters ?? => Those can be now accessed from method parameters
        reader.setSqlSessionFactory(sqlSessionFactory);
        reader.setParameterValues(parameterValues);
        reader.setQueryId("query");
        return reader;
    }

    @Bean
    public Step step1(StepBuilderFactory stepBuilderFactory,
                      ItemReader<Model> myBatisPagingItemReader,
                      ItemProcessor<Model, Model> itemProcessor,
                      ItemWriter<Model> itemWriter) {

        return stepBuilderFactory.get("data-load")
                .<Model, Model>chunk(10)
                .reader(myBatisPagingItemReader)
                .processor(itemProcessor)
                .writer(itemWriter)
                .listener(itemReadListener())
                .listener(new JobParameterExecutionContextCopyListener())
                .build();
    }

    @Bean
    public Job job(JobBuilderFactory jobBuilderFactory, @Qualifier("step1")
            Step step1) {
        return jobBuilderFactory.get("load-job")
                .incrementer(new RunIdIncrementer())
                .start(step1)
                .listener(jobExecutionListener())
                .build();
    }
}

Подробнее об этом в Позднее связывание атрибутов задания и шага раздел.BatchInputReader будет оставлено пустым и больше не нужно.Меньше - больше!: -)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...