Spring Batch : Batch 용 데이터 소스 및 단계 용 데이터 소스

Nov 17 2020

두 개의 데이터 소스에 액세스해야합니다.

  • 스프링 배치 저장소 : 메모리 H2
  • 내 단계에서 mssql.

커스텀을 만드는 방법에 대한 몇 가지 예를 보았습니다 batch configurer.

그러나 때때로 :

  1. implements BatchConfigurer
  2. extends DefaultBatchConfigurer

현재 내 구성 파일은 다음과 같습니다.

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

내 단계 구성은 다음과 같습니다.

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

}

여기서 문제는이 단계가 기본 데이터 소스를 가져 오는 것입니다. 이 데이터 소스는에서 가져온 것과 동일합니다 Spring Batch.

이를 해결 "Batch Configurer"하기 위해 기본 데이터 소스 대신 특정 데이터 소스를 가져 오기 위해를 만들고 싶습니다 .

여기에서 내 작업 구성을 볼 수 있습니다.

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

}

답변

1 Shawrup Nov 17 2020 at 08:04

보조 데이터 소스 빈을 추가하고 해당 데이터 소스를 자동 연결해야합니다.

application.properties

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

데이터 소스 구성

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

리더에서 secondDataSource를 자동 연결합니다.

    private DataSource dataSource;

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

내 단계는 mssql에 액세스해야합니다.

이를 해결하기 위해 기본 데이터 소스 대신 특정 데이터 소스를 얻기 위해 "Batch Configurer"를 만들고 싶습니다.

이를 해결하기 위해 대신 데이터 소스에 한정자를 추가하여 단계에서 사용할 한정자를 지정합니다.

@Configuration
public class MssqlBatchConfigurationStep {

   private DataSource dataSource;

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

}

이를 통해 독자는 mssql 데이터 소스를 가리키고 데이터를 읽어야합니다.