출처 : http://zemba.tistory.com/53
Quartz는 작업을 일정 지정한 시간에 Class기능을 수행하도록 만드는 스케쥴러이다.
이를 위해서는 Schduler가 있어야 하며 또 수행할 작업들의 Class가 있어야 한다.
나는 Quartz를 사용하기 위해서 우선 다음과 같이 분류하였다.
분류
|
기능
|
Quartz Scheduler Main
|
실질적인 Scheduler가 Job을 수행시키는 Class
|
Quartz Job Class
|
수행할 작업의 내용이 담겨있는 Class
|
Quartz PropertyLoader
|
Properties에 Job정보를 Main Class에서 읽어 드리도록만든 Loader Class(정해진 규칙에 따라서 등록해야 함)
|
각 분류별 Class의 코드의 내용을 확인해보자.
1.Scheduler Class(THJobMain.class)
- Main에서는 Properties파일에서 등록한 Job내용을 읽어드려 수행하는 작업만 수행한다.
- Scheduler는 StdSchedulerFactory에 스케쥴생성을 통하여 스케쥴러를 시작할수 있다. 단순히 스케쥴러는 시작만한다.
- 스케쥴러 에서 Start후에는 스케쥴러에 등록된 Job Class가 동작하게 되는것이다.
- JobRegist에서 Job을 등록해준다.
- JobRegist에서는 CronTrigger를 사용하여 스케쥴에 등록하여준다.
- JobDetail은 "Name" , "Group" , "Class" 형태로 등록하고
CronTrigger는 "Name" , "Group" , "CronExpression"으로 등록한다.
- 해당 Job을 scheduler.scheduleJob(jobDetail, trigger); 를 사용하여 스케쥴러에 등록해준다.
1.Scheduler Class(THJobMain.class)
- Main에서는 Properties파일에서 등록한 Job내용을 읽어드려 수행하는 작업만 수행한다.
- Scheduler는 StdSchedulerFactory에 스케쥴생성을 통하여 스케쥴러를 시작할수 있다. 단순히 스케쥴러는 시작만한다.
- 스케쥴러 에서 Start후에는 스케쥴러에 등록된 Job Class가 동작하게 되는것이다.
- JobRegist에서 Job을 등록해준다.
- JobRegist에서는 CronTrigger를 사용하여 스케쥴에 등록하여준다.
- JobDetail은 "Name" , "Group" , "Class" 형태로 등록하고
CronTrigger는 "Name" , "Group" , "CronExpression"으로 등록한다.
- 해당 Job을 scheduler.scheduleJob(jobDetail, trigger); 를 사용하여 스케쥴러에 등록해준다.
package tahoe.core.job;import java.text.ParseException; import org.apache.log4j.PropertyConfigurator; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; public class THJobMain { private SchedulerFactory schedulFactoty = null; private Scheduler scheduler = null; private JobDetail jobDetail = null; private CronTrigger trigger = null; private String className = null; private String expression = null; THPropertyLoader ThProp = new THPropertyLoader(); public THJobMain() { JobInit(); } private void JobInit() { try { schedulFactoty = new StdSchedulerFactory(); scheduler = schedulFactoty.getScheduler(); scheduler.start(); JobRegist(); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void JobRegist() { String taskGroups = ThProp.read("TaskGroups"); String taskList = ThProp.read( taskGroups + ".TaskNames"); String[] arTaskGroups = taskList.split(","); for ( int i = 0; i < arTaskGroups.length; i++ ) { Class c = null; className = ThProp.read( arTaskGroups[i] + ".class" ); expression = ThProp.read( arTaskGroups[i] + ".Expression" ); try { c = Class.forName( className ); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } jobDetail = new JobDetail( arTaskGroups[i], arTaskGroups[i], c ); trigger = new CronTrigger( arTaskGroups[i], arTaskGroups[i] ); try { trigger.setCronExpression( expression ); scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( ParseException e2 ) { e2.printStackTrace(); } } } public static void main(String[] args) { PropertyConfigurator.configure("WEB-INF/conf/log4j.properties"); new THJobMain(); } } |
2.PropertyLoader Class(THPropertyLoader.class)
- Param으로 받은 string Value를 사용하여 Properties파일의 해당 내용을 찾는다.
- String으로 값을 Return해준다.
package tahoe.core.job import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class THPropertyLoader { public THPropertyLoader() {} /** * properties 파일 읽기 */ public String read(String propKey) { Properties pp = new Properties(); try { FileInputStream fis = new FileInputStream("WEB-INF/conf/quartz.properties"); pp.load(fis); } catch (IOException ioe) { ioe.printStackTrace(); System.exit(-1); } return pp.getProperty(propKey); } } |
3.Job Class(THJobTest1.class,THJobTest2.class,THJobTest3.class)
- 실재 스케쥴이 시작될때 작업을 해야할 기능이 있는 Class이다.
- Job Class는 Quartz의 Job class를 필수적으로 구현해서 사용해야한다.(implement Job)
- Job 수행은 execute를 통해서 실행된다.(로직을 사용시에 이부분에서 로직을 구현하면 된다.)
- Test를 위해 sysout메세지 출력으로 Test해본다.
public class THJobTest1 implements Job { public void execute(JobExecutionContext context) { System.out.println("Test Job1 = " + new Date()); } } |
public class THJobTest2 implements Job { public void execute(JobExecutionContext context) { System.out.println("Test Job2 = " + new Date()); } } |
public class THJobTest3 implements Job { public void execute(JobExecutionContext context) { System.out.println("Test Job3 = " + new Date()); } } |
이제 Properties파일에 설정한후 실행을 해보자.
현재 Property에 Expression 설정을 매 5초 마다 실행 하도록 설정하였다.
각각 등록후 에 Main에서 수행시킬 경우 다음과 같이 내용이 출력되었다.
이로써 Job Class를 작성한후 매번 Main에서 Job을 등록하지 않아도 Properties파일을 사용하여 작업스케쥴러를
등록하여 편리하게 사용할 수 있다.
[2010:06:15 11:06:58][INFO][org.quartz.simpl.SimpleThreadPool][0(ms)][Tahoe]-Job execution threads will use class loader of thread: main
[2010:06:15 11:06:58][INFO][org.quartz.core.SchedulerSignalerImpl][0(ms)][Tahoe]-Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[2010:06:15 11:06:58][INFO][org.quartz.core.QuartzScheduler][0(ms)][Tahoe]-Quartz Scheduler v.1.7.3 created.
[2010:06:15 11:06:58][DEBUG][org.quartz.utils.UpdateChecker][0(ms)][Tahoe]-Checking for update...
[2010:06:15 11:06:58][INFO][org.quartz.simpl.RAMJobStore][0(ms)][Tahoe]-RAMJobStore initialized.
[2010:06:15 11:06:58][INFO][org.quartz.impl.StdSchedulerFactory][0(ms)][Tahoe]-Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
[2010:06:15 11:06:58][INFO][org.quartz.impl.StdSchedulerFactory][0(ms)][Tahoe]-Quartz scheduler version: 1.7.3
[2010:06:15 11:06:58][INFO][org.quartz.core.QuartzScheduler][0(ms)][Tahoe]-Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[2010:07:15 11:07:00][DEBUG][org.quartz.simpl.SimpleJobFactory][0(ms)][Tahoe]-Producing instance of Job 'THJobTest1.THJobTest1', class=tahoe.core.job.THJobTest1
[2010:07:15 11:07:00][DEBUG][org.quartz.core.JobRunShell][0(ms)][Tahoe]-Calling execute on job THJobTest1.THJobTest1
[2010:07:15 11:07:00][DEBUG][org.quartz.simpl.SimpleJobFactory][0(ms)][Tahoe]-Producing instance of Job 'THJobTest2.THJobTest2', class=tahoe.core.job.THJobTest2
[2010:07:15 11:07:00][DEBUG][org.quartz.core.JobRunShell][0(ms)][Tahoe]-Calling execute on job THJobTest2.THJobTest2
[2010:07:15 11:07:00][DEBUG][org.quartz.simpl.SimpleJobFactory][0(ms)][Tahoe]-Producing instance of Job 'THJobTest3.THJobTest3', class=tahoe.core.job.THJobTest3
[2010:07:15 11:07:00][DEBUG][org.quartz.core.JobRunShell][0(ms)][Tahoe]-Calling execute on job THJobTest3.THJobTest3
Test Job3 = Mon Mar 15 11:07:00 KST 2010
Test Job1 = Mon Mar 15 11:07:00 KST 2010
Test Job2 = Mon Mar 15 11:07:00 KST 2010[2010:07:15 11:07:01][DEBUG][org.quartz.utils.UpdateChecker][0(ms)][Tahoe]-No update found.
[2010:07:15 11:07:05][DEBUG][org.quartz.simpl.SimpleJobFactory][0(ms)][Tahoe]-Producing instance of Job 'THJobTest1.THJobTest1', class=tahoe.core.job.THJobTest1
[2010:07:15 11:07:05][DEBUG][org.quartz.core.JobRunShell][0(ms)][Tahoe]-Calling execute on job THJobTest1.THJobTest1
Test Job1 = Mon Mar 15 11:07:05 KST 2010
[2010:07:15 11:07:05][DEBUG][org.quartz.simpl.SimpleJobFactory][0(ms)][Tahoe]-Producing instance of Job 'THJobTest2.THJobTest2', class=tahoe.core.job.THJobTest2
[2010:07:15 11:07:05][DEBUG][org.quartz.core.JobRunShell][0(ms)][Tahoe]-Calling execute on job THJobTest2.THJobTest2
Test Job2 = Mon Mar 15 11:07:05 KST 2010
[2010:07:15 11:07:05][DEBUG][org.quartz.simpl.SimpleJobFactory][0(ms)][Tahoe]-Producing instance of Job 'THJobTest3.THJobTest3', class=tahoe.core.job.THJobTest3
[2010:07:15 11:07:05][DEBUG][org.quartz.core.JobRunShell][0(ms)][Tahoe]-Calling execute on job THJobTest3.THJobTest3
Test Job3 = Mon Mar 15 11:07:05 KST 2010