sql >> Base de Datos >  >> RDS >> Mysql

Para usar el BatchConfigurer predeterminado, el contexto no debe contener más de un DataSource, encontrado 2

Como sugirió M. Deinum, también pondría la configuración de las fuentes de datos en un archivo separado.

Además de eso, existen los siguientes problemas en su archivo de configuración:

  1. SpringBatch busca una fuente de datos llamada "dataSource" (tenga en cuenta la S mayúscula). Si no encuentra ninguna, busca cualquier fuente de datos que encuentre. Sin embargo, si encuentra más de uno, lanza una excepción -> la que observaste.

  2. En su archivo de configuración, crea dos fuentes de datos e inyecta una (@Autowired Datasource dataSourceSecond). Esto causaría el siguiente problema, ya que no tiene una fuente de datos con este nombre. (Solo definió las fuentes de datos "secundariaDataSource" y "primaryDataSource"). Esto también daría lugar a una excepción.

Así es como organizaría mis configuraciones

@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;
    }

   ...

También escribí una respuesta más detallada a una pregunta similar:Me gustaría crear un proyecto de lotes de primavera donde el lote no use mi fuente de datos