Jak zasugerował M. Deinum, umieściłbym również konfigurację źródeł danych w osobnym pliku.
Poza tym w Twoim pliku konfiguracyjnym występują następujące problemy:
-
SpringBatch szuka źródła danych o nazwie „dataSource” (zwróć uwagę na duże S). Jeśli go nie znajdzie, szuka dowolnego znalezionego źródła danych. Jeśli jednak znajdzie więcej niż jeden, zgłasza wyjątek -> ten, który zaobserwowałeś.
-
W pliku konfiguracyjnym tworzysz dwa źródła danych i wstrzykujesz jedno (@Autowired Datasource dataSourceSecond). Spowodowałoby to kolejny problem, ponieważ nie masz źródła danych o tej nazwie. (Zdefiniowałeś tylko źródła danych „secondaryDataSource” i „primaryDataSource”). Prowadziłoby to również do wyjątku.
Oto jak uporządkowałbym moje konfiguracje
@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;
}
...
Napisałem też dokładniejszą odpowiedź na podobne pytanie:Chciałbym utworzyć wiosenny projekt wsadowy, w którym partia nie korzysta z mojego źródła danych