복붙노트

[SPRING] 스프링 배치는 테이블을 생성하기 위해 커스텀 데이터 소스를 사용하지 않습니다

SPRING

스프링 배치는 테이블을 생성하기 위해 커스텀 데이터 소스를 사용하지 않습니다

배치 작업을 실행하는 REST 서비스 (Spring 부트 사용)를 작업 중입니다. Batch 와만 작동하고 싶습니다. 내장 데이터 소스 (메타 데이터 저장), 기본 데이터 소스 (필자의 경우 Postgres)는 비즈니스 엔터티를 저장하는 데 사용됩니다.

문제는 Batch가 시작시 기본 데이터 소스에 메타 데이터 테이블 (batch_job_execution, batch_job_instance 등)을 만들려고한다는 것입니다.

다음은 문제를 재현하는 샘플 구성입니다.

배치 구성

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
        super.setDataSource(dataSource);
    }
}

데이터 소스 구성

@Configuration
public class DataSourceConfiguration {
    @Bean
    @Primary
    public DataSource DataSource() {
        final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriverClass(org.postgresql.Driver.class);
        dataSource.setUrl("jdbc:postgresql://localhost:5432/test_batch");
        dataSource.setUsername("user");
        dataSource.setPassword("password");

        return dataSource;
    }

    @Bean(name = "batchDataSource")
    public DataSource batchDataSource() {
        return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
    }
}

이 구성을 사용하면 마이크로 서비스가 시작될 때 Postgres에서 배치 테이블을 얻습니다. 아마도, 임베드 된 데이터 소스가 사용되는 것 같습니다. 작업을 시작할 때 H2에 대해 "테이블을 찾을 수 없음"오류가 발생하기 때문입니다.

그렇다면 배치가 임베디드 데이터 소스에서만 작동하도록 구성을 올바르게 작성해야합니까? 기본 데이터 소스에 메타 데이터 (빈 테이블 포함)를 원하지 않습니다.

최신 정보:

Michael Minella가 말했듯이 하나 이상의 콩을 추가해야합니다.

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
        super.setDataSource(dataSource);
    }

    @Bean
    public BatchDatabaseInitializer   batchDatabaseInitializer(@Qualifier("batchDataSource") DataSource dataSource, ResourceLoader resourceLoader){
        BatchDatabaseInitializer batchDatabaseInitializer = new     BatchDatabaseInitializer(dataSource, resourceLoader, new BatchProperties());
        return batchDatabaseInitializer;
    }
}

해결법

  1. ==============================

    1.스프링 부트 사용하기 BatchDataSourceInitializer가 사용하는 DataSource는 불행히도 BatchConfigurer와 관련이 없습니다. 컨텍스트에서 기본 DataSource를 가져옵니다. 자체 BatchDataSourceInitializer를 구성하면 부팅이 시작되지 않고 직접 사용할 DataSource를 정의 할 수 있습니다.

    스프링 부트 사용하기 BatchDataSourceInitializer가 사용하는 DataSource는 불행히도 BatchConfigurer와 관련이 없습니다. 컨텍스트에서 기본 DataSource를 가져옵니다. 자체 BatchDataSourceInitializer를 구성하면 부팅이 시작되지 않고 직접 사용할 DataSource를 정의 할 수 있습니다.

  2. from https://stackoverflow.com/questions/43655213/spring-batch-doesnt-use-custom-datasource-to-create-tables by cc-by-sa and MIT license