복붙노트

[SPRING] 병렬 스프링 배치 작업의 수를 제어하는 ​​방법

SPRING

병렬 스프링 배치 작업의 수를 제어하는 ​​방법

신청서를 작성하는 보고서가 있습니다. 이러한 보고서의 준비가 무거 우므로 Spring Batch와 비동기 적으로 준비됩니다. 이러한 보고서에 대한 요청은 HTTP를 사용하는 REST 인터페이스를 통해 작성됩니다.

목표는 REST 리소스가 단순히 보고서 실행을 대기시키고 완료하는 것입니다 (문서에 설명 된대로). 따라서 TaskExecutor가 JobLauncher에 제공되었습니다.

    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
    </property>
</bean>

보고서가 실제로 중량이 있기 때문에 지정된 시간에 지정된 수만 생산할 수 있습니다. 한 번에 2 개의 인스턴스 만 생성하도록 Spring Batch를 구성 할 수 있도록 concurrencyLimit이 지정되었습니다.

    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor">
            <property name="concurrencyLimit" value="2" />
        </bean>
    </property>
</bean>

안타깝게도 2 개의 작업이 이미 실행 중이면 시작 작업 호출이 차단됩니다.     jobLauncher.run (job, builder.toJobParameters ());

분명히 jobLauncher는 즉시 작업을 실행하려고 시도합니다. 쓰레드가 사용 가능 해지 자마자 실행을위한 큐 작업을하는 것이 상상됩니다. 이렇게하면 동일한 작업 저장소 데이터베이스를 사용하여 추가 처리 인스턴스를 추가하는 것만으로 응용 프로그램을 확장 할 수 있습니다.

비슷한 질문이 여기에 제기되었습니다. Spring Batch Integration을 탐험하기 시작했는데 그것이 올바른 방향인지 확신 할 수 없습니다.

나의 유스 케이스는 나에게 드문 것 같지 않다. 내가 찾지 못한 것은 널리 논의 된 패턴이 없어야 하는가?

감사 에프

해결법

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

    1.SimpleAsyncTaskExecutor는 각 작업마다 새 스레드를 생성하므로 사용량이 많은 경우에는 사용하지 않는 것이 좋습니다. 또한 스레드 풀링 및 작업 대기열과 같은 강력한 개념을 지원하지 않습니다.

    SimpleAsyncTaskExecutor는 각 작업마다 새 스레드를 생성하므로 사용량이 많은 경우에는 사용하지 않는 것이 좋습니다. 또한 스레드 풀링 및 작업 대기열과 같은 강력한 개념을 지원하지 않습니다.

    ThreadPoolTaskExecutor를 살펴보면, 작업 대기열 처리 및 임의의 재사용되지 않은 스레드를 생성하는 대신 스레드 풀 사용과 같은보다 강력한 작업 실행 패러다임을 지원합니다.

    javadoc의 ThreadPoolTaskExecutor에 대한 자세한 내용은 다음을 참조하십시오. http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html

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

    2.그 덕분에 많은 감사드립니다. SimpleAsyncTaskExecutor를 대체 한 후 필요한 항목을 정확하게 보유하고 있습니다. 암호:

    그 덕분에 많은 감사드립니다. SimpleAsyncTaskExecutor를 대체 한 후 필요한 항목을 정확하게 보유하고 있습니다. 암호:

    @Bean
    public TaskExecutor jobLauncherTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(executorsPoolSize);
        executor.setCorePoolSize(executorsPoolSize);
        return executor;
    }
    

    감사 에프

  3. from https://stackoverflow.com/questions/30877797/how-to-control-the-number-of-parallel-spring-batch-jobs by cc-by-sa and MIT license