복붙노트

[SPRING] 단계별 스프링 배치 흐름 / 분할

SPRING

단계별 스프링 배치 흐름 / 분할

다음 프로세스가 포함 된 스프링 배치 솔루션을 구축 중입니다.

1 단계 : 목록을 여러 목록으로 나눕니다.  2 단계 : 각 하위 목록 처리  3 단계 : 하위 목록 병합

생성 된 하위 목록은 병렬로 처리 할 수 ​​있으며 스프링 배치 문서에 따라 지원됩니다. 슬프게도 나는 순차적으로 시작하는 예제가 아니라 병렬 단계로 시작하는 스프링 배치 예제 작업 만 찾을 수 있습니다.

다음 작업은 컴파일되지 않습니다. Spring이 나에게 오류를 준다 : 'step2를 해결할 수 없다'

<batch:job id="webServiceJob2">
    <batch:step id="step1" next="step2"></batch:step>
    <batch:split id="step2" next="step3"></batch:split>
    <batch:step id="step3"></batch:step>
</batch:job>

그렇다면 먼저 여러 단계를 병렬로 실행 한 다음 마지막 단계를 실행하는 것보다 먼저 단일 단계를 실행하도록 작업을 구성 할 수 있습니까?

해결법

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

    1.나는이 질문에 비틀 거려서 분할이 어떻게 작동하는지에 관해 물어 보았다. 그리고 아마이 대답은 조금 늦게 도착한다. 그러나 여기에 나는 간다.

    나는이 질문에 비틀 거려서 분할이 어떻게 작동하는지에 관해 물어 보았다. 그리고 아마이 대답은 조금 늦게 도착한다. 그러나 여기에 나는 간다.

    "분할"문제는 그 자체로 단계가 아니지만 그 이름을 그대로 (참조하는) 것이 었습니다.

    <batch:job id="webServiceJob2">
        <batch:step id="step1" next="step2"></batch:step>
        <batch:split id="step2" next="step3"></batch:split> <!-- This is not a step -->
        <batch:step id="step3"></batch:step>
    </batch:job>
    

    올바른 구문은 다음과 같습니다.

    <batch:job id="webServiceJob2">
        <batch:step id="step1" next="step2"></batch:step>
        <batch:split id="split_step2" next="step3">
            <flow> 
                 <step id="step2_A_1" ... next="step2_A_2"/>
                 <step id="step2_A_2" ... />
            </flow>
            <flow> 
                 <step id="step2_B_1" ... />
            </flow>
        </batch:split>
        <batch:step id="step3"></batch:step>
    </batch:job>
    

    하지만 이것은 당신이 달성하기를 원하지 않습니다. 왜냐하면 split 선언에 의해 실행될 병렬 단계의 정확한 수를 컴파일 시간에 설정해야하고, split의 목적은 각 흐름에서 여러 단계를 동일하게 호출하기 때문입니다 하나.

    Scaling 및 Parallel 프로세스에 대한 문서를 확인해야합니다. 파티션 단계는 요구 사항에 적합한 후보입니다.

  2. ==============================

    2.병렬 단계는 각 하위 목록마다 다른 단계를 나타낼 것입니다. 나는 원하는대로 생각하지 않습니다. 단일 멀티 스레드 단계가 더 적합합니다. 문서화 된 것처럼 TaskExecutor 빈을 정의하여 시작한다. TaskExecutor 빈은 별도의 스레드에서 각 청크를 처리한다. TaskExecutors는 사용하기가 매우 쉽기 때문에 스스로 TaskExecutor를 호출 할 수도 있습니다. 이 경우 Spring Batch가 알 필요가없는 단계에서 멀티 스레딩이 가능합니다.

    병렬 단계는 각 하위 목록마다 다른 단계를 나타낼 것입니다. 나는 원하는대로 생각하지 않습니다. 단일 멀티 스레드 단계가 더 적합합니다. 문서화 된 것처럼 TaskExecutor 빈을 정의하여 시작한다. TaskExecutor 빈은 별도의 스레드에서 각 청크를 처리한다. TaskExecutors는 사용하기가 매우 쉽기 때문에 스스로 TaskExecutor를 호출 할 수도 있습니다. 이 경우 Spring Batch가 알 필요가없는 단계에서 멀티 스레딩이 가능합니다.

  3. ==============================

    3.물론 직업의 한가운데서 쪼개 질 수 있습니다! Spring Batch In Action (2012)의 예제입니다.

    물론 직업의 한가운데서 쪼개 질 수 있습니다! Spring Batch In Action (2012)의 예제입니다.

    <batch:job id="importProductsJob">
      <batch:step id="decompress" next="readWrite">
        <batch:tasklet ref="decompressTasklet"/>
      </batch:step>
      <batch:split id="readWrite" next="moveProcessedFiles">
        <batch:flow>
          <batch:step id="readWriteBookProduct"/>
        </batch:flow>
        <batch:flow>
          <batch:step id="readWriteMobileProduct"/>
        </batch:flow>
      </batch:split>
      <batch:step id="moveProcessedFiles">
        <batch:tasklet ref="moveProcessedFilesTasklet" />
      </batch:step>
    </batch:job>
    
  4. from https://stackoverflow.com/questions/20269091/spring-batch-flow-split-after-a-step by cc-by-sa and MIT license