상세 컨텐츠

본문 제목

Spring batch example 1

소프트웨어/spring

by 야솔아빠 2012. 7. 17. 08:27

본문

반응형

* 목적

- org.springframework.batch.core.launch.support.CommandLineJobRunner 을 통해 JUnit이 아닌 방법으로 spring batch 를 구동.

 

1. STS(Spring Source Tools) 에서 Spring Batch project를 만든다.

project name : springbatch_example1

 

2. resousrces에 job package 를 만든다.

 

3. 자동으로  생성된 module-context.xml 파일을 참조하여 job/job1.xml 파일을 만든다.

<?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="http://www.springframework.org/schema/batch"
    xsi:schemaLocation="
    http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   
    <description>Example job to get you started. It provides a skeleton for a typical batch application.</description>
    
     <import resource="classpath:/launch-context.xml" />
    
    <batch:job id="job1" incrementer="jobParametersIncrementer">
        <batch:step id="step1"  >           
            <batch:tasklet start-limit="100" >
                <batch:chunk reader="reader" writer="writer" commit-interval="1" />
            </batch:tasklet>
        </batch:step>
    </batch:job>
   
    <bean id="reader" class="com.inho.springbatch.ExampleItemReader" scope="step">
    </bean>

    <bean id="writer" class="com.inho.springbatch.ExampleItemWriter" scope="step">
    </bean>
</beans> 


* ExampleItemReader, ExampleItemWriter 파일은 자동으로 generated 된 파일입니다.

 

4. batch.properties 수정

수정하는 이유는 DB로 부터 jobLauncher가 수행 될 수 있도록 하기 위함입니다.

이 작업을 수행하기 전에 Oracle DB를 먼저 구동시킵니다.

 

원래는 hsqldb로 되어 있습니다. 저는 oracle data source 로 변경했습니다.

springbatch example source 를 다운받아서 batch-oracle.properties 파일을 복사하여 덮어 썼습니다.

springbatch example source 다운 : http://static.springsource.org/downloads/nightly/release-download.php?project=BATCH



batch.jdbc.driver=oracle.jdbc.OracleDriver
batch.jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
batch.jdbc.user=spring
batch.jdbc.password=spring
batch.jdbc.testWhileIdle=false
batch.jdbc.validationQuery=
batch.jdbc.verifyCursorPosition=true
batch.drop.script=classpath:/org/springframework/batch/core/schema-drop-oracle10g.sql
batch.schema.script=classpath:/org/springframework/batch/core/schema-oracle10g.sql
batch.business.schema.script=business-schema-oracle10g.sql
batch.data.source.init=true
batch.database.incrementer.class=org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer
batch.database.incrementer.parent=sequenceIncrementerParent
batch.lob.handler.class=org.springframework.jdbc.support.lob.OracleLobHandler
batch.grid.size=2
batch.jdbc.pool.size=6
batch.verify.cursor.position=true


5. 프로젝트를 run 시켜봅니다. 당연히 error 가 발생할 겁니다.

프로젝트 실행시키기 위해 configuration 을 변경합니다.

Run > Run configurations

Java Application 에서 마우스 우클릭하고 New

Name : springbatch_example1

Main class : org.springframework.batch.core.launch.support.CommandLineJobRunner


<사진은 추후 업로드 하겠습니다>

 


Arguments tab을 선택하고 다음과 같이 입력합니다.

job/job1.xml job1 –next

 

 

run 시킨 이유는 DB table 생성을 하기 위함입니다.

launch-contxt.xml 파일을 보면 아래 항목이 있습니다.

 

<jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database>

 

테이블이 생성되었는지 확인을 합니다. 없던 테이블이 생겼습니다.

이 테이블은 jobLauncher 를 할 수 있도록 도와주고, job 실행 이력을 관리합니다.

 

6. launch-context.xml 파일을 수정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 

    <context:property-placeholder location="classpath:batch.properties" />

 

    <context:component-scan base-package="com.inho.springbatch" />

 

<!--     <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="${batch.schema.script}" />
    </jdbc:initialize-database> –>

 

    <batch:job-repository id="jobRepository"
        data-source="dataSource" transaction-manager="transactionManager"
        isolation-level-for-create="SERIALIZABLE" />

 

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" lazy-init="true">
        <property name="dataSource" ref="dataSource" />
    </bean>
   

    <!-- ***** jobExplorer ***** -->
    <bean id="jobExplorer"
        class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"
        p:dataSource-ref="dataSource" />
    <!-- <import resource="classpath:/META-INF/spring/module-context.xml" /> -->

    <bean id="jobLauncher"
          class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
    </bean>

    <!-- * JOB CUSTOM INCREMENTER -->   
    <bean id="jobParametersIncrementer" class="com.inho.springbatch.common.ExampleJobIncrementer" />

    <!-- ***** jobRegistry ***** -->
    <bean id="jobRegistry"
        class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
    <bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
        <property name="jobRegistry" ref="jobRegistry"/>
    </bean>

</beans> 


com.inho.springbatch.common.ExampleJobIncrementer 파일이 없다라고 에러가 나올 것입니다.

 

7. ExampleJobIncrementer.java 파일

김성헌 선생님의 도움으로 custom incrementer 를 만들었습니다.


package com.inho.springbatch.common;

import java.util.Set;

import org.apache.log4j.Logger;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersIncrementer;

public class ExampleJobIncrementer implements JobParametersIncrementer {
private final static Logger logger = Logger.getLogger(ExampleJobIncrementer.class);
   
    public JobParameters getNext(JobParameters parameters) {   
       
        logger.info("###########################################");
        logger.info("----> JobParameters getNext...");
       
        long runId;
        JobParametersBuilder builder = new JobParametersBuilder();
       
        Set<String> paramSet = parameters.getParameters().keySet();
        for(String key : paramSet) {
            builder.addParameter(key, parameters.getParameters().get(key));
        }
       
        if (parameters == null || parameters.isEmpty()) {
            runId = 1L;
        }
        else
        {
            runId = parameters.getLong("job.run.id") + 1L;
        }
   
        builder.addLong("job.run.id", runId).toJobParameters();
//        builder.addString("job.batch.id", DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSSS"));
       
        logger.info("[ JobParameters : " + builder.toJobParameters().toString() + " ]");
        logger.info("###########################################");

        return builder.toJobParameters();
    }



8. 프로젝트를 실행시킵니다.

springbatch_example1 을 실행시킵니다.

정상적으로 수행 된 것을 확인할 수 있을겁니다.

ExampleItemWriter 의 write() 가 수행되었는지 확인합니다.


2012-07-16 11:14:13,394 INFO [com.inho.springbatch.ExampleItemWriter] - <[Hello world!]>


* 다음 번에는 DB to DB batch 에 대해 글을 남겨볼까 합니다.

* 도움을 주신 분 : 김성헌 선생님(thomas)

반응형

'소프트웨어 > spring' 카테고리의 다른 글

Spring3 + hibernate4 연동  (0) 2012.09.04
Spring Batch Example 2 - DB to DB (1)  (5) 2012.07.24
Spring 외부 properties 설정  (0) 2012.07.03
[Spring] Async pattern 예제  (0) 2012.01.30
[Spring] Scheduler 예제  (0) 2012.01.13

관련글 더보기

댓글 영역