N:1 Partition 예제

설명

설정

Job 설정

N:1 Partition 예제의 Job 설정 파일인 partitionFileToOneFileJob.xml을 확인한다.
  • partitioner : 입력리소스 수 만큼 Master Step을 파티셔닝하는 MultiResourcePartitioner
  • grid-size : 생성할 Context 수
  • writer : scope=“step” 설정 해지로 여러 Slave Step 들이 공유하는 EgovPartitionFlatFileItemWriter 사용(타겟파일이 하나이므로, 다른 파티셔닝과 달리 출력정보를 다루는 EgovOutputFileListener 설정이 필요 없음)


✔ 이 예제는 여러 Slave Step 들이 하나의 Writer를 공유하는 과정에서 Thread Safe 하도록 구성되어 있다.

<job id="partitionJob" restartable="true" xmlns="http://www.springframework.org/schema/batch">		
	<step id="step">
		<partition step="step1" partitioner="partitioner">
			<handler grid-size="4" task-executor="taskExecutor" />
		</partition>
	</step>
</job>
<bean id="partitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner">
	<property name="resources" value="classpath:egovframework/data/input/delimited*.csv" />
</bean>
<step id="step1" xmlns="http://www.springframework.org/schema/batch">
	<tasklet transaction-manager="transactionManager">
		<chunk writer="itemWriterPartition" reader="itemReader commit-interval="3" />
	</tasklet>
</step>
<bean id="itemReader" scope="step" autowire-candidate="false" parent="itemReaderParent">
	<property name="resource" value="#{stepExecutionContext[fileName]}" />
</bean>
<bean id="itemWriterPartition" class="egovframework.brte.sample.example.support.EgovPartitionFlatFileItemWriter">
	<property name="resource" value="file:./target/test-outputs/partition/file/delimitedOneFile.csv" />
	...
</bean>

클래스 설정

MultiResourcePartitioner

스프링에서 제공하는 MultiResourcePartitioner 를 사용하며 입력리소스의 수(입력파일 수)만큼 Context를 생성하고 출력위치를 셋팅하는 역할을 한다.(Context 생성으로 여러 Slave Step들을 사용할 수 있게 됨)
✔ 이 예제에서 는 File 파티셔닝 예제에서 사용하는 MultiResourcePartitioner와 동일하므로 해당부분을 참고한다.

EgovPartitionFlatFileItemWriter

EgovPartitionFlatFileItemWriter는 file 파티셔닝에서 Slave Step들이 하나의 Writer를 공유해 하나의 타겟파일에 데이터를 Write 하도록 구성했다.
✔ scope = “step” 설정 해제 : 여러 Slave Step에서 하나의 EgovPartitionFlatFileItemWriter만 생기기 위함

JunitTest 구성 및 수행

JunitTest 구성

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

✔ JunitTest 클래스의 구조는 배치실행환경 예제 Junit Test 설명을 참고한다.
✔ assertEquals(“COMPLETED”, jobExecution.getExitStatus().getExitCode()) : 배치수행결과가 COMPLETED 인지 확인한다.
✔ 데이터처리 결과를 확인하기 위해, 배치수행과 개별적으로 여러 입력파일의 데이터 합과 단일 출력파일의 데이터 합을 비교하여 정상수행여부를 판단한다.

@Test
public void testUpdateCredit() throws Exception {
	...
	open(inputReader);
	List<CustomerCredit> inputs = new ArrayList<CustomerCredit>(getCredits(inputReader));
	close(inputReader);
 
	JobExecution jobExecution = jobLauncherTestUtils.launchJob();
	assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
 
	@SuppressWarnings("unchecked")
	ItemReader<CustomerCredit> outputReader = (ItemReader<CustomerCredit>) applicationContext.getBean("outputTestReader");
	open(outputReader);
	List<CustomerCredit> outputs = new ArrayList<CustomerCredit>(getCredits(outputReader));
	close(outputReader);
 
	// inputFile 과 outputFile 에 포함된 line 수 비교
	assertEquals(inputs.size(), outputs.size());
	// inputFile 과 outputFile 에 포함된 모든 credit 의 합을 비교
	int inputCredit=0;
	int outputCredit=0;
 
	//input 파일들에서 Credit 의 합
	inputs.iterator();
	for (int i = 0; i < inputs.size(); i++) {
		inputCredit += inputs.get(i).getCredit().intValue();
	}
 
	//output 파일들에서 Credit 의 합
	for (int j = 0; j <  outputs.size(); j++) {
		outputCredit += outputs.get(j).getCredit().intValue();
	}
 
	assertEquals(inputCredit, outputCredit);
}

JunitTest 수행

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

결과확인

생성된 파일의 결과를 확인한다.
배치 수행 결과, 세개의 입력파일을 읽고 처리하여 하나의 파일에 쓰여진 것을 확인할 수 있다.

 
egovframework/rte2/brte/batch_example/single_file_partition.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