Реализация, предоставленная для BatchConfigurer, не учитывается при использовании @EnableBatchProcessing (modular = true) - PullRequest
0 голосов
/ 13 февраля 2019

Я разрабатываю пример приложения, которое Spring Batch с Spring Boot.Мое требование:

  • У меня есть собственная реализация BasicBatchConfigurer, чтобы я мог настроить AsyncTaskExecutor и свой собственный источник данных, поскольку я использую SAP HANA в качестве БД, для которой тип базы данных не поддерживается.

  • Я хочу использовать @EnableBatchProcessing(modular=true), чтобы я мог зарегистрировать несколько заданий и запустить их с отдельным дочерним контекстом

Я добавил все необходимыеконфигурации.Без установки modular = true, задание запускается и работает как положено.Он инициализирует bean-компоненты, определенные в моей реализации BasicBatchConfigurer.

Однако, как только модуль modular = true установлен, bean-компоненты из моей реализации не инициализируются.

Код размещен здесь: https://github.com/VKJEY/spring-framework-evaluation

Я продолжил отладку:

  • Похоже, когда мы устанавливаем modular = true, BatchConfigurationSelector использует ModularBatchConfiguration
  • В ModularBatchConfiguration есть поле Collection<BatchConfigurer> configurers.Это было помечено как @autowired.
  • Я предполагаю, что это поле автоматически инициализируется, если я предоставил реализацию BatchConfigurer, как это было упомянуто в комментариях к классу ModularBatchConfiguration, а также
  • Однако во время отладки я понял, что указанное выше поле все еще равно нулю, поскольку оно загружает DefaultBatchConfigurer и следует потоку по умолчанию.

Мой вопрос: почему это поле configurers не инициализируется в ModularBatchConfiguration?Я что-то упустил?

Я использую Spring boot 2.1.2.

1 Ответ

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

Мой вопрос: почему эти полевые конфигураторы не инициализируются в ModularBatchConfiguration?Я что-то упустил?

Вы столкнулись с проблемой жизненного цикла между пользовательской автоконфигурацией Spring Boot, которую вы определили в файле META-INF/spring.factories, и конфигурацией Spring Batch.

Я отладил вашукод и вот, как решить проблему:

  1. удалить org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.job.data.persistence.config.AsyncBatchConfigurer из META-INF/spring.factories файла.Это не требуется, поскольку Spring Batch обнаружит AsyncBatchConfigurer, когда он объявлен как bean-компонент.Вы даже можете удалить этот spring.factories файл
  2. удалить @ConditionalOnMissingBean(BatchConfigurer.class) из AsyncBatchConfigurer: поскольку вы объявили этот класс как класс @Configuration, он также будет определен как компонент типа BatchConfigurer ибудет обнаружен ModularBatchConfiguration

С этими двумя изменениями поле configurers в ModularBatchConfiguration будет правильно подключено автоматически с вашим AsyncBatchConfigurer.

. Как примечание стороны,вам не нужен метод AsyncBatchConfigurer#configurers, так как Spring сделает инъекцию всех BatchConfigurer бинов в ModularBatchConfiguration.

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

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