====== 배치 템플릿을 이용한 EgovSchedulerRunner 예제 ====== ===== 개요 ===== Scheduler 기반의 배치 템플릿 프로젝트를 이용하여 EgovSchedulerRunner의 사용법을 보여주는 예제이다. ===== 설명 ===== ==== 설정 ==== === Scheduler 배치 템플릿 프로젝트 생성 === == 아래를 참고하여 File(SAM) / DB 타입의 Scheduler 배치 템플릿 프로젝트 를 생성한다. == - [[egovframework:dev2:bdev:imp:batch_template_wizard:sam_scheduler_template_mgmt | File(SAM)타입]] - [[egovframework:dev2:bdev:imp:batch_template_wizard:db_scheduler_template_mgmt | DB타입 ]] === Scheduler 배치 템플릿 전체 설정 === == Scheduler 배치 템플릿 설정 파일인 context-scheduler.xml을 확인한다. == ✔ Scheduler 배치 템플릿 실행에 필요한 xml 정보와 Scheduler의 Trigger 정보가 기술되어 있다. \\ ✔ Trigger에 jobDetail(JobDetailBean)과 cronExpression를 설정한다. 기본적으로 매 10초 주기로 jobDetail을 실행하도록 설정되어 있다. \\ ✔ 다른 Trigger의 사용방법을 알기 위해서는 [[egovframework:rte2:fdl:scheduling | Scheduling 서비스 ]]를 참고한다. == Scheduler 배치 템플릿 설정 파일인 context-scheduler-job.xml을 확인한다. == ✔ context-scheduler.xml에서 사용한 jobDetail의 클래스(EgovJobLauncherDetails) 정보가 기술되어 있다. \\ ✔ jobDetail의 jobDataAsMap에 필수적으로 **jobName**, **jobLocator**, **jobLauncher** 등의 세가지 정보를 기술한다. \\ ✔ 위에 기술한 세가지 정보 외에 jobDataAsMap에 기술하는 값은 **Job Parameter**를 생성하는데 이용된다. \\ 예) Input File 경로 , Output File 경로 == Scheduler 배치 템플릿 설정 파일인 context-batch-datasource.xml을 확인한다. == ✔ datasource 관련 정보가 기술되어 있다. classpath:/egovframework/batch/properties/globals.properties ... DBMS별 설정 ... == Scheduler 배치 템플릿 설정 파일인 context-batch-job-launcher.xml을 확인한다. == ✔ JobLauncher, JobOperator, JobRepository, JobRegistry, JobExplorer 정보가 기술되어 있다. == Scheduler 배치 템플릿 설정 파일인 context-batch-sqlmap.xml을 확인한다. == ✔ SQLMapClient 정보가 기술되어 있다. ==== EgovSchedulerJobRunner 구성 및 수행 ==== === EgovSchedulerJobRunner 구성 === EgovSchedulerJobRunner의 main() 메소드에서 Scheduler의 jobDetail 클래스(EgovJobLauncherDetails)를 실행하기 위한 순서는 아래와 같다. - 실행할 Job이 기술된 xml 파일 경로를 **jobPaths** 변수에 지정한다. - Scheduler 정보가 기술된 xml파일(context-scheduler.xml)의 경로, jobDetail 클래스가 정의된 xml 파일(context-scheduler-job.xml)의 경로, jobPaths 그리고 지연시간(**기본: 30초**)을 지정한다. - start() 메소드를 이용하여 Scheduler를 실행한다. public static void main(String[] args) { List jobPaths = new ArrayList(); /* * 1. SAM 실행 예제(File To File)에서 사용 할 Batch Job이 기술 된 xml파일 경로들((jobPaths) */ jobPaths.add("/egovframework/batch/job/delimitedToDelimitedJob.xml"); jobPaths.add("/egovframework/batch/job/fixedToFixedJob.xml"); /* * 2. SAM 실행 예제(File To DB)에서 사용 할 Batch Job이 기술 된 xml파일 경로들((jobPaths) */ jobPaths.add("/egovframework/batch/job/fixedToIbatisJob.xml"); jobPaths.add("/egovframework/batch/job/fixedToJdbcJob.xml"); /* * EgovSchedulerRunner에 contextPath, schedulerJobPath, jobPaths를 인수로 넘겨서 실행한다. * contextPath: Batch Job 실행에 필요한 context 정보가 기술된 xml파일 경로 * schedulerJobPath: Scheduler의 Trigger가 수행할 SchedulerJob(ex: QuartzJob)이 기술된 xml파일 경로 * jobPaths: Batch Job이 기술 된 xml 파일 경로들 * delayTime: Scheduler 실행을 위해 ApplicationContext를 종료를 지연시키는 시간(실행시간) * (기본 30000 milliseconds: 30초) */ EgovSchedulerRunner egovSchedulerRunner = new EgovSchedulerRunner( "/egovframework/batch/context-batch-scheduler.xml", "/egovframework/batch/context-scheduler-job.xml", jobPaths, 30000); egovSchedulerRunner.start(); } 실행된 Scheduler는 context-scheduler.xml에서 설정한 주기, 시간에 맞추어 jobDetail 클래스(EgovJobLauncherDetails)의 executeInternal() 메소드를 호출한다. 메소드 내의 동작은 아래와 같다. - jobDataMap에서 jobName, jobParameters(jobDataMap에 설정된 key중 jobName, jobLocator, jobLauncher를 제외한 나머지)를 분리한다. - 주기적으로 실행되는 Job의 Job Parameter 유일성을 보장하기 위해 Job Parameter의 timestamp 값을 갱신한다. - jobLauncher를 통해 Job을 실행한다. @SuppressWarnings("unchecked") protected void executeInternal(JobExecutionContext context) { Long timestamp = null; Map jobDataMap = context.getMergedJobDataMap(); String jobName = (String) jobDataMap.get(JOB_NAME); /* * 주기적으로 실행가능하도록 하기 위해, JobParamter의 timestamp 값을 갱신한다. */ if(jobDataMap.containsKey("timestamp")) { jobDataMap.remove("timestamp"); } timestamp = new Date().getTime(); jobDataMap.put("timestamp", timestamp); log.warn("Quartz trigger firing with Spring Batch jobName="+jobName); JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap); try { jobLauncher.run(jobLocator.getJob(jobName), jobParameters); } catch (JobExecutionException e) { log.error("Could not execute job.", e); } } === EgovSchedulerJobRunner 수행 === 메뉴 표시줄에서 **Run** > **Run** 을 선택한다. {{:egovframework:rte2:brte:batch_core:commandling4.png|}} ==== 결과확인 ==== Console 창에서 Scheduler가 생성되었고, Scheduler의 실행 시간이 30초 임을 확인한다. {{:egovframework:rte2:brte:batch_core:scheduler2_red.png|}} Scheduler가 매 10초 간격으로 jobDetail을 실행하여, Spring 배치 Job이 실행되었음을 확인한다. **11시 6분 50초** {{:egovframework:rte2:brte:batch_core:scheduler5_red.png|}} **11시 7분 00초** {{:egovframework:rte2:brte:batch_core:scheduler6_red.png|}} **11시 7분 10초** {{:egovframework:rte2:brte:batch_core:scheduler4_red.png|}} ===== 참고자료 =====