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