기본 콘텐츠로 건너뛰기

2022 08 26 회사 워크샵

quartz setting (servlet 이용)


quartz로 한참 삽질했다..
검색해보니 struts 이용, spring 이용해서 연결하는 방법밖에 없었다.
step by step으로 나온곳들도 한두개씩 빠져있었다.
우선.. 2.x 버젼과.. 1.x 버젼은 메소드 자체가 틀리다.
아래는 1.8 버젼을 기준으로 작성함.
라이브러리는 quartz-1.8.5.jar 파일과
이것이 돌기 위해 필요한 log4j-1.2.14.jar, slf4j-api-1.6.0.jar, slf4j-log4j12-1.6.0.jar 파일을 classpath에 추가해 준다.
다운로드 : http://www.quartz-scheduler.org/downloads

1. web.xml 세팅
  - 기본으로 start와 shutdown 시에 quartz동작에 대해 servlet으로 띄워준다. (quartz setting 부분)
  - 그다음 servlet으로 동작시킬 스케줄러를 띄운다. (quartz run 부분)
<!-- quartz setting -->
 <servlet>
  <servlet-name>QuartzInitializer</servlet-name>
  <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
  <init-param>
        <param-name>config-file</param-name>
        <param-value>/quartz.properties</param-value>
     </init-param>
     <init-param>
        <param-name>shutdown-on-unload</param-name>
        <param-value>true</param-value>
     </init-param>
     <init-param>
        <param-name>start-scheduler-on-load</param-name>
        <param-value>true</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
   </servlet>

   <!-- quartz run -->
    <servlet>
     <servlet-name>TestScheduler</servlet-name>
     <servlet-class>quartz.TestScheduler</servlet-class>
     <load-on-startup>2</load-on-startup>
 </servlet>

2. 위에서 잡아준 quartz.properties 내용
   - SimpleThreadPool 이걸 빼먹었더니.. 오류가 떴었다. ThreadPool 어쩌고.. quartz 사이트엔 안나와 있었는데..;;
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.threadPool.threadCount = 1
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

3. 위에서 잡아준 quartz.TestScheduler 구현내용
public class TestScheduler extends HttpServlet {
 private static final long serialVersionUID = -4013616887475315494L;
 private SchedulerFactory schedulerFactory;
 private Scheduler scheduler;
 public TestScheduler () {
  try {
   schedulerFactory  = new StdSchedulerFactory();
   scheduler    = schedulerFactory.getScheduler();
  } catch(Exception e) {
   e.printStackTrace();
  }
 }

 public void init() {
  try {
   JobDetail job1    = new JobDetail("job1", Scheduler.DEFAULT_GROUP, Job1.class);
   CronTrigger trigger1  = new CronTrigger("job1", Scheduler.DEFAULT_GROUP, "* * * * * ?");
   scheduler.scheduleJob(job1, trigger1);
   scheduler.start();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}


4. 실제 동작할 Job class
public class Job1 implements Job {
 public void execute(JobExecutionContext context) throws JobExecutionException {
  System.out.println("test print");
 }
}

주의 - package 는 맞춰서 잡아주고..  import도 알아서..


'*' (Wild-cards)
해당 필드의 모든 가능한 값을 의미한다. 그러므로 Month에서 *는 매달을 의미하게 되고 Day-of-week(요일)에서는 해당 주의 매일을 의미한다.

'/' : 값의 증가를 명시할 때 사용, 예를 들어, 분에서 '0/15' 라고 명시하면, 0분부터 시작해서 매 15초 라는 의미가 된다. 만약에 3/20라고 하면 매시간 3분부터 매 20분 간격으로 반영한다는 의미이다. 즉 3,23,43분에 적용된다는 것이다.

'?' : 날짜와 요일에 적용가능. 특정 값을 명시하지 않은 것

'L' : 날짜와 요일에 적용가능. Last를 줄인 말인데 각 필드에서 다른 의미로 사용된다. 날짜에서 L은 그달의 마지막을 의미하는 것으로 1월31일 2월28일 등이 될 수 있다. 요일에서 L은 7인 토요일이된다. 그러나 요일에서 다른 값 뒤에 L을 사용하면 그달의 마지막 해당요일이 된다. 그래서 6L이나 FRIL은 그달의 마지막 금요일이 된다. L을 사용할때는 값의 리스트나 범위를 명시하지 않는 것이 중요하다. 결과가 꼬일 것이다.

'W' : 주어진 날에 가장 가까운 평일을 명시한다. 예를 들어 날짜 필드에 15W라고 쓰면 그 달의 15일에서 가장 가까운 평일을 의미한다.

'#' : 그 달의 n번째 무슨 요일을 의미한다. 예를 들어 요일에 "6#3" 또는 "FRI#3"이라고 쓰면 그 달의 3번째 금요일이 된다.


2. CronTrigger의 표현식 :: 유닉스의 cron tab의 표현식과 거의 동일

- 기본표현식: "초 분 시 일 월 요일 년도(옵션)"

- 구체적 표현 : Quartz API 중 CronExpression 클래스에서 발췌
 FieldName
 Allowed Values
Allowed Sepecial Characters 
 remark
 Seconds 0-59  , - * /
 Minutes 0-59  , - * /
 Hours 0-23  , - * /
 Day-of-Month 1-31  , - * ? / LW
 L:월중 마지막일자
 W:작업요일(월-금)
 Month 1-12 or JAN-DEC  , - * /
 Day-of-Week 1-7 or SUN-SAT  , - * ? / L# #:"6#3" = 월중3째금요일
 Year(Optional) empty or 1970-2099  , - * /


- 특수문자
1. * : 모든값을 의미 (ex. minutes 필드에 * 로 셋팅되면 매분을 의미)
2. ? : 정의된값 없음
       (Day-of-month, Day-of-week 둘 중 한 필드 이상에 무언가 설정할 때만 셋팅해도 됨)
3. - : 범위 지정 (ex. Hours 필드에 10-12 로 셋팅되면 10시, 11시, 12시를 위미)
4. / : 증가되는 값 표현
      (ex. Seconds 필드에 5/15 로 셋팅되면 5초부터 매 15초를 의미한다. 즉, 5초, 20초, 35초, 50초)
5. L : Last 를 의미함 (해당월의 마지막 날 또는 주의 마지막->토요일이다.)
6. W : 가장 가까운 주일을 의미 (ex. Day-of-month 필드에 15W 로 셋팅되면 해당달의 15일에서 가장 가까운 평일을 의미. 즉, 15일이 토요일이면 14일(금)날 스케쥴러가 돌게된다.)
7. # : 해당월의 몇번째를 의미한다.
       (ex. 6#3으로 셋팅되면 해당월의 세번째 금요일을 뜻함. 6이 요일을 뜻하고 3이 세번째를 뜻한다.)
        주의: # 사용시는 Day-of-week 필드에 하나의 값만 설정할 수 있음.
                (즉, 3#1, 6#3 이렇게 셋팅될 수 없다.)

댓글