복붙노트

[SPRING] 스프링 배치 단계 범위 작업 방법

SPRING

스프링 배치 단계 범위 작업 방법

나는 파일의 이름을 얻는 나머지 호출을 기반으로 파일을 처리해야하는 요구 사항이 있으며, 작업 매개 변수에 추가하고 빈을 만드는 동안 사용합니다.

단계 범위 Beans (reader, writer)를 만들고 작업 매개 변수를 사용하고 있습니다. 새 스레드에서 작업을 시작합니다. 작업을 시작하기 위해 asynchronus task exceutor를 사용하고 있으며, 제 질문은 bean이 봄에 어떻게 만들어 지는지입니다. @StepScope을 정의 할 때

jobParametersBuilder.addString("fileName", request.getFileName());
jobExecution = jobLauncher.run(job, jobParametersBuilder.toJobParameters());
@Bean
public JobLauncher jobLauncher() {
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository());
    jobLauncher.setTaskExecutor(asyncTaskExecutor());
    return jobLauncher;
}

@Bean
@StepScope
public ItemWriter<Object> writer(@Value ("#{jobParameters['fileName']}"String    fileName) {
    JdbcBatchItemWriter<Object> writer = new JdbcBatchItemWriter<>();
    writer.setItemSqlParameterSourceProvider(
        new BeanPropertyItemSqlParameterSourceProvider<Object>());
    writer.setSql(queryCollection.getquery());
    writer.setDataSource(dataSource(fileName));
    return writer;
}

해결법

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

    1.스프링 배치 StepScope 객체는 싱글 톤이 아닌 특정 단계에만 고유 한 객체입니다. 아시다시피, Spring의 기본 빈 범위는 싱글 톤입니다. 그러나 StepScope 인 Spring Batch 구성 요소를 지정하면 Spring Batch가 스프링 컨테이너를 사용하여 각 단계 실행을 위해 해당 구성 요소의 새 인스턴스를 인스턴스화합니다.

    스프링 배치 StepScope 객체는 싱글 톤이 아닌 특정 단계에만 고유 한 객체입니다. 아시다시피, Spring의 기본 빈 범위는 싱글 톤입니다. 그러나 StepScope 인 Spring Batch 구성 요소를 지정하면 Spring Batch가 스프링 컨테이너를 사용하여 각 단계 실행을 위해 해당 구성 요소의 새 인스턴스를 인스턴스화합니다.

    이것은 매개 변수가 StepContext 또는 JobExecutionContext 레벨에서 지정 될 수 있고 매개 변수 요구 사항을 사용한 예제와 마찬가지로 자리 표시자를 대체해야하는 매개 변수 런타임 바인딩에 종종 유용합니다.

    StepScope를 사용하는 또 다른 유용한 이유는 동일한 구성 요소를 병렬 단계로 재사용하기로 결정한 경우입니다. 구성 요소가 내부 상태를 관리하는 경우, 한 스레드가 다른 스레드가 관리하는 상태를 손상시키지 않도록 (예 : 주어진 단계의 각 스레드가 자체적으로 StepScope 구성 요소 인스턴스를 가짐) StepScope 기반이어야합니다.

  2. from https://stackoverflow.com/questions/38780796/how-does-spring-batch-step-scope-work by cc-by-sa and MIT license