Som M. Deinum föreslog, skulle jag också lägga konfigurationen av datakällorna i en separat fil.
Utöver det finns det följande problem i din konfigurationsfil:
-
SpringBatch letar efter en datakälla som heter "dataSource" (notera det stora S). Om den inte hittar någon söker den efter vilken datakälla den hittar. Men om den hittar mer än en, ger den ett undantag -> det du observerade.
-
I din konfigurationsfil skapar du två datakällor och injicerar en (@Autowired Datasource dataSourceSecond). Detta skulle orsaka nästa problem, eftersom du inte har en datakälla med detta namn. (Du definierade bara datakällorna "secondaryDataSource" och "primaryDataSource"). Detta skulle också leda till ett undantag.
Så här skulle jag organisera mina konfigurationer
@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;
}
...
Jag har också skrivit ett mer ingående svar på en liknande fråga:Jag skulle vilja skapa ett vårbatch-projekt där batch inte använder min datakälla