안녕하세요 용재형 입니다.
이번 포스팅은 java에서 .bat파일 args를 쿼츠 잡 파라미터로 넘기는 방법 입니다.
java에서 .bat파일과 쿼츠를 이용한 배치를 실행하고 있습니다.
기존에는 한개의 배치 파일을 통해, 한개의 잡을 실행하게 되어, 분산 처리가 되지 않아, 속도에 이슈가 생겼습니다.
.bat파일에 arg를 넘겨, 그 arg를 쿼츠잡으로 실행하여, 한개의 쿼츠잡에 여러개의 배치가 돌 수 있겠끔, 개발을 진행 했습니다.
구조를 본 다면, 아래의 그림과 같습니다.
먼저 bat파일에 고정적인 arg값을 넣었습니다. 이 args값은 job에서 select할때 키값으로 사용하고 있습니다.
예를 들어, SyncHistJob_dev.bat args 0,1,2,3 -> 총 2만건에 데이터에 고객키가 0,1,2,3만 처리
SyncHistJob_dev_2.bat args 4,5,6 -> 총 2만건에 데이터에 고객키가 4,5,6 만 처리
SyncHistJob_dev_3.bat args 7,8,9,Z -> 총 2만건에 데이터에 고객키가 7,8,9,Z 만 처리
먼저 SyncHistJob_dev.bat 파일에서는 아래와 같이 세팅합니다. 동일하게 dev2.bat, dev3 args만 변경해서 처리해주면 됩니다.
REM ---------------------------------------------- REM - USER PARAMETER SET REM ----------------------------------------------
set PKG_PATH=com.nt.batch.ifs.quartz.main
set PG_ID=SyncHistBatch
set args1=0,1,2,3
set args2=%2
set args3=%3
set args4=%4
set args5=%5
set args6=%6
set args7=%7
.bat에 설정되어 있는 PKG_PATH, PG_ID를 호출 합니다.
public class SyncHistBatch {
protected static final Log log = LogFactory.getLog(SyncHistBatch.class);
private String seperate = "";
public void setSeperate(String seperate) {
this.seperate = seperate;
}
public String getSeperate() {
return this.seperate;
}
public static void main(String[] args) throws Exception {
if( args[5].length() > 0){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/quartz/Spring-Quartz-SyncHist.xml");
SyncHistBatch bean = (SyncHistBatch)applicationContext.getBean("SyncHistBatch");
bean.setSeperate(args[5]);
}
}
}
쿼츠가 설정되어 있는 Spring-Quartz-SyncHist.xml에 SyncHistBatch를 Bean으로 설정하여, 받아온 args를 bean에 set 합니다.
아래는 Spring-Quartz-SyncHist.xm 설정한 부분 입니다.
<bean id="SyncHistBatch" class="com.nt.batch.ifs.quartz.main.SyncHistBatch">
<property name="seperate" value="" />
</bean>
<!-- Spring Quartz -->
<bean name="SyncHistSchedJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.nt.batch.ifs.quartz.job.SyncHistSchedJob" />
<property name="jobDataAsMap">
<map>
<entry key="SyncHistTask" value-ref="SyncHistTask" />
<entry key="SyncHistBatch" value-ref="SyncHistBatch" />
</map>
</property>
</bean>
아래와 같이, SyncHistBatch에 getSeperate를 가져와, jobExecute에서 String으로 쿼리에 사용하면 됩니다.
@Service
public class SyncHistSchedJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
log.debug("param >>>>>>>>>"+this.SyncHistBatch.getSeperate());
this.jobExecute(this.SyncHistBatch.getSeperate());
}
@SuppressWarnings("rawtypes")
private void jobExecute(String seperate){
List<String> seperateList = Arrays.asList(seperate.split(","));
}
}
'IT > Back-End' 카테고리의 다른 글
[MSSQL] MSSQL 날짜 변환표(GETDATE, CONVERT) (0) | 2022.02.03 |
---|---|
오라클에서 특정컬럼 소수점 값있는 데이터 찾기(ex0.1, 0.2) (0) | 2020.09.25 |
[오라클] 인덱스 힌트 사용방법(Oracle index hint) (0) | 2020.02.13 |
Injection of autowired dependencies failed (0) | 2018.12.12 |
자바 null 체크 (0) | 2018.12.12 |
댓글