Spring Batch: sumber data untuk Batch dan sumber data untuk step

Nov 17 2020

Saya perlu mendapatkan akses ke dua sumber data:

  • Repositori batch musim semi: dalam memori H2
  • Langkah saya perlu mendapatkan akses ke mssql.

Saya telah melihat beberapa contoh di sana tentang cara membuat kustom batch configurer.

Namun, terkadang:

  1. implements BatchConfigurer
  2. extends DefaultBatchConfigurer

Saat ini, file konfigurasi saya adalah:

.
├── steps
│   └── MssqlBatchConfigurationStep.java
└── MainJobBatchConfiguration.java

Konfigurasi langkah saya adalah:

@Configuration
public class MssqlBatchConfigurationStep {

    private DataSource dataSource;

    /**
     *
     * @param dataSource
     */
    public MssqlBatchConfigurationStep(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     *
     * @return
     */
    public ItemReader<Unitat> reader() {
        String sql = "SELECT operation,update_time,table_name,rowid,user_login,user_name, user_ip,application_name,application_version,new_value,old_value FROM renovastorage.data_log";

        JdbcCursorItemReader<Unitat> jdbcCursorItemReader = new JdbcCursorItemReader<>();
        jdbcCursorItemReader.setDataSource(this.dataSource);
        jdbcCursorItemReader.setSql(sql);
        jdbcCursorItemReader.setVerifyCursorPosition(false);
        jdbcCursorItemReader.setRowMapper(new UnitatRowMapper());

        return jdbcCursorItemReader;
    }

    /**
     *
     * @return
     */
    public ItemWriter<UnitatDenormalized> writer() {
        // write to solr
        return null;
    }

}

Masalahnya di sini adalah, langkah ini mendapatkan sumber data default. Sumber data ini sama dengan yang didapat Spring Batch.

Untuk mengatasinya, saya ingin membuat sebuah "Batch Configurer"untuk mendapatkan sumber data tertentu, bukan yang default.

Di sini Anda dapat melihat konfigurasi pekerjaan saya:

@Configuration
@EnableBatchProcessing
// @EnableScheduling
public class MainJobBatchConfiguration {

    private JobBuilderFactory jobBuilderFactory;
    private StepBuilderFactory stepBuilderFactory;

    private MssqlBatchConfigurationStep unitatBatchStep;

    /**
     *
     * @param jobBuilderFactory
     * @param stepBuilderFactory
     */
    public MainJobBatchConfiguration(
        JobBuilderFactory jobBuilderFactory,
        StepBuilderFactory stepBuilderFactory,
        MssqlBatchConfigurationStep unitatBatchStep
    ) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
        this.unitatBatchStep = unitatBatchStep;
    }


    /**
     *
     * @return
     */
    @Bean
    public Step step() {
        return this.stepBuilderFactory
            .get("mssql")
            .<Unitat, UnitatDenormalized>chunk(10)
            .reader(this.unitatBatchStep.reader())
            .writer(this.unitatBatchStep.writer())
            .build();
    }

    /**
     *
     * @param step
     * @return
     */
    @Bean
    public Job job(Step step) {
        Job job = this.jobBuilderFactory.get("job1")
            .flow(step)
            .end()
            .build();
        return job;
    }

}

Jawaban

1 Shawrup Nov 17 2020 at 08:04

Anda perlu menambahkan bean sumber data sekunder dan melakukan autowire sumber data tersebut.

application.properties

spring.second-datasource.url = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]
spring.second-datasource.driverClassName= [driverClassName]

Konfigurasi sumber data

    @Primary
    @Bean(value = "defaultDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource datasource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        return dataSource;
    }

    @Bean(value = "secondDataSource")
    @ConfigurationProperties(prefix = "spring.second-datasource")
    public DataSource ticketDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        return dataSource;
    }

Pasang otomatis secondDataSource di pembaca Anda.

    private DataSource dataSource;

    /**
     *
     * @param dataSource
     */
    public MssqlBatchConfigurationStep(@Qualifier("secondDataSource") DataSource dataSource) {
        this.dataSource = dataSource;
    }
1 MahmoudBenHassine Nov 17 2020 at 08:00

Langkah saya perlu mendapatkan akses ke mssql.

Untuk mengatasinya, saya ingin membuat "Batch Configurer" untuk mendapatkan sumber data tertentu, bukan yang default.

Untuk mengatasinya, saya akan menambahkan kualifikasi pada sumber data untuk menentukan mana yang harus digunakan pada langkah:

@Configuration
public class MssqlBatchConfigurationStep {

   private DataSource dataSource;

   /**
    *
    * @param dataSource
   */
   public MssqlBatchConfigurationStep(@Qualifier("YOUR_MSSQL_DATASOURCE_BEAN_NAME") DataSource dataSource) {
      this.dataSource = dataSource;
   }

}

Dengan itu, pembaca Anda harus mengarah ke sumber data mssql dan membaca data darinya.