Spring batch 尝试为Spring批处理架构和应用程序配置单独的数据源时,Spring引导启动应用程序错误

Spring batch 尝试为Spring批处理架构和应用程序配置单独的数据源时,Spring引导启动应用程序错误,spring-batch,spring-cloud-task,Spring Batch,Spring Cloud Task,我们的应用程序使用Oracle 11.2作为数据库。因为不想将“spring批处理元数据”表与常规应用程序表混合,所以创建了一个新的模式。但是,在尝试配置两个单独的数据源时,请始终注意以下错误: //configuration first datasource @Configuration @EnableBatchProcessing public class BatchConfig{ private sta

我们的应用程序使用Oracle 11.2作为数据库。因为不想将“spring批处理元数据”表与常规应用程序表混合,所以创建了一个新的模式。但是,在尝试配置两个单独的数据源时,请始终注意以下错误:

       //configuration first datasource

        @Configuration
        @EnableBatchProcessing
        public class BatchConfig{
            private static final Logger logger = LoggerFactory.getLogger(ReutersMarketDataReadConfig.class);

            ..

            @Bean
            @ConfigurationProperties(prefix = "spring.batch.datasource")
            public DataSource getBatchDataSource() {
            return DataSourceBuilder.create().build();
            }
        ....
        }


        //second data source
        @Configuration
        @EnableTransactionManagement
        @EnableJpaRepositories(
            entityManagerFactoryRef = "appEntityManagerFactory",
            transactionManagerRef = "appTransactionManager",
            basePackages = {"com.xyz.abc.repository" }
        )
        public class ApplicationDBConfig {

            @Primary
            @Bean(name = "appDataSource")
            @ConfigurationProperties(prefix = "spring.datasource")
            public DataSource dataSource() {
            return DataSourceBuilder.create().build();
            }

            @Primary
            @Bean(name = "appEntityManagerFactory")
            public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
                @Qualifier("appDataSource") DataSource dataSource) {
            return builder.dataSource(dataSource).packages("com.xyz.abc.model").persistenceUnit("app").build();
            }

            @Primary
            @Bean(name = "appTransactionManager")
            public PlatformTransactionManager transactionManager(
                @Qualifier("appEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
            }
        }
错误:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
[30m2019-04-02 14:56:16,706[0;39m [1;31mERROR[0;39m [[34mrestartedMain[0;39m] [33morg.springframework.boot.SpringApplication[0;39m: Application run failed
            org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jobInvokerController': Unsatisfied dependency expressed through field 'processLiborFeedJob'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processLiborFeedJob' defined in class path resource [com/db/sts/marketdata/batch/config/ReutersMarketDataReadConfig.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'taskBatchExecutionListener' defined in class path resource [org/springframework/cloud/task/batch/configuration/TaskBatchAutoConfiguration$TaskBatchExecutionListenerAutoconfiguration.class]: Unsatisfied dependency expressed through method 'taskBatchExecutionListener' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration': Invocation of init method failed; nested exception is java.lang.IllegalStateException: To use the default TaskConfigurer the context must contain no more than one DataSource, found 2
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
                at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)

错误
表'secondarydf.batch\u job\u instance'不存在。
之所以发生,是因为默认情况下,Spring batch将使用
数据源
bean,该bean用
@Primary
注释,而不是您所期望的
getBatchDataSource
bean

@EnableBatchProcessing
注释中:

如果在上下文中定义了多个数据源,则将使用带Primary注释的数据源


相关的问题是。因此,在您的情况下,您可以使您的类
BatchConfig
扩展
DefaultBatchConfigurer
,并用要用于批处理的类重写
setDataSource

错误
表'secondarydf.batch\u job\u instance'不存在。
发生的原因是默认情况下,Spring批处理将使用
dataSource
bean,该bean用
@Primary
注释,而不是您所期望的
getBatchDataSource
bean

@EnableBatchProcessing
注释中:

如果在上下文中定义了多个数据源,则将使用带Primary注释的数据源


相关的问题是。因此,在您的情况下,您可以使您的类
BatchConfig
扩展
DefaultBatchConfigurer
,并用要用于批处理的类覆盖
setDataSource

根据例外情况,您是否创建了
TaskConfigurer
?(错误地保留了不完整的编辑),将TaskConfigurer添加到“第二个”数据源,但随后出现异常(可能是因为它似乎混合了应用程序[用于读/写]的数据源,该数据源与Spring Batch用于写入元数据的数据源一样->由以下原因引起:org.springframework.jdbc.badsqlgramarException:PreparedStatementCallback;错误的SQL语法[从批处理作业实例中选择作业实例,其中作业名称=?和作业密钥=?];嵌套异常是java.sql.SQLSyntaxErrorException:表'secondarydf.batch_job_instance'不存在。我需要查看代码以提供帮助…添加示例项目以找到一个具有多个迭代的解决方案,该解决方案似乎可以工作,最新的代码提交给github。仍然不确定该解决方案是否非常干净,可能是一些外部的代码是可以避免的。请提供任何重构或改进的建议?根据异常,您是否创建了
TaskConfigurer
?(错误地保留了不完整的编辑),将TaskConfigurer添加到“第二个”数据源,但随后出现异常(可能是因为它似乎将应用程序[用于读/写]的数据源与Spring Batch用于写入元数据的数据源混合在一起->原因:org.springframework.jdbc.badsqlgramarException:PreparedStatementCallback;错误的SQL语法[从批处理作业实例中选择作业实例,其中作业名称=?和作业密钥=?];嵌套异常是java.sql.SQLSyntaxErrorException:表'secondarydf.batch_job_instance'不存在。我需要查看代码以提供帮助…添加示例项目以找到一个具有多个迭代的解决方案,该解决方案似乎可以工作,最新的代码提交给github。仍然不确定该解决方案是否非常干净,可能是一些外部的可以避免代码。请提供任何重构或改进的建议?谢谢。已尝试添加BatchConfigurer覆盖应用程序架构中的所有表,github链接在以前的项目中发布。如果时间允许,请克隆项目BatchConfigurer configurer(@Qualifier)(“batchDataSource”)数据源数据源){返回新的DefaultBatchConfigurer(batchDataSource());}感谢您的建议/帮助,只做了一些调整就可以正常工作。代码更新到github,还请参阅以前文章中添加的新注释。现在尝试下一步连接到Oracle 11.2,其中Spring Boot 2.x的flyway依赖性导致了问题。将保持Posted仍然面临问题,无法使用Spring任务项目(使用2个数据源)与Spring Cloud数据流,因为“任务”的执行不会触发底层配置的批处理作业。将相同的内容发布到Spring github。当使用2个数据源(一个用于Spring元数据,另一个用于应用程序)时,面临间歇性的“最终”问题“保存/提交到应用程序数据源。根据其他一些帖子,建议使用“ChainedTransactionManager”,是否有人有示例或任何其他建议(因为两个单独的tx上下文正在运行,导致不可预测的行为)?谢谢。尝试添加BatchConfigurer仍然覆盖应用程序架构中的所有表,github链接在以前的项目中发布。如果时间允许,请克隆项目BatchConfigurer configurer(@Qualifier(“batchDataSource”)DataSource DataSource){返回新的DefaultBatchConfigurer(batchDataSource());}感谢您的建议/帮助,只做了一些调整就可以正常工作。代码更新到github,还请参阅以前文章中添加的新注释。现在尝试下一步连接到Oracle 11.2,其中Spring Boot 2.x的flyway依赖性导致了问题。将保持Posted仍然面临问题,无法使用Spring任务项目(使用2个数据源)与Spring Cloud数据流,因为“任务”的执行不会触发底层配置的批处理作业。将相同内容发布到Spring github。当使用2个数据源(一个用于Spring元数据,另一个用于应用程序)时,面临“最终”保存/co的间歇性问题