/*
* Copyright 2012-2014 MOSPA(Ministry of Security and Public Administration).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package egovframework.rte.bat.core.launch.support;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* EgovBatchRunner 클래스
* @author 실행환경 개발팀 이도형
* @since 2012.06.28
* @version 1.0
* @see
* <pre>
* 개정이력(Modification Information)
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2012.07.25 배치실행개발팀 최초 생성
* 2013.04.01 한성곤 delay가 0보다 작은 경우 loop 반복 처리 (-delayTime 동안 대기 처리)
* </pre>
*/
public class EgovSchedulerRunner {
// slf4J logger 로 변경 : 2014.04.30
private static final Logger LOGGER = LoggerFactory.getLogger(EgovSchedulerRunner.class);
// Job Context가 저장된 XML 파일 경로
private String contextPath;
// Scheduler 관련 설정이 저장된 XML 파일 경로
private String schedulerJobPath;
// 수행할 Job이 저장된 XML 파일 경로
private List<String> jobPaths;
// Scheduling을 위한 대기시간
private long delayTime;
/**
* EgovSchedulerRunner 생성자
*
* @param contextPath : Job Context가 저장된 XML 파일 경로
* @param schedulerJobPath : Scheduler 관련 설정이 저장된 XML 파일 경로
* @param jobPaths : 수행할 Job이 저장된 XML 파일 경로
* @param delayTime : Scheduling을 위한 대기시간
*/
public EgovSchedulerRunner(String contextPath, String schedulerJobPath, List<String> jobPaths, long delayTime) {
this.contextPath = contextPath;
this.schedulerJobPath = schedulerJobPath;
this.jobPaths = jobPaths;
this.delayTime = delayTime;
}
/**
* contextPath를 설정한다.
* @param contextPath
*/
public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
/**
* schedulerJobPath를 설정한다.
* @param schedulerJobPath
*/
public void setSchedulerJobPath(String schedulerJobPath) {
this.schedulerJobPath = schedulerJobPath;
}
/**
* jobPaths를 설정한다.
* @param jobPaths
*/
public void setJobPath(List<String> jobPaths) {
this.jobPaths = jobPaths;
}
/**
* delayTime를 설정한다.
* @param delayTime
*/
public void setDelayTime(long delayTime) {
this.delayTime = delayTime;
}
/**
* Scheduler를 시작한다.
* <br>
* Thread.sleep()을 이용하여, Scheduler가 schedulerJob을 실행할 때까지
* ApplicationContext를 종료하지 않도록 delayTime 동안 대기한다.
* ApplicationContext가 실행되고 있는 동안 Scheduler는 정해진 시간마다 Batch Job을 실행한다.
* 기본값: 매 10초마다 Batch Job 실행(Cron 표현식: 0/10 * * * * ?)
* 정의된 xml파일 위치: /egovframework/batch/batch-scheduler-runner-context.xml
*/
public void start() {
List<String> paths = new ArrayList<String>();
paths.add(contextPath);
paths.add(schedulerJobPath);
// 모든 XML 파일을 ContextPath에 등록한다.
for (int index = 0; index < jobPaths.size(); index++) {
paths.add(jobPaths.get(index));
}
String[] locations = paths.toArray(new String[paths.size()]);
// ApplicationContext를 생성한다.
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(locations, false);
context.refresh();
// CHECKSTYLE:OFF
LOGGER.warn("ApplicationContext Running Time: {} seconds ", delayTime / 1000);
// CHECKSTYLE:ON
boolean mustContinue = false;
long realDelayTIme = delayTime;
if (delayTime < 0) {
mustContinue = true;
realDelayTIme = -1 * delayTime;
}
if (mustContinue) {
LOGGER.info("Continue...");
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(realDelayTIme);
} catch (InterruptedException ie) {
break;
}
}
LOGGER.info("Sleeping ends...");
context.close();
} else {
try {
// 설정한 시간만큼 대기하고, 그 사이에 Scheduler가 수행된다.
// CHECKSTYLE:OFF
LOGGER.info("Sleeping Time: {} sedonds ", realDelayTIme / 1000);
// CHECKSTYLE:ON
Thread.sleep(realDelayTIme);
LOGGER.info("Sleeping ends...");
} catch (InterruptedException ie) {
/* interrupted by other thread */
LOGGER.info("Sleeping has Interrupted...");
}
context.close();
}
}
}