Spring batch 尝试为Spring批处理架构和应用程序配置单独的数据源时,Spring引导启动应用程序错误
我们的应用程序使用Oracle 11.2作为数据库。因为不想将“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
//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的间歇性问题