욱'S 노트

Spring Batch - 작업실행 본문

Programming/Spring Batch

Spring Batch - 작업실행

devsun 2015. 1. 22. 15:02

JobLauncher 정의하기


JobLauncher의 가장 기본적인 구현체는 SimpleJobLauncher이다. 실행을 획득하기 위해 JobRepository에만 의존성을 가진다.

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


JobExecution을 획득하면 Job의 execute 메소드로 전달된다.



이러한 과정은 스케쥴러로부터 구동되어 잘 수행되었을 경우이다. 하지만 Http 요청으로부터 작업이 구동될 경우에는 SimpleJobLauncher는 비동기로 작업을 수행하고 결과는 요청 즉시 클라이언트로 전달할 필요가 있다. 배치와 같은 많은 시간 수행되는 처리동안 HTTP 요청을 유지하는 것은 좋은 방식이 아니기 때문이다.




이러한 경우에 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>


Running a Job


최소한 배치 작업을 구동하기 위해서는 두 가지가 필요하다. 구동될 작업과 JobLauncher이다. 둘다 같은 context에 포함 될수도 있고 다른 context에 포함 될수도 있다.

만약 커맨드라인으로부터 작업이 구동된다면 각 작업은 새로운 JVM에서 초기화될 것이다. 그러나 web container에서 만약 구동을 한다면 일반적으로 하나의 JobLauncher가 있을 것이며 작업을 비동기로 구동하게 될 것이다.


Running Jobs from the Command Line


엔터프라이즈 스케쥴러로부터 작업을 수행시키기를 원하는 유저들은 커맨드 라인이 주요한 인터페이스이다.

대부분의 스케쥴러들이 OS의 쉘 스크립트를 수행하여 작업을 수행하기 때문이다.

또한 shell script, Perl, Ruby 혹은 maven, ant와 같은 빌드툴에서도 자바 프로세스를 구동하는 방법을 제공한다.

이러한 이유에서 Spring Batch에서는 CommandLineJobRunner을 제공한다.

다음은 CommandLineJobRunner의 주요기능이다.


- 적절한 ApplicationContext 로딩

- 커맨드 라인 arguments를 파싱하여 JobParameters로 변환

- Arguments에 지정한 적절한 작업 수행

- 작업 수행을 위해 ApplicationContext에서 제공한 적절한 JobLauncher 사용


커맨드라인에서 작업을 수행하기 위해서 다음과 같은 arguments를 전달해야 한다. 첫번째는 작업이 정의된 xml의 jobPath이며 두번째는 jobName이다. 이후의 모든 arguments는 JobParameters로 고려되며 'name=value' 포맷이다.


bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay schedule.date(date)=2007/05/05


커맨드라인으로 부터 작업이 구동되면 엔터프라이즈 스케쥴러는 종종 ExitCodes를 이용한다. 대부분의 스케쥴러들은 프로세스 레벨에서만 동작한다. 이 의미는 그들이 실행한 쉘스크립트의 시스템 프로세스만 알고 있다는 것이다. 이러한 시나리오에서 작업의 성공 및 실패 여부를 전달할 수 있는 유일한 방법이 코드를 리턴하는 것이다. 리턴 코드는 숫자이며 스케쥴러는 프로세스로 부터 그 숫자를 전달받고, 실행의 결과를 인지한다. 가장 단순한 케이스는 0은 성공이며 1은 실패이다. 그러나 좀 더 복잡한 케이스를 위해 ExitCodeMapper 인터페이스가 제공된다. 기본적으로 SimpleJVMExitCodeMapper를 제공한다.


Running Jobs from within a Web Container


사적으로 배치 작업은 커맨드 라인으로 오프라인 프로세싱으로 처리되어 왔다. 하지만 많은 경우에서는 HttpRequest에 의해 구동되는 것이 좋은 옵션이 될 수도 있다. 그러한 사례는 리포팅, 애드훅 작업 수행, 웹 어플리케이션 지원 들이다. 배치 작업은 롱텀이기 떄문에 이러한 경우 작업은 비동기로 수행되게 된다. 아래는 스프링 MVC와 결합해 작업을 수행한 예이다.




@Controller
public class JobLauncherController {
@Autowired
private Job job;

@Autowired
private JobLauncher jobLauncher;

@RequestMapping("/launchJob")
public void handle() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
jobLauncher.run(job, new JobParameters());
}
}





'Programming > Spring Batch' 카테고리의 다른 글

Spring Batch - Step 정의  (0) 2015.01.23
Spring Batch - 메타데이터 이용  (0) 2015.01.22
Spring Batch - JobRepository 구성하기  (0) 2015.01.22
Spring Batch - 작업정의  (1) 2015.01.22
Spring Batch - 도메인  (0) 2015.01.21
Comments