====== 배치 템플릿을 이용한 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|}}
===== 참고자료 =====