MULTI FILE READ

  • 배치 작업 Xml Sample

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch-int="http://www.springframework.org/schema/batch-integration"
xsi:schemaLocation="http://www.bankwareglobal.com/schema/batchex http://www.bankwareglobal.com/schema/batchex/spring-batch-ex.xsd
                    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://www.springframework.org/schema/batch-integration http://www.springframework.org/schema/batch-integration/spring-batch-integration.xsd">

    <import resource="classpath:JobConfig.xml"/>

    <job-component xmlns="http://www.bankwareglobal.com/schema/batchex" id="jobcomp" with-dependon="true">
        <base-package name="bxm.dft.smp.batch.bean">
            <include name="MSmpMultiFileRead*Btch"/>
        </base-package>
    </job-component>

    <!--
        * 배치작업 :MULTI FILE READ 샘플
        * 배치스텝
            - JSmpMultiFileRead100 : MULTI FILE READ 샘플 초기화 처리
            - JSmpMultiFileRead200 : 2개의 파일을 직접 Open 하여 DB에 Insert 처리
     -->
    <job id="JSmpMultiFileRead" xmlns="http://www.bankwareglobal.com/schema/batchex">
        <step id="JSmpMultiFileRead100" next="JSmpMultiFileRead200" parent="parentStep">
            <tasklet ref="MSmpMultiFileReadInitBtch"/>
        </step>
        <step id="JSmpMultiFileRead200" parent="parentStep">
            <tasklet>
                <chunk reader="MSmpMultiFileReadBtch" processor="MSmpMultiFileReadBtch" writer="MSmpMultiFileReadBtch"/>
            </tasklet>
        </step>
    </job>
</beans>
  • 배치 소스코드 Sample

@BxmBean("MSmpMultiFileReadBtch")
@Scope("step")
@BxmCategory(logicalName = "MULTI FILE READ 샘플")
public class MSmpMultiFileReadBtch implements ItemStream, ItemReader<MSmpMultiFileReadBtch01Dto>,
        ItemProcessor<MSmpMultiFileReadBtch01Dto, MSmpMultiFileReadBtch03Dto>, ItemWriter<MSmpMultiFileReadBtch03Dto> {

    final Logger logger = LoggerFactory.getLogger(this.getClass());

    private DSmpEmpTmp001 dSmpEmpTmp100;

    private FixedFileReader<MSmpMultiFileReadBtch01Dto> empInfoFixedReader = null;
    private DelimitedFileReader<MSmpMultiFileReadBtch02Dto> empInfoDelimitedReader = null;

    private int currentEmpNo;

    /
     * open
     * - 초기화를 위해 구현해야 하는 메소드로서 스텝이 시작되기 전에 프레임워크에서 최초 1번 호출된다.
     */
    @Override
    @BxmCategory(logicalName = "open : 샘플용 직원정보 File Open 처리")
    public void open(ExecutionContext executionContext) throws ItemStreamException {
        /
         * 배치입력아규먼트에서 입력된 Order Date 를 가지고 온다.
         */
        String oDate = DefaultBatchApplicationContext.getJobParameter("oDate");

        /
         * 샘플용 직원1정보 Fixed File Open
         */
        String empInfoFixedFileName = "/data1/prod/bxm400/dat/fixed_file_" + oDate + ".txt";
        empInfoFixedReader = DefaultFileUtils.getFixedFileReader(empInfoFixedFileName, MSmpMultiFileReadBtch01Dto.class,
                "UTF-8");
        empInfoFixedReader.open(executionContext); // File Open

        /
         * 샘플용 직원2정보 Delimited File Open
         */
        String empInfoDelimitedFileName = "/data1/prod/bxm400/dat/delimited_file_" + oDate + ".txt";
        empInfoDelimitedReader = DefaultFileUtils.getDelimitedFileReader(empInfoDelimitedFileName,
                MSmpMultiFileReadBtch02Dto.class, ",", "UTF-8");
        empInfoDelimitedReader.open(executionContext); // File Open

    }

    /
     * read
     * - 처리 대상 데이터를 건 별로 DB 또는 파일에서 읽어오는 역할을 수행한다.
     */
    @Override
    @BxmCategory(logicalName = "read : 샘플용 직원정보 Read")
    public MSmpMultiFileReadBtch01Dto read()
            throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        /
         * 샘플용 직원정보를 1건씩 read하여 return 한다.
         * - empInfoReadr 에서 null 을 return 하면 배치는 종료된다.
         */
        MSmpMultiFileReadBtch01Dto out = empInfoFixedReader.read();

        return out;
    }

    /
     * process
     * - 처리 대상 데이터를 건 별로 업무요건에 따라 처리하는 역할을 수행한다.
     */
    @Override
    @BxmCategory(logicalName = "process : 샘플용 직원정보 처리")
    public MSmpMultiFileReadBtch03Dto process(MSmpMultiFileReadBtch01Dto in) throws Exception {
        MSmpMultiFileReadBtch03Dto out = null;

        if (dSmpEmpTmp100 == null) {
            dSmpEmpTmp100 = DefaultApplicationContext.getBean(DSmpEmpTmp001.class);
        }

        /
         * 샘플용 직원1정보파일에 대하여 샘플용 직원2정보파일와 비교하여 샘플용 직원2정보파일에 직원정보가 있는지 체크한다.
         * - 직원2정보파일에 직원정보가 존재하면 writer로 데이터 전달
         * - 직원2정보파일에 직원정보가 없으면 null return.
         */
        if (in.getFeduEmpNo() != currentEmpNo) {
            MSmpMultiFileReadBtch02Dto mSmpMultiFileReadBtch02Dto = null;
            while mSmpMultiFileReadBtch02Dto = empInfoDelimitedReader.read( != null) {
                if (in.getFeduEmpNo() <= mSmpMultiFileReadBtch02Dto.getFeduEmpNo()) {
                    currentEmpNo = mSmpMultiFileReadBtch02Dto.getFeduEmpNo();
                    break;
                }
            }
        }
        if (in.getFeduEmpNo() != currentEmpNo) {
            return null;
        }

        /
         *  write에 전달할 Item 설정
         */
        out = new MSmpMultiFileReadBtch03Dto();
        DSmpEmpTmp001Dto dSmpEmpTmp100insert02InDto = new DSmpEmpTmp001Dto();

        dSmpEmpTmp100insert02InDto.setFeduEmpNo(in.getFeduEmpNo()); // set [FW샘플 임직원번호]
        dSmpEmpTmp100insert02InDto.setFeduEmpNm(in.getFeduEmpNm()); // set [FW샘플 임직원명]
        dSmpEmpTmp100insert02InDto.setFeduOccpNm(in.getFeduOccpNm()); // set [FW샘플 직업명]
        dSmpEmpTmp100insert02InDto.setFeduMngrEmpNo(in.getFeduMngrEmpNo()); // set [FW샘플 관리자임직원번호]
        dSmpEmpTmp100insert02InDto.setFeduHireDt(in.getFeduHireDt()); // set [FW샘플 입사일자]
        dSmpEmpTmp100insert02InDto.setFeduPayAmt(in.getFeduPayAmt()); // set [FW샘플 급여금액]
        dSmpEmpTmp100insert02InDto.setFeduDeptNo(in.getFeduDeptNo()); // set [FW샘플 부서번호]

        out.setGrid01(dSmpEmpTmp100insert02InDto);

        return out;
    }

    /
     * write
     * - 처리 대상 결과 데이터를 커밋 단위 별로 DB 또는 파일에 기록처리하는 역할을 수행한다.
     */
    @Override
    @BxmCategory(logicalName = "write : 샘플용 직원정보 처리")
    public void write(List<? extends MSmpMultiFileReadBtch03Dto> in) throws Exception {
        /
         * List로 전달된 Item를 Loop를 돌면서 DB에 Insert할 DTO를 List형태로 설정한다.
         */
        List<DSmpEmpTmp001Dto> dSmpEmpTmp100insert02InDtos = new ArrayList<DSmpEmpTmp001Dto>();
        for (MSmpMultiFileReadBtch03Dto mSmpMultiFileReadBtch03Dto : in) {
            dSmpEmpTmp100insert02InDtos.add(mSmpMultiFileReadBtch03Dto.getGrid01());
        }

        /
         * insert 처리
         * - 참고 1 : CONNECTED_BATCH로 C/U/D 처리는 Commit 시점에 bulk로 쿼리가 수행이 된다.
         * - 참고 2 : CONNECTED_BATCH로 C/U/D 처리는 Commit 시점에 수행이 되기때문에 return 값은 임의의 음수 값이다.(의미없음)
         */
        dSmpEmpTmp100.insert02(dSmpEmpTmp100insert02InDtos);
    }

    /
     * update
     * - 진행 상태를 기록하기 위해 구현해야 하는 Method로서 구간 별로 Commit 시에 프레임워크에서 호출된다.
     */
    @Override
    @BxmCategory(logicalName = "update")
    public void update(ExecutionContext executionContext) throws ItemStreamException {
        if (empInfoFixedReader != null)
            empInfoFixedReader.update(executionContext);
        if (empInfoDelimitedReader != null)
            empInfoDelimitedReader.update(executionContext);
    }

    /
     * close
     * - 리소스 정리 작업을 위해 구현해야 하는 Method로서 Step 완료 시에 프레임워크에서 호출된다.
     */
    @Override
    @BxmCategory(logicalName = "close")
    public void close() throws ItemStreamException {
        if (empInfoFixedReader != null)
            empInfoFixedReader.close();
        if (empInfoDelimitedReader != null)
            empInfoDelimitedReader.close();
    }
}
SWLab Bankware Global
  • 전체
  • BXM
  • BXCM
  • BXCP
  • BXI
제품 선택 시 더 정확한 매뉴얼 가이드를 제공해드립니다.

Copyright© Bankwareglobal All Rights Reserved.