Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用@EnableBatchProcessing(modular=true)时,不考虑为BatchConfigurer提供的实现_Spring_Spring Boot_Spring Batch - Fatal编程技术网

Spring 使用@EnableBatchProcessing(modular=true)时,不考虑为BatchConfigurer提供的实现

Spring 使用@EnableBatchProcessing(modular=true)时,不考虑为BatchConfigurer提供的实现,spring,spring-boot,spring-batch,Spring,Spring Boot,Spring Batch,我正在开发一个使用Spring Boot的Spring批处理示例应用程序。我的要求是: 拥有自己的BasicBatchConfigurer实现,以便在使用不支持databaseType的SAP HANA as DB时配置AsyncTaskExecutor和自己的数据源 我想使用@EnableBatchProcessing(modular=true),这样我就可以注册多个作业并使用单独的子上下文启动它们 我已经添加了所有必需的配置。如果未设置modular=true,作业将启动并按预期工作。它

我正在开发一个使用Spring Boot的Spring批处理示例应用程序。我的要求是:

  • 拥有自己的
    BasicBatchConfigurer
    实现,以便在使用不支持databaseType的SAP HANA as DB时配置AsyncTaskExecutor和自己的数据源

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

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

然而,一旦设置了modular=true,我的实现中的bean就不会初始化

代码位于此处:

我进一步调试了这个问题:

  • 看起来,当我们设置modular=true时,
    BatchConfigurationSelector
    使用ModularBatchConfiguration
  • 在ModularBatchConfiguration中,有一个字段
    Collection configurers
    。这已被注释为
    @autowired
  • 如果我提供了一个实现,我假设这个字段是自动初始化的 在
    ModularBatchConfiguration
    类的注释中也提到了
    batchconfigurator
  • 然而,在调试时,我意识到上面的字段仍然为空,因为它加载了
    DefaultBatchConfigurer
    ,并遵循默认流程
我的问题是,为什么在
ModularBatchConfiguration
中没有初始化该字段
configurers
?我错过什么了吗

我使用的是SpringBoot2.1.2

我的问题是,为什么字段配置器没有在ModularBatchConfiguration中初始化?我错过什么了吗

您在
META-INF/Spring.factories
文件中定义的Spring引导自定义自动配置和Spring批处理配置之间遇到了生命周期问题

我调试了您的代码,下面是如何解决此问题:

  • 删除
    org.springframework.boot.autoconfigure.enableautoconfigure=\
    com.example.job.data.persistence.config.AsyncBatchConfigurer
    来自
    META-INF/spring.factories
    文件。这不需要作为Spring批处理 将在声明为bean时检测
    AsyncBatchConfigurer
    。 您甚至可以删除这个
    spring.factories
    文件
  • AsyncBatchConfigurer
    中删除
    @ConditionalOnMissingBean(BatchConfigurer.class)
    : 由于您将该类声明为
    @Configuration
    类,因此它也将被定义为
    BatchConfigurer
    类型的bean,并将被
    ModularBatchConfiguration
  • 通过这两项更改,
    ModularBatchConfiguration
    中的字段
    configurers
    与您的
    AsyncBatchConfigurer
    正确地自动连接

    作为旁注,您不需要使用
    AsyncBatchConfigurer\configurers
    方法,因为Spring将在
    ModularBatchConfiguration
    中注入所有
    BatchConfigurer
    bean

    希望这有帮助