Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Para usar o BatchConfigurer padrão, o contexto não deve conter mais de um DataSource, encontrado 2


Como M. Deinum sugeriu, eu também colocaria a configuração das fontes de dados em um arquivo separado.

Além disso, existem os seguintes problemas em seu arquivo de configuração:

  1. SpringBatch procura uma fonte de dados chamada "dataSource" (observe o S maiúsculo). Se não encontrar um, ele procura por qualquer fonte de dados que encontrar. No entanto, se encontrar mais de um, ele lança uma exceção -> aquela que você observou.

  2. Em seu arquivo de configuração, você cria duas fontes de dados e injeta uma (@Autowired Datasource dataSourceSecond). Isso causaria o próximo problema, já que você não tem uma fonte de dados com esse nome. (Você definiu apenas as fontes de dados "secondaryDataSource" e "primaryDataSource"). Isso também levaria a uma exceção.

Aqui está como eu organizaria minhas configurações
@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;
    }

   ...

Também escrevi uma resposta mais completa para uma pergunta semelhante:Gostaria de criar um projeto em lote de mola em que o lote não usa minha fonte de dados