MultiResource 예제

개요

한 step에서 여러개의 파일을 처리하는 기능을 예제로 제공한다. 스프링 배치에서는 MultiResourceItemReader와 MultiResourceItemWriter를 제공한다.

설명

설정

Job 설정

MultiResource 예제의 Job 설정파일인 multiResourceIoJob.xml을 확인한다

MultiResourceItemReader는 resources로 정의된 파일들을 읽어와서, 파일 한 개씩 delegate로 정의된 reader가 read하도록 전달한다.

아래의 예제는 실제로 파일을 read하는 reader는 delegate로 정의된 FlatFileItemReader이다.

<bean id="itemReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
	<property name="delegate">
		<bean class="org.springframework.batch.item.file.FlatFileItemReader">
			<property name="lineMapper">
				<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
					<property name="lineTokenizer">
						<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
							<property name="delimiter" value="," />
							<property name="names" value="name,credit" />
						</bean>
					</property>
					<property name="fieldSetMapper">
						<bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
						        <property name="targetType" value="egovframework.brte.sample.common.domain.trade.CustomerCredit" />
						</bean>
					</property>
				</bean>
			</property>
		</bean>
	</property>
	<property name="resources" value="#{jobParameters['input.file.path']}" />
</bean>

MultiResourceItemWriter는 itemCountLimitPerResource로 정의된 수보다 write할 item이 넘어가면 새 output파일을 생성하고, delegate로 정의된 writer가 write하도록 전달한다.

아래의 예제는 FlatFileItemWriter가 write한 item이 6이 되면 MultiResourceItemWriter가 새 output 파일을 생성하여 다시 FlatFileItemWriter가 write도록 전달한다.

<bean id="itemWriter" class="org.springframework.batch.item.file.MultiResourceItemWriter" scope="step">
	<property name="resource" value="#{jobParameters['output.file.path']}" />
	<property name="itemCountLimitPerResource" value="6" />
	<property name="delegate" ref="delegateWriter" />
</bean>
<bean id="delegateWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
	<property name="lineAggregator">
		<bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
			<property name="delimiter" value="," />
			<property name="fieldExtractor">
				<bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
			             <property name="names" value="name,credit" />
		               </bean>
	               </property>
               </bean>
	</property>
</bean>

Resource 설정

Job 설정의 xml를 살펴보면 MultiResourceReader의 resources는 input.file.path의 키값으로 지정된 jobParameter의 value이다. 해당 값은 아래의 Junit 테스트케이스 파일에서 확인할 수 있다.

JobParameter
key: input.file.path 
value : /egovframework/data/input/delimited*.csv"

Job 설정의 xml를 살펴보면 MultiResourceWriter의 resource는 output.file.path의 키값으로 지정된 jobParameter의 value이다. 해당 값은 아래의 Junit 테스트케이스 파일에서 확인할 수 있으며, 파일들은 테스트 후에 확인할 수 있다.

  JobParameter
  key : output.file.path
  value : file:./target/test-outputs/multiResourceOutput.csv

Junit 구성 및 수행

JunitTest 구성

MutiResource 예제를 수행하고 배치작업 결과에 대한 검증을 위해 다음과 같이 @Test를 구성하였다.

✔ JunitTest 클래스의 구조는 배치실행환경 예제 Junit Test 설명을 참고한다.
✔ getUniqueJobParameters에서 JobParameter에 배치에 필요한 입력 리소스, 출력 리소스 위치정보를 넘긴다.
✔ EgovAbstractIoSampleTests에서는 배치를 수행하고 배치작업 전후의 데이터를 비교확인한다.
✔ assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()):배치수행결과가 COMPLETED 인지 확인한다.

*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="/egovframework/batch/jobs/multiResourceIoJob.xml" )
public class EgovMultiResourceFunctionalTests extends EgovAbstractIoSampleTests {
 
       ...
 
	@Override
	protected JobParameters getUniqueJobParameters() {
 
		JobParametersBuilder builder = new JobParametersBuilder(super.getUniqueJobParameters());
		return builder.addString("input.file.path", "/egovframework/data/input/delimited*.csv").addString(
 
			"output.file.path", "file:./target/test-outputs/multiResourceOutput.csv").toJobParameters();
	    }
@ContextConfiguration(locations = { "/egovframework/batch/simple-job-launcher-context.xml", "/egovframework/batch/job-runner-context.xml"})
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class })
public abstract class EgovAbstractIoSampleTests {
 
	//배치작업을  test하기 위한 JobLauncherTestUtils
	@Autowired
	@Qualifier("jobLauncherTestUtils")
	private JobLauncherTestUtils jobLauncherTestUtils;
 
	//배치작업의  reader
	@Autowired
	private ItemReader<CustomerCredit> reader;
 
	/**
	 * 배치작업 테스트
	 */
	@Test
	public void testUpdateCredit() throws Exception {
 
		open(reader);
		List<CustomerCredit> inputs = getCredits(reader);
		close(reader);
 
		JobExecution jobExecution = jobLauncherTestUtils.launchJob(getUniqueJobParameters());
		assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
 
		pointReaderToOutput(reader);
		open(reader);
		List<CustomerCredit> outputs = getCredits(reader);
		close(reader);
 
		assertEquals(inputs.size(), outputs.size());
		int itemCount = inputs.size();
		assertTrue(itemCount > 0);
 
		for (int i = 0; i < itemCount; i++) {
			assertEquals(inputs.get(i).getCredit().add(CustomerCreditIncreaseProcessor.FIXED_AMOUNT).intValue(),
					outputs.get(i).getCredit().intValue());
		}
 
	}
 
   ...
}

JunitTest 수행

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

결과확인

MultiReourceWriter의 결과로 여러 파일이 생성되었는지를 확인한다.

참고자료

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