使用@EnableBatchProcessing(modular = true)

时间:2019-02-13 04:30:02

标签: spring spring-boot spring-batch

我正在开发带有Spring Boot的Spring Batch的示例应用程序。我的要求是:

  • 具有我自己的BasicBatchConfigurer实现,以便可以配置AsyncTaskExecutor和自己的dataSource,因为我正在使用SAP HANA作为不支持databaseType的DB。

  • 我想使用@EnableBatchProcessing(modular=true),以便我可以注册多个作业并使用单独的子上下文启动它们

我已经添加了所有必需的配置。如果未设置module = true,则作业将启动并按预期工作。它将初始化从我的BasicBatchConfigurer实现中定义的bean。

但是,一旦设置了modules = 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 :(得分:1)

  

我的问题是为什么字段配置器没有在ModularBatchConfiguration中初始化?我想念什么吗?

您遇到了META-INF/spring.factories文件中定义的Spring Boot自定义自动配置与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类型的Bean,并且将被ModularBatchConfiguration
  3. 检测到。

通过这两项更改,configurers中的字段ModularBatchConfiguration已正确地与您的AsyncBatchConfigurer自动接线。

请注意,您不需要AsyncBatchConfigurer#configurers方法,因为Spring会完成将所有BatchConfigurer Bean注入ModularBatchConfiguration中的工作。

希望这会有所帮助。