'Quartz'에 해당되는 글 1건

  1. 2010.01.11 Quartz의 CronTrigger를 이용한 스케줄링
Dev Note/Java2010. 1. 11. 15:21

유닉스 또는 리눅스를 사용해 본 사용자라면 cron을 잘 알고 있을 것이다.
cron에 실행할 명령문과 주기를 등록해 놓으면 해당 주기마다 등록해 놓은 명령문을 자동으로 실행해주는 데몬이다.

자바에서 비슷한 기능을 제공하는 Timer가 존재하지만 좀더 세부적인 스케줄링 기능이 필요할 때 Quartz를 사용하면 cron과 같이 쉽게 구현이 가능하다.

먼저 아래의 사이트에서 필요한 라이브러리들을 다운 받는다.
Quartz 배포 사이트 : http://www.quartz-scheduler.org/
Apache Commons Collections : http://commons.apache.org/collections/
Apache Commons Logging : http://commons.apache.org/logging/
Apache Log4j : http://logging.apache.org/log4j/1.2/index.html

예제로 할 프로그램은 두개의 Job이 있으면 각각 다른 주기로 스케줄링하여 실행하게 된다.
첫번째 Job은 일반적으로 실행되는 Job이며, 두번째 Job은 실행 된 후 70초 후 종료되는 Job이다.

Job으로 사용할 클래스는 반드시 org.quartz.Job 인터페이스를 구현해야 한다.

[ Job Sample Code ]
package ukzzang.sample.quartz;

import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SampleJob implements Job {
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        StringBuilder trace = new StringBuilder();
            trace.append("SampleJob is execute :: ").append(new Date());
            System.out.println(trace.toString());
    }
}

package ukzzang.sample.quartz;

import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class DelaySampleJob implements Job {
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        StringBuilder trace = new StringBuilder();
        trace.append("DelaySampleJob is execute :: ").append(new Date());

        System.out.println(trace.toString());

        try {
            Thread.sleep(70000);
        } catch (Exception e) { }

        trace = new StringBuilder();
        trace.append("DelaySampleJob is execute end :: ").append(new Date());

        System.out.println(trace.toString());
    }
}

아래는 위의 두개의 job을 스케줄러에 등록해 주는 소스이다.
스케줄러를 생성하고, SampleJob을 매분 0초에 실행하며, DelaySampleJob은 매분 20초에 실행하게 된다.

[ Scheduler Sample Code ]
package ukzzang.sample.quartz;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

public class SampleCronTrigger {
    private SchedulerFactory schedulerFactory = null;
    private Scheduler scheduler = null;

    public SampleCronTrigger() {
        try {
            schedulerFactory = new StdSchedulerFactory();
            scheduler = schedulerFactory.getScheduler();
          } catch (Exception e) {
               e.printStackTrace();
        }
    }

    public void start() {
        try {
            JobDetail job1 = new JobDetail("job1", "group1", SampleJob.class);
            CronTrigger trigger1 = new CronTrigger("trigger1", "group1", "0 * * * * ?");   
            scheduler.scheduleJob(job1, trigger1);
   
            JobDetail job2 = new JobDetail("job2", "group2", DelaySampleJob.class);
            CronTrigger trigger2 = new CronTrigger("trigger2", "group2", "20 * * * * ?");   
            scheduler.scheduleJob(job2, trigger2);
   
            scheduler.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SampleCronTrigger trigger = new SampleCronTrigger();
        trigger.start();
    }
}

위의 예제 코드를 실행하게 되면 아래와 같은 결과가 나오게 된다.

[ Execute Result ]
SampleJob is execute :: Mon Jan 11 10:24:00 KST 2010
DelaySampleJob is execute :: Mon Jan 11 10:24:20 KST 2010
SampleJob is execute :: Mon Jan 11 10:25:00 KST 2010
DelaySampleJob is execute :: Mon Jan 11 10:25:20 KST 2010
DelaySampleJob is execute end :: Mon Jan 11 10:25:30 KST 2010
SampleJob is execute :: Mon Jan 11 10:26:00 KST 2010
DelaySampleJob is execute :: Mon Jan 11 10:26:20 KST 2010
DelaySampleJob is execute end :: Mon Jan 11 10:26:30 KST 2010

참고로 아래 표는 CronTrigger에 작업주기를 설정하는 식을 예로 보여준다.

설정식

설정 의미

"0 0 12 * * ?"

매일 12(정오)에실행

"0 15 10 ? * *"

매일 오전 1015분에 실행

"0 15 10 * * ?"

매일 오전 1015분에 실행

"0 15 10 * * ? *"

매일 오전 1015분에 실행

"0 15 10 * * ? 2005"

2005년의 매일 오전 1015분에 실행

"0 * 14 * * ?"

매일 오후 2시부터 오후 259분까지 매분마다 실행

"0 0/5 14 * * ?"

매일 오후 2시부터 오후 255분까지 매5분마다 실행

"0 0/5 14,18 * * ?"

매일 오후 2시부터 오후 255분까지 매5분마다 실행 그리고

매일 오후 6시부터 오후 655분까지 매5분마다 실행

"0 0-5 14 * * ?"

매일 오후 2시부터 오후 205분까지 매분마다 실행

"0 10,44 14 ? 3 WED"

3월의 매주 수요일 오후 210분과 오후 244분에 실행

"0 15 10 ? * MON-FRI"

매주 월, , , , 금요일 오전 1015분에 실행

"0 15 10 15 * ?"

매월 15일 오전 1015분에 실행

"0 15 10 L * ?"

매월 마지막날 오전 1015분에 실행

"0 15 10 ? * 6L"

매월 마지막 금요일 오전 1015분에 실행

"0 15 10 ? * 6L 2002-2005"

2002년부터 2005년까지의 매월 마지막 금요일 오전 1015분에 실행

"0 15 10 ? * 6#3"

매월 세번째 금요일 오전 1015분에 실행


Posted by as.wind.914