레이블이 quartz인 게시물을 표시합니다. 모든 게시물 표시
레이블이 quartz인 게시물을 표시합니다. 모든 게시물 표시

2012-10-31

java] Quartz를 사용하여 동적으로 Job 등록하기




출처 : 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); 를 사용하여 스케쥴러에 등록해준다.
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