[SPRING] Spring 배치 - 여러 작업을 병렬로 실행
SPRINGSpring 배치 - 여러 작업을 병렬로 실행
나는 Spring 배치가 처음인데 어떻게해야 할지를 알 수 없었다.
기본적으로 나는 특정 디렉토리에서 어떤 이름 (예 : A.txt 및 B.txt)을 가진 파일을 찾기 위해 매 N 분마다 실행하는 스프링 파일 폴러를 가지고있다. 어느 순간이 디렉토리에는 최대 2 개의 파일 (A와 B)이있을 수 있습니다. Spring Batch Job을 통해이 두 파일이 처리되어 2 개의 다른 DB 테이블에 저장됩니다.
이 파일들은 다소 유사하므로 동일한 프로세서 / 라이터가 사용됩니다.
지금 내가 설정 한 방식으로 모든 폴링주기 1 파일이 선택되고 작업이 실행됩니다.
디렉터리에 두 개의 파일 (A.txt 및 B.txt)이 있다고 가정 해 봅시다. 두 작업을 동시에 실행할 수 있도록 2 개의 작업을 만드는 방법이 있습니까?
해결법
-
==============================
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.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 {
from https://stackoverflow.com/questions/45718888/spring-batch-running-multiple-jobs-in-parallel by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Security 커스텀 인증 실패 핸들러가 매개 변수로 리디렉션 (0) | 2019.03.22 |
---|---|
[SPRING] PostGIS Geometry로 Hibernate 지속 실패 (0) | 2019.03.22 |
[SPRING] SimpleUrlHandlerMapping의 Java 구성 (스프링 부트) (0) | 2019.03.21 |
[SPRING] 스프링 MVC에서 RESTful 삭제를 처리하는 방법 (0) | 2019.03.21 |
[SPRING] context : property-placeholder가 참조를 해석하지 않습니다. (0) | 2019.03.21 |