To use the default BatchConfigurer the context must contain no more thanone DataSource, found 2

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

I am using spring boot and spring batch. For meta table i want to use mysql and for all business thing i want to use db2 as a database.When i implemented getting error.

application.properties

spring.datasource.url = jdbc:mysql://localhost:3306/local spring.datasource.username = root spring.datasource.password = root spring.jpa.show-sql = true spring.jpa.hibernate.ddl-auto = update spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect  spring.seconddatasource.url=jdbc:db2://*************** spring.seconddatasource.username=****** spring.seconddatasource.password=**** spring.seconddatasource.driverClassName=com.ibm.db2.jcc.DB2Driver 

BatchCongig.java

error stack

java.lang.IllegalStateException: Failed to execute CommandLineRunner     at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:779) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at com.schwab.cat.SpringBatchDbReadApplication.main(SpringBatchDbReadApplication.java:10) [classes/:na] Caused by: java.lang.IllegalStateException: To use the default BatchConfigurer the context must contain no more thanone DataSource, found 2     at org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration.getConfigurer(AbstractBatchConfiguration.java:108) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]     at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration.initialize(SimpleBatchConfiguration.java:114) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]     at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$ReferenceTargetSource.createObject(SimpleBatchConfiguration.java:142) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]     at org.springframework.aop.target.AbstractLazyCreationTargetSource.getTarget(AbstractLazyCreationTargetSource.java:86) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE]     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:192) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE]     at com.sun.proxy.$Proxy46.getJobInstances(Unknown Source) ~[na:na]     at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.getNextJobParameters(JobLauncherCommandLineRunner.java:131) ~[spring-boot-autoconfigure-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:212) ~[spring-boot-autoconfigure-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:231) ~[spring-boot-autoconfigure-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:123) ~[spring-boot-autoconfigure-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:117) ~[spring-boot-autoconfigure-1.5.3.RELEASE.jar:1.5.3.RELEASE]     at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]     ... 6 common frames omitted 

I found one jira https://jira.spring.io/browse/BATCH-2537 which say that "@Primary datasource with @EnableBatchProcessing does not work for using multiple datasources" if this is correct please tell me how i can achive same. I also found this How to use 2 or more databases with spring? but not helpful in my case.

回答1:

As M. Deinum suggested, I would also put the configuration of the datasources in a separate file.

Beside that, there are the following problems in your configuration file:

  1. SpringBatch looks for a datasource named "dataSource" (note the capital S). If it doesn't find one, it looks for any datasource it finds. However, if it finds more than one, it throws an exception -> the one you observed.

  2. In your configuration file, you create two datasources and inject one (@Autowired Datasource dataSourceSecond). This would cause the next problem, since you don't have a datasource with this name. (You only defined the datasources "secondaryDataSource" and "primaryDataSource"). This would also lead to an exception.

Here is how I would organise my configurations

@Configuration public DatasourceConfiguration {      @Bean     @ConfigurationProperties(prefix="spring.seconddatasource")     public javax.sql.DataSource secondaryDataSource() {         return DataSourceBuilder.create().build();     }      // note the new name: dataSource -> this is the name springBatch is looking for     @Bean     @ConfigurationProperties(prefix="spring.datasource")     public javax.sql.DataSource dataSource() {         return DataSourceBuilder.create().build();     } }   @Configuration @EnableBatchProcessing @Import(DatasourceConfiguration.class) public class BatchConfiguration {      @Autowired     public JobBuilderFactory jobBuilderFactory;      @Autowired     public StepBuilderFactory stepBuilderFactory;      // note the name     @Autowired     public DataSource secondaryDataSource;       @Bean     public JdbcCursorItemReader<User> reader()     {         JdbcCursorItemReader<User> reader=new JdbcCursorItemReader<>();          // note the name         reader.setDataSource(secondaryDataSource);         reader.setSql("Select ACCT_ID from ACCT_table FETCH FIRST 100 ROWS ONLY");         reader.setRowMapper(new UserRowerMapper());         return reader;     }     ... 

I've also written an more thouroughly answer to a similar question: I would like to create a spring batch project where batch does not use my datasource



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!