욱'S 노트

Spring Batch - 작업정의 본문

Programming/Spring Batch

Spring Batch - 작업정의

devsun 2015. 1. 22. 13:12





Job은 step의 단순한 컨테이너처럼 보이는 반면에 개발자들이 반드시 알아야 할 많은 옵션들이 있다.

또한 작업을 어떻게 실행되는지 실행시 메타데이터가 어떻게 저장되는지에 대한 고려도 필요하다.

이번에는 job에 관련된 다양한 옵션과 실행시 고려사항에 대해서 설명한다.


작업 정의하기


Job 인터페이스에는 다양한 구현체들이 존재한다. 그러나 네임스페이스 추상화를 통해 정의의 차이점을 없애준다.

작업을 정의하기 위해서 단 세가지의 필수 요소(이름, jobRepository, step들)만이 필요하다.

다음 예제는 parent 정의를 사용하여 step들을 생성하기 위한 예제이다.

job-repository는 필수요소이지만, 암묵적으로 명시하지 않으면 jobReposity라는 id를 가진 빈을 참조한다.


<batch:job id="footballJob" job-repository="jobRepository">
<batch:step id="playerload" parent="s1" next="gameLoad"/>
<batch:step id="gameLoad" parent="s2" next="playerSummarization"/>
<batch:step id="playerSummarization" parent="s3"/>
</batch:job>


Restartablility

Restartablibilty에서 하나의 이슈는 배치 작업이 재시작이 되었을 때가 고려되어 있는지이다.  만약에 jobInstance에 대한 jobExecution이 이미 존재를 한다면 작업은 구동될 때 재시작을 고려한다. 이상적으로는 모든 작업은 재시작 될 수 있어야 하지만, 모든 시나리오에서 가능한 것은 아니다. 이러한 경우에서는 jobInstance가 새로 생성된다는 보는게 일반적일 것이다. 스프링 배치에서는 작업이 재시작 처리를 할 수 있도록 몇가지 도움을 준다. 그러나 만약 작업이 절대로 재시작 되어서는 안되고, 새로운 jobInstance가 생성되어야 한다면, restartable 속성을 false로 세팅하여야 한다.

<batch:job id="footballJob" job-repository="jobRepository" restartable="false">

Intecepting Job Exectuion


작업이 실행되는 과정에 있어서 라이프사이클에 대한 이벤트를 통지받을 수 있다면 매우 유용한다.

SimpleJob은 적절한 시점에 jobListener을 호출하여 이러한 작업을 가능하게 한다.


/*
* Copyright 2006-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core;

/**
* Provide callbacks at specific points in the lifecycle of a {@link Job}.
* Implementations can be stateful if they are careful to either ensure thread
* safety, or to use one instance of a listener per job, assuming that job
* instances themselves are not used by more than one thread.
*
* @author Dave Syer
*
*/
public interface JobExecutionListener {

/**
* Callback before a job executes.
*
* @param jobExecution the current {@link JobExecution}
*/
void beforeJob(JobExecution jobExecution);

/**
* Callback after completion of a job. Called after both both successful and
* failed executions. To perform logic on a particular status, use
* "if (jobExecution.getStatus() == BatchStatus.X)".
*
* @param jobExecution the current {@link JobExecution}
*/
void afterJob(JobExecution jobExecution);

}

<batch:job id="footballJob" job-repository="jobRepository" restartable="false">
<batch:step id="playerload" parent="s1" next="gameLoad"/>
<batch:step id="gameLoad" parent="s2" next="playerSummarization"/>
<batch:step id="playerSummarization" parent="s3"/>
<batch:listeners>
<batch:listener ref="sampleListener"/>
</batch:listeners>
</batch:job>


Inheriting from a Parent Job


작업의 그룹에서 비슷하게 공유할 수 있는 설정이 있다면 작업 정의에 대한 설정을 상속받아 사용할 수 있다.

상속받는 방식은 일반적인 스프링에서의 설정 상속과 동일하다.


<batch:job id="baseJob" abstract="true">
<batch:listeners>
<batch:listener ref="listenerOne"/>
</batch:listeners>
</batch:job>

<batch:job id="job1" parent="baseJob">
<step id="step1" parent="standaloneStep"/>
<batch:listeners merge="true">
<batch:listener ref="listenerTwo"/>
</batch:listeners>
</batch:job>


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

Spring Batch - 작업실행  (0) 2015.01.22
Spring Batch - JobRepository 구성하기  (0) 2015.01.22
Spring Batch - 도메인  (0) 2015.01.21
Spring Batch - 소개  (0) 2015.01.16
Spring Batch - 시작하기  (0) 2015.01.16
Comments