Spring Batch 의 가장 큰 이슈(절대 문제는 아님)는 하나의 Repository를 여러 Job 이 사용하다가 실패될 가능성이 많다. 따라서 가장 확실하게 하나의 Job은 하나의 Repository를 쓰는 것이 가장 안전하다!
http://knight76.tistory.com/1191 (관련내용)
그러나, 이런 이슈 때문에 매번 Table 이름에 Prefix를 줄 때 상당히 힘이 들 수 밖에 없다. 오타라도 나면. 끔찍하다. 지울 때 잘 못 치우면 지우지도 귀찮은 일이 벌어지기도 한다.
mysql 의 예제) Spring Batch lib 에 담겨 있음.
schema-mysql.sql
|
Spring Batch Table을 생성 하고 삭제하는 아주 간단한 예제를 공유한다. 버그가 많겠지만.. 대충 쓰기에는 좋을 듯 하다. (돌아갈 정도로만 만들었음..)
예제는 Web call로 mysql에 Spring Batch repository table 생성하는 코드이다. 코드는 완전하지 않을 수 있음.
1. 설정파트
접속해야 할 DB 정보는 db.properties 에 저장한다.
repository.jdbc.url=… |
/beans-batchdb.xml
<?xml version="1.0" encoding="UTF-8"?> <!—mybatis 설정 추가 --> |
/job/create-repository/benas-create-repository.xml
<?xml version="1.0" encoding="UTF-8"?> <bean id="repository_simpleStep" class="org.springframework.batch.core.step.item.SimpleStepFactoryBean" abstract="true"> |
beans.xml
<import resource="/beans-batchdb.xml"/>
<!-- job #1 : create repository --> |
2. 자바 코드
com.google.batch.repository.DataSourceInitailizer
/* package com.google.batch.repository;
import java.io.IOException; import javax.sql.DataSource; import org.apache.commons.io.IOUtils; /** private static final Log logger = LogFactory.getLog(DataSourceInitializer.class); private Resource[] initScripts; private DataSource dataSource; private String replacePreFix; public String getReplacePreFix() { public void setReplacePreFix(String replacePreFix) { protected void finalize() throws Throwable { public void destroy() { public void afterPropertiesSet() throws Exception { public void initialize() { @SuppressWarnings("unchecked") public Object doInTransaction(TransactionStatus status) { }); } private String stripComments(List<String> list) { public void setInitScripts(Resource[] initScripts) { public void setDataSource(DataSource dataSource) { |
com.google.batch.repository.RepositoryJobExecutionListener
package com.google.batch.repository;
import java.util.Map; import org.springframework.batch.core.BatchStatus; public class RepositoryJobExecutionListener implements JobExecutionListener { private ConfigurableApplicationContext context; DataSourceInitializer dsinit =(DataSourceInitializer)context.getBean("dataSourceInitializerForCreation"); @Override } |
com.google.batch.repository.RepositoryTasklet
package com.google.batch.repository;
import org.springframework.batch.core.StepContribution;
public class RepositoryTasklet implements Tasklet { public void setDataSourceInitializer(DataSourceInitializer dataSourceInitializer) { |
JobRepositoryController
package com.google.batch.controller;
import org.springframework.batch.core.Job;
@Controller @Autowired @Autowired String[] parameters = new String[2]; Properties props = StringUtils.splitArrayElementsIntoProperties(parameters, "="); builder.addLong("currTime", System.currentTimeMillis()); for(Object okey : props.keySet() ) { JobParameters jobParameters = builder.toJobParameters(); repositoryJobLauncher.run(repositoryJobTableCreation, jobParameters); } else if (type.equalsIgnoreCase("drop")) { repositoryJobLauncher.run(repositoryJobTableDrop, jobParameters); } else { throw new WrongParamException(); } return "success"; } |
3. 실행 테스트
(1) table 생성
$ curl -X GET http://localhost/batch/repository/create/itemid_ success |
(2) table 삭제
$ curl -X GET http://localhost/batch/repository/drop/itemid_ success |
* ResourcelessTransactionManager 클래스의 단점이 있다.
위의 예제는 하나의 JVM에서 동작할 때 하나의 Job만 동작하는 경우에 쓸모가 있다. 즉, 다른 Job과 동시에 작업하는 Batch Job으로 동작하는 경우, ResourcelessTransactionManager 는 동작하지 않는다.
다른 Job의 TransactionManager로 바뀌는 부분이 존재한다. 따라서, 위의 예제는 하나의 JVM 인스턴스로 동작하는 경우에서만 사용할 수 있다. 다른 Job 과 동시에 사용해야 하는 경우 위의 예제를 사용할 수 없다.
다음 내용으로 변경해서 해결했다.
http://knight76.tistory.com/entry/Mysql-에서-Spring-Batch를-이용하여-Job-Repository-Table-생성-또는-삭제하는-예제-2
'general java' 카테고리의 다른 글
Spring에서 property의 default value 지정하기 (0) | 2012.08.03 |
---|---|
Mysql 에서 Spring Batch를 이용하여 Job Repository Table 생성 또는 삭제하는 예제 - 2 (0) | 2012.07.28 |
Spring NoClassDefFoundError EnvironmentCapable 처리 (0) | 2012.07.12 |
java- HTMLEntity 변환 코드 (2) | 2012.06.22 |
json http request 보내는 ngrinder script 참조 (0) | 2012.06.15 |