유닉스 또는 리눅스를 사용해 본 사용자라면 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 ? * *" |
매일 오전 10시15분에 실행 |
"0 15 10 * * ?" |
매일 오전 10시15분에 실행 |
"0 15 10 * * ? *" |
매일 오전 10시15분에 실행 |
"0 15 10 * * ? 2005" |
2005년의 매일 오전 10시15분에 실행 |
"0 * 14 * * ?" |
매일 오후 2시부터 오후 2시59분까지 매분마다 실행 |
"0 0/5 14 * * ?" |
매일 오후 2시부터 오후 2시55분까지 매5분마다 실행 |
"0 0/5 14,18 * * ?" |
매일 오후 2시부터 오후 2시55분까지 매5분마다 실행 그리고 매일 오후 6시부터 오후 6시55분까지 매5분마다 실행 |
"0 0-5 14 * * ?" |
매일 오후 2시부터 오후 2시05분까지 매분마다 실행 |
"0 10,44 14 ? 3 WED" |
3월의 매주 수요일 오후 2시10분과 오후 2시44분에 실행 |
"0 15 10 ? * MON-FRI" |
매주 월, 화, 수, 목, 금요일 오전 10시15분에 실행 |
"0 15 10 15 * ?" |
매월 15일 오전 10시15분에 실행 |
"0 15 10 L * ?" |
매월 마지막날 오전 10시15분에 실행 |
"0 15 10 ? * 6L" |
매월 마지막 금요일 오전 10시15분에 실행 |
"0 15 10 ? * 6L 2002-2005" |
2002년부터 2005년까지의 매월 마지막 금요일 오전 10시15분에 실행 |
"0 15 10 ? * 6#3" |
매월 세번째 금요일 오전 10시15분에 실행 |