* 목적
- 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
|
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)
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 |
댓글 영역