Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pour utiliser le BatchConfigurer par défaut, le contexte ne doit pas contenir plus d'une source de données, trouvée 2

Comme suggéré par M. Deinum, je mettrais également la configuration des sources de données dans un fichier séparé.

A côté de cela, il y a les problèmes suivants dans votre fichier de configuration :

  1. SpringBatch recherche une source de données nommée "dataSource" (notez le S majuscule). S'il n'en trouve pas, il recherche n'importe quelle source de données qu'il trouve. Cependant, s'il en trouve plusieurs, il lève une exception -> celle que vous avez observée.

  2. Dans votre fichier de configuration, vous créez deux sources de données et en injectez une (@Autowired Datasource dataSourceSecond). Cela causerait le problème suivant, puisque vous n'avez pas de source de données avec ce nom. (Vous avez uniquement défini les sources de données « secondaryDataSource » et « primaryDataSource »). Cela conduirait également à une exception.

Voici comment j'organiserais mes 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;
    }

   ...

J'ai également écrit une réponse plus approfondie à une question similaire :Je voudrais créer un projet Spring batch où batch n'utilise pas ma source de données