1
votes

I'm using spring batch for reading data from an Oracle database and writing results in a CSV file.

I also need to separate spring batch metadata tables from the oracle database and for this, I configure two different data-sources in my batch configuration (an in-memory database for the spring batch metadata).

Here is my code :

BatchConfiguration.java

@Configuration
@EnableBatchProcessing
@EnableScheduling
public class BatchConfiguration {

  @Autowired
  public JobBuilderFactory jobBuilderFactory;

  @Autowired
  public StepBuilderFactory stepBuilderFactory;    


  @Bean
  @Qualifier("businessDataSource")
  @ConfigurationProperties(prefix = "spring.business.datasource")
  public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  @Primary
  @Qualifier("metadataDataSource")
  @ConfigurationProperties(prefix = "spring.metadata.datasource")
  public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().build();
  }
}

Then my itemReader bean looks like :

@Bean
public ItemReader<Person> reader(@Qualifier("businessDataSource") DataSource dataSource) {
  .....
}

When I run my Batch, everything is OK.

But when I try to add a JobLauncher and Job beans in my BatchApplication.java like this :

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job job;

The batch is trying to use the metadata database for my business database :

Caused by: org.springframework.jdbc.BadSqlGrammarException: Executing query; bad SQL grammar

Is there an issue in my code?

Thanks a lot

1
Why did you annotate @Primary on your secondaryDataSource? - mrkernelpanic
Hi, because the AbstractBatchConfiguration required a single bean but 2 found : Field dataSource in org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration required a single bean, but 2 were found: - primaryDataSource: defined by method 'primaryDataSource' in class path resource [com/example/batchprocessing/BatchConfiguration.class] - secondaryDataSource: defined by method 'secondaryDataSource' in class path resource [com/example/batchprocessing/BatchConfiguration.class] - hbellahc

1 Answers

0
votes

Finally I got a suolution

My reader bean was :

@Bean
public ItemReader<Person> reader(@Qualifier("businessDataSource") DataSource dataSource) {
  databaseReader.setDataSource(datasource);
   ....
}

And I change it by (and now it's works)

@Bean
  public ItemReader<Person> reader() {
    JdbcCursorItemReader<Person> databaseReader = new JdbcCursorItemReader<>();
    databaseReader.setDataSource(primaryDataSource());
    ....
  }