ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로젝트 완료 - 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 수행 확인

     

     

     

     

    이상입니다.

     

     

     

    반응형

    댓글

Designed by black7375.