Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Um den Standard-BatchConfigurer zu verwenden, darf der Kontext nicht mehr als eine DataSource enthalten, gefunden 2

Wie M. Deinum vorgeschlagen hat, würde ich auch die Konfiguration der Datenquellen in eine separate Datei packen.

Außerdem gibt es folgende Probleme in Ihrer Konfigurationsdatei:

  1. SpringBatch sucht nach einer Datenquelle namens "dataSource" (beachten Sie das große S). Wenn es keine findet, sucht es nach einer beliebigen Datenquelle, die es findet. Wenn es jedoch mehr als eine findet, löst es eine Ausnahme aus -> die, die Sie beobachtet haben.

  2. In Ihrer Konfigurationsdatei erstellen Sie zwei Datenquellen und injizieren eine (@Autowired Datasource dataSourceSecond). Dies würde das nächste Problem verursachen, da Sie keine Datenquelle mit diesem Namen haben. (Sie haben nur die Datenquellen "secondaryDataSource" und "primaryDataSource" definiert). Auch dies würde zu einer Ausnahme führen.

So würde ich meine Konfigurationen organisieren

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

   ...

Ich habe auch eine ausführlichere Antwort auf eine ähnliche Frage geschrieben:Ich möchte ein Spring-Batch-Projekt erstellen, bei dem Batch meine Datenquelle nicht verwendet