-
프로젝트 완료 - Batch Scheduler Demon 개발프로젝트 완료 2020. 5. 20. 10:45반응형
설명
프로젝트를 참여하다보면, 서버 내 root권한이 없어 crontab 기능을 사용하지 못하는 경우가 많습니다.
그 경우에 사용할 수 있는 데몬을 개발하였습니다.
Batch Scheduler란 crontab과 유사한 스케줄링 기능을 할 수 있도록 개발한 프로그램이며, jar, shell, config 파일들로 구성되어있습니다.
사용자가 실행해야 할 스크립트 경로와 시간을 입력하여, 해당 시간에 실행시켜주는 프로그램입니다.
입력한 스크립트의 실행 주기는 1일 1회로 고정적으로 사용할 수 있으며, 실패 시 재처리 기능을 포함하고 있습니다.
현재 사용하고 있는 자바 버전에 구애받지 않고, JDK 1.8버전의 jdk 폴더만 구성해주면 실행이 가능합니다.
개발환경
OS : Windows10 Pro
Vmware : CentOS Linux release 7.7.1908 (AltArch)
java-version : 13.0.2
springframwork-version : 5.2.3.RELEASE
springBoot : 2.2.4 RELEASE
quartz : 2.3.2
Gradle : 6.0.1
개발기간 : 2020-02-20 ~ 2020-05-08
구성
파일명
설명
BatchScheduler-0.0.1-SNAPSHOT.jar
Spring Batch + Quartz 조합
batchAdmin.sh 주기적으로 실행startBatch.sh
BatchScheduler-0.0.1-SNAPSHOT.jar 실행하는 스크립트
stopBatch.sh
BatchScheduler-0.0.1-SNAPSHOT.jar 종료하는 스크립트
batchAdmin.sh
batchSet.conf 를 참조하여 일정 시간에 Shell Script을 실행 및 종료 스크립트
batchSet.sh
batchSet.conf 에 정보 등록 및 초기 세팅
batchSet.conf
스케줄러명과 실행해야할 스크립트와 시간 등 설정 관리
흐름도
주요기능 : BatchScheduler-0.0.1-SNAPSHOT.jar
// RunApplication.java @SpringBootApplication public class RunApplication { private static String[] ParamList; public static String[] getParams() { return ParamList; } public static void main(String[] args) { String[] Params = new String[2]; Logger logger = LoggerFactory.getLogger(RunApplication.class); //Default Setting : 10분마다 batchAdmin.sh(기본제공) 실행 String ShellDir = args[0]; Params[0] = "sh " + ShellDir + "batchAdmin.sh"; if (args.length == 1 ) { Params[1] = "0 0/10 * * * ?"; } else if (args.length == 2 ) { Params[1] = args[1].replace(",", " "); } else { logger.info("사용법: startBatch.sh $PortNumber 또는 startBatch.sh $ProtNumber $cronCycle"); return; } ParamList = Params; SpringApplication.run(RunApplication.class, Params); } }
//TrReqJob.java @Component @Slf4j public class TrReReqJob extends QuartzJobBean implements InterruptableJob { @Override public void interrupt() throws UnableToInterruptJobException { } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { Logger logger = LoggerFactory.getLogger(TrReReqJob.class); String[] args = RunApplication.getParams(); String commandLine = args[0]; SimpleDateFormat format1 = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss"); Date time = new Date(); String currentTime = format1.format(time); try { logger.info("RunTime: "+currentTime+" | RunShell: "+commandLine+" | Result: Success"); shellCmd(commandLine); } catch (Exception e) { logger.error("RunTime: "+currentTime+" | RunShell: "+commandLine+" | Result: Error"); logger.error("Batch Run Fail :", e); } } public static void shellCmd(String command) throws Exception { Logger logger = LoggerFactory.getLogger(TrReReqJob.class); Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec(command); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; while((line = br.readLine()) != null) { logger.info(line); } } }
//BatchController.java @Slf4j @Controller public class BatchController { @Autowired private Scheduler scheduler; @PostConstruct public void start() { Logger logger = LoggerFactory.getLogger(BatchController.class); String[] args = RunApplication.getParams(); String cronCycle = args[1]; JobDetail aggreReqJobDetail = buildJobDetail(TrReReqJob.class, "QuartzJob", "Quartz", new HashMap()); try { scheduler.scheduleJob(aggreReqJobDetail, buildJobTrigger(cronCycle)); } catch (SchedulerException e) { logger.error("start Function Fail :", e); } } public Trigger buildJobTrigger(String scheduleExp) { return TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule(scheduleExp)).build(); } public JobDetail buildJobDetail(Class job, String name, String group, Map params) { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.putAll(params); return newJob(job).withIdentity(name, group) .usingJobData(jobDataMap) .build(); } }
주요기능 : batchAdmin.sh
함수명
설명
function getConfDir()
batchSet.conf 위치 찾는 함수
function getBatchCont()
batchSet.conf 설정내용과 스케줄러명 가져오는 함수
function compareTime()
batchSet.conf 의 설정된 시간과 현재 시간 비교 함수
function reProc()
Shell Script 실행 실패건 체크 및 재처리
function adminShell()
batchSet.conf 의 설정된 Shell Script 실행 및 종료
function regSpace()
공백 → 쉼표, 쉼표 → 공백 치환 함수
function volumeAdmin()
읽어오는 로그파일들 용량 관리 함수
주요기능 : batchSet.sh
함수명
설명
Batch Setting 메뉴얼 출력 및 설정 값 입력
function confExistChk()
batchSet.conf 파일 존재 여부 및 변수 생성 확인
function init()
초기 세팅 및 모니터링 로그 폴더 생성
function javaChk()
JAVA 디렉토리 확인 및 설정
function setConfig()
입력받은 값 저장
테스트 환경
AWS EC2 :
1) Centos 6.5 / jdk 1.5.0
2) Centos 6.5 / jdk 1.7.0
batchSet.sh 실행 화면
- Java 1.8 폴더의 디렉토리를 입력하여 1.8 버전의 바이너리로 이동하여 jar 파일 실행
startBatch.sh 실행 화면
- 포트번호 입력
BatchLog 확인
- 10분 마다 batchAdmin.sh 호출 확인
- 해당 시간 마다 batchScript 수행 확인
이상입니다.
반응형'프로젝트 완료' 카테고리의 다른 글
프로젝트 완료 - 학생 개인 문제 및 건강 관리 (0) 2020.05.07 댓글