我正在开发带有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
我对问题进行了进一步调试:
BatchConfigurationSelector
使用ModularBatchConfiguration Collection<BatchConfigurer> configurers
。这已被标注为@autowired
。BatchConfigurer
类的注释中也提到了ModularBatchConfiguration
DefaultBatchConfigurer
并遵循默认流程。 我的问题是,为什么configurers
中的字段ModularBatchConfiguration
没有被初始化?我想念什么吗?
我正在使用Spring Boot 2.1.2。
答案 0 :(得分:1)
我的问题是为什么字段配置器没有在ModularBatchConfiguration中初始化?我想念什么吗?
您遇到了META-INF/spring.factories
文件中定义的Spring Boot自定义自动配置与Spring Batch配置之间的生命周期问题。
我调试了您的代码,这是解决问题的方法:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.job.data.persistence.config.AsyncBatchConfigurer
来自META-INF/spring.factories
文件。不需要,因为Spring Batch
当AsyncBatchConfigurer
被声明为bean时,它将检测到。
您甚至可以删除此spring.factories
文件@ConditionalOnMissingBean(BatchConfigurer.class)
中删除AsyncBatchConfigurer
:
由于您将该类声明为@Configuration
类,因此它也将被定义为BatchConfigurer
类型的Bean,并且将被ModularBatchConfiguration
通过这两项更改,configurers
中的字段ModularBatchConfiguration
已正确地与您的AsyncBatchConfigurer
自动接线。
请注意,您不需要AsyncBatchConfigurer#configurers
方法,因为Spring会完成将所有BatchConfigurer
Bean注入ModularBatchConfiguration
中的工作。
希望这会有所帮助。