배치 수행 시, 데이터를 처리하는 과정에서 실패한 데이터처리를 재시도하는 과정을 보여주는 예제이다. EgovRetrySampleFunctionalTests 예제는 ItemProcessing, ItemWriting 에서 발생한 예외상황에 대해 정해진 설정대로 Retry를 수행하는 과정을 보여준다. 설정된 retry-limit 만큼 재시도를 허용함으로써 Job 전체의 실패를 줄일 수 있다.
Job 의 구성을 보면 Chunk 설정에 아래와 같은 설정이 있다.
<include> : retry 해야하는 Exception 지정 <exlclude> : include로 지정한 exception의 하위 exception 중, retry 하지 않을 Exception 지정
<job id="retrySample" xmlns="http://www.springframework.org/schema/batch"> <step id="step1"> <tasklet> <chunk reader="itemGenerator" writer="itemWriter" commit-interval="1" retry-limit="3"> <retryable-exception-classes> <include class="java.lang.Exception"/> </retryable-exception-classes> </chunk> </tasklet> </step> </job>
✔ JunitTest 클래스의 구조는 배치실행환경 예제 Junit Test 설명을 참고한다.
✔ assertEquals(itemGenerator.getLimit()+2, itemProcessor.getCounter()) : 두 번의 재시도가 일어나도록 설정되어 있으므로, 전체 Process 처리 수가 reader에서 읽힌 데이터 수보다 2가 커야한다.
@ContextConfiguration(locations = { "/egovframework/batch/simple-job-launcher-context.xml", "/egovframework/batch/job-runner-context.xml", "/egovframework/batch/jobs/retrySample.xml"}) public class EgovRetrySampleFunctionalTests { @Test public void testLaunchJob() throws Exception { jobLauncherTestUtils.launchJob(); //items processed = items read + 2 exceptions assertEquals(itemGenerator.getLimit()+2, itemProcessor.getCounter()); } }
수행방법은 JunitTest 실행을 참고한다.