복붙노트

[SPRING] Spring 배치 - 여러 작업을 병렬로 실행

SPRING

Spring 배치 - 여러 작업을 병렬로 실행

나는 Spring 배치가 처음인데 어떻게해야 할지를 알 수 없었다.

기본적으로 나는 특정 디렉토리에서 어떤 이름 (예 : A.txt 및 B.txt)을 가진 파일을 찾기 위해 매 N 분마다 실행하는 스프링 파일 폴러를 가지고있다. 어느 순간이 디렉토리에는 최대 2 개의 파일 (A와 B)이있을 수 있습니다. Spring Batch Job을 통해이 두 파일이 처리되어 2 개의 다른 DB 테이블에 저장됩니다.

이 파일들은 다소 유사하므로 동일한 프로세서 / 라이터가 사용됩니다.

지금 내가 설정 한 방식으로 모든 폴링주기 1 파일이 선택되고 작업이 실행됩니다.

디렉터리에 두 개의 파일 (A.txt 및 B.txt)이 있다고 가정 해 봅시다. 두 작업을 동시에 실행할 수 있도록 2 개의 작업을 만드는 방법이 있습니까?

해결법

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

    1.나는 네가 할 수 있다고 믿는다. 스프링 배치 (나처럼)에 익숙하지 않으므로 아직 배치하지 않았다면 일괄 처리의 도메인 언어를 사용하는 것이 좋습니다.

    나는 네가 할 수 있다고 믿는다. 스프링 배치 (나처럼)에 익숙하지 않으므로 아직 배치하지 않았다면 일괄 처리의 도메인 언어를 사용하는 것이 좋습니다.

    그런 다음 비동기 JobLauncher를 구성하여 시작할 수 있습니다. 예 :

      @Bean
      public JobLauncher jobLauncher() throws Exception
      {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    
        jobLauncher.setJobRepository(jobRepository);
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        jobLauncher.afterPropertiesSet();
    
        return jobLauncher;
      }
    

    SimpleAsyncTaskExecutor에 특별한주의를 기울이십시오 (작업 repo는 autowired 일 수 있습니다). 이 구성은 다음 시각화 된 비동기 실행을 허용합니다.

    동기 실행 흐름과 비교하십시오.

    어쩌면 SimpleJobLauncher java 문서를 인용하는 데 도움이 될 것입니다.

    자세한 내용 및 구성 옵션 - 여기.

    마지막에는 다른 이름으로 작업을 작성하거나 다른 매개 변수 세트로 시작하십시오. 순수한 예는 다음과 같습니다.

      @Autowired
      public JobBuilderFactory jobBuilderFactory;
    
      public Job createJobA() {
        return jobBuilderFactory.get("A.txt")
                                .incrementer(new RunIdIncrementer())
                                .flow(step1())
                                .next(step2())
                                .end()
                                .build();
      }
    
      public Job createJobB() {
        return jobBuilderFactory.get("B.txt")
                                .incrementer(new RunIdIncrementer())
                                .flow(step1())
                                .next(step2())
                                .end()
                                .build();
      }
    

    비동기 작업 실행 프로그램을 사용하여 이러한 작업을 실행하면 두 개의 작업 인스턴스가 작성되어 병렬로 실행됩니다. 이것은 단지 하나의 옵션으로 귀하의 상황에 적합하거나 그렇지 않을 수도 있습니다.

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

    2.Spring을 사용하여 비동기 모드에서 작업을 실행하기위한 아주 좋은 접근 방법이 있습니다. JobLauncher가 어떻게 구성되어 있는지에 관한 문제 일뿐입니다. JobLauncher에는 taskExecutor 속성이 있으며 해당 속성에 할당 된 구현에 따라 비동기 실행을 활성화 할 수 있습니다.

    Spring을 사용하여 비동기 모드에서 작업을 실행하기위한 아주 좋은 접근 방법이 있습니다. JobLauncher가 어떻게 구성되어 있는지에 관한 문제 일뿐입니다. JobLauncher에는 taskExecutor 속성이 있으며 해당 속성에 할당 된 구현에 따라 비동기 실행을 활성화 할 수 있습니다.

    Spring이 제공 할 수있는 모든 TaskExecutor 유형을 찾을 수 있으며 필요에 따라 일괄 비동기 작업을 수행하는 최상의 방법을 선택합니다. Spring의 작업 실행자 유형

    예를 들어, SimpleAsyncTaskExecutor는 호출시 새 스레드를 작성하고 실행 빈도가 높으면 성능 문제점을 생성 할 수있는 태스크 실행 프로그램입니다. 반면에 리소스를 재사용하고 시스템의 효율성을 극대화하기 위해 풀링 기능을 제공하는 TaskExecutors 유형도 있습니다.

    다음은 ThreadPoolTaskExecutor를 구성하는 방법의 작은 예입니다.

    A) ThreadPoolTaskExecutor Bean 설정하기

    @Bean
        public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(15);
        taskExecutor.setMaxPoolSize(20);
        taskExecutor.setQueueCapacity(30);
        return taskExecutor;
    }
    

    B) JobLauncher Bean 구성

       @Bean
        public JobLauncher jobLauncher(ThreadPoolTaskExecutor taskExecutor, JobRepository jobRepository){
            SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
            jobLauncher.setTaskExecutor(taskExecutor);
            jobLauncher.setJobRepository(jobRepository);
            return jobLauncher;
        }
    

    C) JobLauncher 및 작업 구성 삽입

    @Autowired
    private JobLauncher jobLauncher;
    
    @Autowired
    @Qualifier("job1-file-A")
    private Job job1;
    
    @Autowired
    @Qualifier("job2-file-B")
    private Job job2;
    

    D) 작업 예약

    @Scheduled(cron = "*/1 * * * * *")
    public void run1(){
        Map<String, JobParameter> confMap = new HashMap<>();
        confMap.put("time", new JobParameter(System.currentTimeMillis()));
        JobParameters jobParameters = new JobParameters(confMap);
        try {
            jobLauncher.run(job1, jobParameters);
        }catch (Exception ex){
            logger.error(ex.getMessage());
        }
    
    }
    
    @Scheduled(cron = "*/1 * * * * *")
    public void run2(){
        Map<String, JobParameter> confMap = new HashMap<>();
        confMap.put("time", new JobParameter(System.currentTimeMillis()));
        JobParameters jobParameters = new JobParameters(confMap);
        try {
            jobLauncher.run(job2, jobParameters);
        }catch (Exception ex){
            logger.error(ex.getMessage());
        }
    
    }
    

    E) 마지막으로 SpringBoot 클래스 @EnableBatchProcessing 및 @EnableScheduling에서

    @EnableBatchProcessing
    @EnableScheduling
    @SpringBootApplication
    public class MyBatchApp {
    
  3. from https://stackoverflow.com/questions/45718888/spring-batch-running-multiple-jobs-in-parallel by cc-by-sa and MIT license