
SpringBatch는 기본적으로 Job을 동기적으로 실행시킨다.
만약, SpringBatch에서 비동기적으로 Job을 실행시키기 위해서는 어떤 작업이 필요할지 정리해보려고 한다.
SpringBatch에서 비동적으로 Job을 실행시키기 위해서는 TaskExecutor를 비동기적으로 실행시킬 수 있는 TaskExecutor로 변경해줘야한다.
그렇다면 SpringBatch는 어떤 TaskExecutor를 사용하고 있기에 동기적으로 Job을 실행시키는걸까?
SpringBatch에서 기본적으로 실행되는 클래스 구조부터 간단히 보려고 한다.
스프링부트는 SpringBootStarterBatch를 의존성으로 추가하면 DefaultBatchConfiguration에 의해서 SpringBatch에서 사용하는 스프링빈들이 등록된다.
JobLauncher : 기본적으로 TaskExecutorJobLauncher가 사용된다.
TaskExecutor : 기본적으로 SyncTaskExecutor가 사용되며, Job을 동기적으로 실행시켜 결과값을 얻는다. TaskExecutor는 JobLauncher에 아래와같이 설정된다.
@Bean
public JobLauncher jobLauncher() throws BatchConfigurationException {
TaskExecutorJobLauncher taskExecutorJobLauncher = new TaskExecutorJobLauncher();
taskExecutorJobLauncher.setJobRepository(jobRepository());
taskExecutorJobLauncher.setTaskExecutor(getTaskExecutor());
try {
taskExecutorJobLauncher.afterPropertiesSet();
return taskExecutorJobLauncher;
}
catch (Exception e) {
throw new BatchConfigurationException("Unable to configure the default job launcher", e);
}
}
이전에 작성했었던 TaskExecutor와 TaskScheduler 포스팅에서 TaskExecutor와 TaskScheduler에 대해서 공부했었다.
SpringBatch에서도 Job을 실행시키기 위해서 TaskExecutor를 사용한다.
위에서 보았지만 SpringBatch는 기본적으로 SyncTaskExecutor를 사용하기 때문에 모든 Job은 동기적으로 실행된다.
그런데, 동기적 실행과 비동기적 실행은 아래와 같이 2가지 경우로 나뉠 수 있다.
Job을 비동기로 실행시키려면 어떻게 해야할까?
우선 Job을 실행시키기 위해선 jobLauncher를 이용해서 실행시킨다.
다만, 기본적으로 jobLauncher는 SyncTaskExecutor를 사용하기 때문에 Job을 동기적으로 순차적으로 실행시키기게 된다.
여기에서 비동기적으로 Job을 실행시키려면 ThreadPoolTaskExecutor를 사용하도록 jobLauncher를 변경해주면 된다.
비동기적으로 Job을 실행시키지 않더라면 여러 Job을 동시에 실행 시킬 수는 있다.
동시에 JobLauncher가 여러개의 Job을 실행시켜주면된다.
JobLauncher는 run 이후 실행 과정이 동기적으로 수행되기 때문에 순차적으로 실행되므로 run 자체를 for문으로 여러번 수행하면 동시에 여러 Job을 시작시킬 수 있다.