Контекст выполнения рабочего шага Spring batch — не согласован с контекстом в базе данных

#java #spring #spring-batch

#java #spring #spring-batch

Вопрос:

Я реализовал удаленное разделение с помощью шага менеджера, обрабатывающего 2 файла в двух рабочих.

Последний шаг задания (manager) — это тасклет, который выполняет цикл по JobExecution.stepExecutions() и ищет количество записей / чтений для определенного имени шага.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя в таблице BATCH_STEP_EXECUTION, сохраненной в БД (mysql), рабочие шаги имеют контекст, выровненный с тем, что я ожидаю, контекст, извлеченный из объекта в коде Java, пуст (количество чтения / записи равно 0), я также пытался добавить эти значения в StepExecutionContext, но контекст по-прежнему содержит только ключ раздела с путем к файлу.

Это мой рабочий шаг

 @Bean
public Step mainWorkerStep() {
    return this.remotePartitioningWorkerStepBuilderFactory
            .get(STEP_NAME_MAIN_WORKER)
            .inputChannel(requests())
            .listener(switchDataSourceListener)
            .<IntegrityReport, IntegrityReport>chunk(integrityJobPropertyHolder.getStagingWriterChunkSize())
            .reader(integrityReportReaderConfig)
            .writer(integrityReportWriterConfig)
            .listener(partitionImportSummaryListener)
            .build();
}
  

и это шаг менеджера

 @Bean
public Step loadDataManagerStep() {
    return remotePartitioningManagerStepBuilderFactory
            .get(STEP_NAME_LOAD_DATA_MANAGER)
            .partitioner(STEP_NAME_MAIN_WORKER, batchCommonMultiResourcePartitioner)
            .gridSize(10)
            .timeout(30 * 60 * 1000) // 30 minutes
            .pollInterval(10000) // 10 seconds
            .outputChannel(outboundRequests())
            .build();
}
  

Как вы можете видеть на скриншоте ниже, статус «НАЧИНАЕТСЯ», в то время как в базе данных ЗАВЕРШЕНО.

контекст памяти выполнения шага

контекст базы данных

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

1. Является ли этот последний тасклет отдельным шагом, следующим за разделенным шагом? Как вы получаете выполнение задания?

2. @MahmoudBenHassine последний тасклет «ImportSummary» — это место, где я получаю информацию о выполнении шага, chunkContext.getStepContext().getStepExecution().getJobExecution().getStepExecutions() . Я также попытался добавить информацию от рабочего в контекст выполнения задания, но новые записи не сохраняются в БД. Я расширил конфигурацию BatchIntegrationConfiguration, чтобы установить конкретный txManager, мне интересно, может ли это быть проблемой

3. @MahmoudBenHassine. общедоступный класс IntegrityBatchIntegrationConfiguration расширяет пакетную конфигурацию { общедоступный модуль IntegrityBatchIntegrationConfiguration(JobRepository JobRepository, JobExplorer jobExplorer, @Qualifier(«batchJobManagementTxManager») PlatformTransactionManager TransactionManager) { super(JobRepository, jobExplorer, TransactionManager); }

4. @MahmoudBenHassine Я удалил расширение BatchIntegrationConfiguration и теперь извлекаю информацию о количестве записей / чтений из loadDataManagerStep, где они установлены правильно, не уверен почему, хотя контексты выполнения шага partion: 0 / parition: 1 не обновляются при извлечении информации из тасклета

5. У вас есть минимальный пример, который я могу использовать для воспроизведения проблемы?