MultiType Read
-
배치 작업 Xml Sample
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch-int="http://www.springframework.org/schema/batch-integration"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
http://www.springframework.org/schema/batch-integration http://www.springframework.org/schema/batch-integration/spring-batch-integration.xsd">
<!--
* 배치작업 : MULTI TYPE FILE TO DB 샘플
* 배치스텝
- sample-multi-item-to-db-001 : FIXED MULTI TYPE 파일 TO DB 처리
- sample-multi-item-to-db-002 : DELIMITED MULTI TYPE 파일 TO DB 처리
-->
<job id="sample-multi-item-to-db" xmlns="http://www.springframework.org/schema/batch">
<step id="sample-multi-item-to-db-001" next="sample-multi-item-to-db-002">
<tasklet>
<chunk reader="r-sample-multi-item-to-db-001" processor="SmpMultiItemToDbChunk" writer="SmpMultiItemToDbChunk" />
</tasklet>
</step>
<step id="sample-multi-item-to-db-002">
<tasklet>
<chunk reader="r-sample-multi-item-to-db-002" processor="SmpMultiItemToDbChunk" writer="SmpMultiItemToDbChunk" />
</tasklet>
</step>
</job>
<!--
* 샘플용직원정보 Multi Type Fixed File을 Read 하기위한 bean 설정
-->
<bean id="r-sample-multi-item-to-db-001" parent="RMultiTypeFix" scope="step">
<property name="name" value="r-sample-multi-item-to-db-001" />
<property name="resource" value="file:///${prefixFilePath}/test-multi-fixed-file-#{jobParameters['deptNo']}.txt" />
<property name="headerTargetType" value="sample.batch.service.dto.SmpMultiItemToDbChunkHeaderDto" />
<property name="bodyTargetType" value="sample.batch.service.dto.SmpMultiItemToDbChunkBodyDto" />
<property name="footerTargetType" value="sample.batch.service.dto.SmpMultiItemToDbChunkBodyDto" />
</bean>
<!--
* 샘플용직원정보 Multi Type Delimited File을 Read 하기위한 bean 설정
-->
<bean id="r-sample-multi-item-to-db-002" parent="RMultiTypeDelimit" scope="step">
<property name="name" value="r-sample-multi-item-to-db-002" />
<property name="resource" value="file:///${prefixFilePath}/test-multi-delimited-file-#{jobParameters['deptNo']}.txt" />
<property name="headerTargetType" value="sample.batch.service.dto.SmpMultiItemToDbChunkHeaderDto" />
<property name="bodyTargetType" value="sample.batch.service.dto.SmpMultiItemToDbChunkBodyDto" />
<property name="footerTargetType" value="sample.batch.service.dto.SmpMultiItemToDbChunkBodyDto" />
<property name="delimiter" value=";" />
</bean>
</beans>
-
배치 소스코드 Sample
package sample.batch.service;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import bxm.common.annotaion.BxmCategory;
import bxmc.batch.item.processor.BxmMultiItem;
import bxmc.batch.item.processor.MultiItemProcessor;
import bxmc.core.ext.context.DefaultApplicationContext;
import sample.batch.dbio.DSmpEmpTmp001;
import sample.batch.dbio.dto.DSmpEmpTmp000Dto;
import sample.batch.service.dto.SmpMultiItemToDbChunkBodyDto;
import sample.batch.service.dto.SmpMultiItemToDbChunkFooterDto;
import sample.batch.service.dto.SmpMultiItemToDbChunkHeaderDto;
/**
* 샘플 DB TO FILE(Multi Item/Type) 배치
*
* @author sysadmin
*/
@Scope("step")
@Service("SmpMultiItemToDbChunk")
@BxmCategory(logicalName="샘플 FILE(Multi Item/Type) TO DB 배치", description="샘플 FILE(Multi Item/Type) TO DB 배치")
public class SmpMultiItemToDbChunk extends MultiItemProcessor<Object, SmpMultiItemToDbChunkBodyDto> implements ItemWriter<SmpMultiItemToDbChunkBodyDto>{
private Logger logger= LoggerFactory.getLogger(getClass());
private DSmpEmpTmp001 dSmpEmpTmp001;
/**
* header process
* - 처리 대상 Header 데이터를 처리
*/
@BxmMultiItem
@BxmCategory(logicalName = "FILE(Multi Item/Type) TO DB 샘플 header", description = "FILE(Multi Item/Type) TO DB 샘플 header")
public SmpMultiItemToDbChunkBodyDto processHeader(SmpMultiItemToDbChunkHeaderDto in) {
// Header Logging
logger.info("### processHeader... {}", in);
return null;
}
/**
* body process
* - 처리 대상 body 데이터를 처리
*/
@BxmMultiItem
@BxmCategory(logicalName = "FILE(Multi Item/Type) TO DB 샘플 header", description = "FILE(Multi Item/Type) TO DB 샘플 header")
public SmpMultiItemToDbChunkBodyDto processBody(SmpMultiItemToDbChunkBodyDto in) {
SmpMultiItemToDbChunkBodyDto out = new SmpMultiItemToDbChunkBodyDto();
logger.info("### processBody... {}", in);
/**
* 개별 업무로직 수행
* ...
* ...
*/
out = in;
return out;
}
/**
* footer process
* - 처리 대상 footer 데이터를 처리
*/
@BxmMultiItem
@BxmCategory(logicalName = "FILE(Multi Item/Type) TO DB 샘플 footer", description = "FILE(Multi Item/Type) TO DB 샘플 footer")
public SmpMultiItemToDbChunkBodyDto processFooter(SmpMultiItemToDbChunkFooterDto in) {
// Footer Logging
logger.info("### processFooter... {}", in);
return null;
}
/**
* write
* - 처리 대상 결과 데이터를 커밋 단위 별로 DB 또는 파일에 기록처리하는 역할을 수행한다.
*/
@Override
@BxmCategory(logicalName = "FILE(Multi Item/Type) TO DB 샘플 write", description = "FILE(Multi Item/Type) TO DB 샘플 write")
public void write(List<? extends SmpMultiItemToDbChunkBodyDto> in) throws Exception {
// getBean
dSmpEmpTmp001 = DefaultApplicationContext.getBean(dSmpEmpTmp001, DSmpEmpTmp001.class);
/**
* List로 전달된 Item를 Loop를 돌면서 DB에 Insert할 DTO를 List형태로 설정한다.
*/
List<DSmpEmpTmp000Dto> dSmpEmpTmp000Dtos = new ArrayList<DSmpEmpTmp000Dto>();
for(SmpMultiItemToDbChunkBodyDto smpMultiItemToDbChunkBodyDto : in)
{
DSmpEmpTmp000Dto smpEmpTmp001Dto = new DSmpEmpTmp000Dto();
smpEmpTmp001Dto.setFeduEmpNo(smpMultiItemToDbChunkBodyDto.getFeduEmpNo()); // set [FW샘플 임직원번호]
smpEmpTmp001Dto.setFeduEmpNm(smpMultiItemToDbChunkBodyDto.getFeduEmpNm()); // set [FW샘플 임직원명]
smpEmpTmp001Dto.setFeduOccpNm(smpMultiItemToDbChunkBodyDto.getFeduOccpNm()); // set [FW샘플 직업명]
smpEmpTmp001Dto.setFeduMngrEmpNo(smpMultiItemToDbChunkBodyDto.getFeduMngrEmpNo()); // set [FW샘플 관리자임직원번호]
smpEmpTmp001Dto.setFeduHireDt(smpMultiItemToDbChunkBodyDto.getFeduHireDt()); // set [FW샘플 입사일자]
smpEmpTmp001Dto.setFeduPayAmt(smpMultiItemToDbChunkBodyDto.getFeduPayAmt()); // set [FW샘플 급여금액]
smpEmpTmp001Dto.setFeduDeptNo(smpMultiItemToDbChunkBodyDto.getFeduDeptNo()); // set [FW샘플 부서번호]
dSmpEmpTmp000Dtos.add(smpEmpTmp001Dto);
}
/**
* insert 처리
* - 참고 1 : CONNECTED_BATCH로 C/U/D 처리는 Commit 시점에 bulk로 쿼리가 수행이 된다.
* - 참고 2 : CONNECTED_BATCH로 C/U/D 처리는 Commit 시점에 수행이 되기때문에 return 값은 임의의 음수 값이다.(의미없음)
*/
dSmpEmpTmp001.insertList01(dSmpEmpTmp000Dtos);
}
}