배치 Runner 예제

개요

배치 수행에 사용되는 EgovBatchRunner의 사용법을 보여주는 예제이다. 비동기 방식으로 실행하는 Job의 시작, 정지, 재시작 방법을 보여준다.

설명

설정

EgovBatchRunner 설정

EgovBatchRunner의 설정 방법은 배치 Runner를 참고한다.

Launcher 설정

배치 Runner 예제의 Job 설정 파일인 batchRunnerTest.xml을 확인한다.

본 예제에서는 비동기 방식으로 Job을 수행한다. 이를 위해 JobLauncher의 TaskExecutor에 SimpleAsyncTaskExecutor 클래스를 지정한다.

<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>

Job 설정

배치 Runner 예제의 Job 설정 파일인 batchRunnerTest.xml을 확인한다.

✔ Job 재시작시, Job 시작에 사용되었던 JobParameter를 사용하기 위해 JobParametersIncrementer를 이용한다.
✔ batchRunnerTestJob에서 JobParametersIncrementer 클래스를 사용하기 위해 simpleJob을 상속받는다. 이때 simpleJob은 restartable이 true로 설정된다.
✔ Step도 simpleStep을 상속받아서 구현한다.

<bean id="simpleJob" class="org.springframework.batch.core.job.SimpleJob" abstract="true">
	<property name="jobRepository" ref="jobRepository" />
	<property name="restartable" value="true" />
</bean>
 
<bean id="simpleStep" class="org.springframework.batch.core.step.item.FaultTolerantStepFactoryBean" abstract="true">
	<property name="transactionManager" ref="transactionManager" />
	<property name="jobRepository" ref="jobRepository" />
</bean>
 
<bean id="batchRunnerTestJob" parent="simpleJob">
	<property name="jobParametersIncrementer">
		<bean class="org.springframework.batch.core.launch.support.RunIdIncrementer" />	
	</property>
	<property name="steps">
		<bean id="infiniteStep" parent="simpleStep">
			<property name="itemReader">
				<bean id="reader" class="egovframework.brte.sample.common.domain.trade.GeneratingTradeItemReader">
					<property name="limit" value="1000000" />
				</bean>
			</property>
			<property name="itemWriter">
				<bean id="writer" class="egovframework.brte.sample.example.support.EgovDummyItemWriter" />
			</property>
		</bean>
	</property>
</bean>

JunitTest 구성 및 수행

JunitTest 구성

배치 Runner 설정과 관련 클래스들로 Junit Test를 수행한다. 이 때 배치가 수행되고, 관련된 내용을 확인할 수 있다.

배치 실행 순서는 아래와 같다.

  1. EgovBatchRunner의 start() 메소드에 Job의 이름, JobParameter를 전달하여 batchRunnerTestJob을 시작하고, executionId를 얻어온다.
  2. executionId를 이용하여 실행 중인 Job의 이름, JobParameter가 일치하는지 확인한다.
  3. stopAndCheckStatus()를 이용하여 실행 중인 Job을 정지한다.
  4. EgovBatchRunner의 restart() 메소드에 처음 시작했던 Job의 executionId를 전달하여 batchRunnerTestJob을 재시작 한다.
  5. 다시 한 번 stopAndCheckStatus()를 이용하여 실행 중인 Job을 정지한다.
	@Test
	public void testStartStopResumeJob() throws Exception {
 
		String jobName = "batchRunnerTestJob";
		String jobParameters = egovBatchRunner.createUniqueJobParameters();
 
		long executionId = egovBatchRunner.start(jobName, jobParameters);
 
		assertEquals(jobName, egovBatchRunner.getJobInstance(executionId).getJobName());
		assertEquals(jobParameters.toString(), egovBatchRunner.getJobOperator().getParameters(executionId));
		stopAndCheckStatus(executionId);
 
		long resumedExecutionId = egovBatchRunner.restart(executionId);
		assertEquals(jobParameters.toString(), egovBatchRunner.getJobOperator().getParameters(resumedExecutionId));
		stopAndCheckStatus(resumedExecutionId);
 
	}

stopAndCheckStatus() 메소드는 Job 실행 정보를 확인하고 실행 중인 Job을 정지하는 역할을 한다.

  1. 비동기 실행 중인 Job이 시작 상태로 들어갔는지 보장하기 위해, Thread.sleep()을 이용하여 1초간 대기한다.
  2. 실행 정보를 확인하고, EgovBatchRunner의 stop() 메소드를 이용하여 실행 중인 Job을 정지한다.
  3. 실행 중인 Job의 excutionId가 존재하는지 확인하고 0.1초간 대기한다.
  4. 대기 후, 해당 Job의 Summary를 출력하고, BatchStatus가 Stopped 인지 확인한다.
	private void stopAndCheckStatus(long executionId) throws Exception {
		String jobName = egovBatchRunner.getJobInstance(executionId).getJobName();
 
		// wait to the job to get up and running	
		Thread.sleep(1000);
 
		Set<Long> runningExecutions = egovBatchRunner.getJobOperator().getRunningExecutions(jobName);
		assertTrue("Wrong executions: " + runningExecutions + " expected: " + executionId, runningExecutions
				.contains(executionId));
		assertTrue("Wrong summary: " + egovBatchRunner.getJobOperator().getSummary(executionId), 
				egovBatchRunner.getJobOperator().getSummary(executionId).contains(BatchStatus.STARTED.toString()));
 
		egovBatchRunner.getJobOperator().stop(executionId);
 
		int count = 0;
		while (egovBatchRunner.getJobOperator().getRunningExecutions(jobName).contains(executionId) && count <= 10) {
			logger.info("Checking for running JobExecution: count=" + count);
			Thread.sleep(100);
			count++;
		}
 
		runningExecutions = egovBatchRunner.getJobOperator().getRunningExecutions(jobName);
		assertFalse("Wrong executions: " + runningExecutions + " expected: " + executionId, runningExecutions
				.contains(executionId));
		assertTrue("Wrong summary: " + egovBatchRunner.getJobOperator().getSummary(executionId), 
				egovBatchRunner.getJobOperator().getSummary(executionId).contains(BatchStatus.STOPPED.toString()));
 
		// there is just a single step in the test job
		Map<Long, String> summaries = egovBatchRunner.getJobOperator().getStepExecutionSummaries(executionId);
		System.err.println(summaries);
		assertTrue(summaries.values().toString().contains(BatchStatus.STOPPED.toString()));
	}

JunitTest 수행

수행방법은 JunitTest 실행을 참고한다.

결과확인

Console 창에서 Job Summary내용 중, BatchStatus가 Stopped 임을 확인한다.

참고자료

 
egovframework/rte2/brte/batch_example/batch_runner.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki