인프런 커뮤니티 질문&답변

1hany number님의 프로필 이미지

작성한 질문수

스프링 배치

@JobScope / @StepScope - 기본개념 및 설정

flow 위에 jobparameters를 사용하기 위해서는 어떤 scope를 정의해줘야 하나요?

23.05.07 05:40 작성

·

587

0

안녕하세요, 강사님!

job > flow > step으로 구성되어 있는데 flow위에 jobparameters를 사용하기 위해서는 어떤 scope를 정의해줘야 하나요? step scope is not active라고 자꾸 오류가 나네요.

강의를 봐도 잘 이해가 안 가서요. 아직 제가 개념이 덜 잡혔나봅니다. ㅠㅠ

답변 감사드립니다!

 

코드입니다!

@Slf4j
@Getter
@NoArgsConstructor
public class CreateDateJobParameter {

  private String startDate;
  private String endDate;

  @Value("#{jobParameters[startDate]}")
  public void setStartDate(String startDate) {
    this.startDate = startDate;
  }

  @Value("#{jobParameters[endDate]}")
  public void setEndDate(String endDate) {
    this.endDate = endDate;
  }
}

 

@Slf4j
@RequiredArgsConstructor
@Configuration
public class OrderProcessingJobConfiguration {

  private final JobBuilderFactory jobBuilderFactory;
  private final StepBuilderFactory stepBuilderFactory;
  private final CreateDateJobParameter jobParameterCreator;

  @JobScope
  @Bean
  public CreateDateJobParameter jobParameterCreator() {
    return new CreateDateJobParameter();
  }


  @Bean
  public Job orderProcessingJob() {
    return jobBuilderFactory.get("orderProcessingJob")
        .incrementer(new UniqueRunIdIncrementer())
        .start(fetchOrderDataFlow())
        .next(getOrderListFlow())
        .split(taskExecutor())
        .add()
        .end()
        .build();
  }

  @Bean
  @StepScope
  public Flow fetchOrderDataFlow() {
    log.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>fetchOrderDataFlow");
    Flow flow1 = new FlowBuilder<Flow>("flow1")
        .start(fetchOrderDataStep1())
        .build();
    Flow flow2 = new FlowBuilder<Flow>("flow2")
        .start(fetchOrderDataStep2())
        .build();
    Flow flow3 = new FlowBuilder<Flow>("flow3")
        .start(fetchOrderDataStep3())
        .build();
    Flow flow4 = new FlowBuilder<Flow>("flow4")
        .start(fetchOrderDataStep4())
        .build();
    Flow flow5 = new FlowBuilder<Flow>("flow5")
        .start(fetchOrderDataStep5())
        .build();

    FlowBuilder<SimpleFlow> flowBuilder = new FlowBuilder<>("fetchOrderDataFlow");
    flowBuilder.split(taskExecutor())
        .add(flow1, flow2, flow3, flow4, flow5);
    return flowBuilder.build();
  }

  @Bean
  public Step fetchOrderDataStep1() {
    return createFetchOrderDataStep("fetchOrderDataStep1", "store1", jobParameterCreator.getStartDate(), jobParameterCreator.getEndDate());
  }
...
}

답변 1

0

정수원님의 프로필 이미지
정수원
지식공유자

2023. 05. 09. 23:40

강의를 좀 더 찬찬히 들어보시길 권해 드립니다

@Jobscope 는 Step을 선언하는 빈에 설정하는 것이고 @Stepscope 는 Tasklet 이나 Chunk 단위에 설정하는 개념입니다

CreateDateJobParameter 는Step 이 아니기 때문에 @JobScope를 선언하거나 Flow 에 @StepScope 를 선언해서는 안됩니다

전반적인 내용을 조금 더 자세히 들으시면 크게 어려운 개념이 아니라서 이해가 되시리라 생각합니다

강의 내용중에 이해가 안되는 부분이 있으면 질의해 주세요