[JAVA] struts에서 quartz.jar 를 이용한 스케줄러 구현하기

류명운

·

2017. 6. 14. 02:36

반응형

[JAVA] struts에서 quartz.jar 를 이용한 스케줄러 구현하기

Quartz Job Scheduling Library 란 무엇입니까?

Quartz는 최소한의 독립 실행 형 응용 프로그램에서부터 최대 전자 상거래 시스템에 이르기까지 거의 모든 Java 응용 프로그램에 통합 할 수 있는 풍부한 기능 의 오픈 소스 작업 스케줄 라이브러리입니다. Quartz는 수십, 수백 또는 심지어 수만 가지 작업을 실행하기위한 간단하거나 복잡한 일정을 만드는 데 사용할 수 있습니다. 작업이 표준 Java 구성 요소로 정의 된 작업은 실제로 프로그래밍 할 수있는 프로그램을 실행할 수 있습니다. Quartz Scheduler에는 JTA 트랜잭션 및 클러스터링과 같은 많은 엔터프라이즈 급 기능이 포함되어 있습니다. * Quartz는 Apache 2.0 라이선스 에 따라 자유롭게 사용할 수 있다.

목차

  1. Quartz Download
  2. Quartz Library 추가
  3. Quartz Servlet 설정 추가
  4. Quartz properties 파일 추가
  5. SchedulerInitializer Class 작성
  6. Job Class 작성
  7. 스케줄러 수행 일시 설정 관련(CronTrigger)

1. Quartz Download

Quartz 공식 홈페이지에서 사용할 버전의 패키지을 다운로드

2. Quartz Library 추가

위에서 다운로드 받은 Quartz 패키지의 압축을 풀면 많은 jar 파일들이 포함되어 있는데 이 중 메인 Quartz 라이브러리의 이름은 quartz-xxx.jar(xxx는 버전 번호)이다. Quartz의 기능을 사용하려면 이 메인 quartz-xxx.jar 파일을 어플리케이션의 class path에 위치시켜야 한다.

* Quartz의 모든 기능을 하용하려면 패키지의 'lib' 디렉토리 하위에 있는 모든 jar 파일들을 class path에 위치시켜야 한다.

3. Quartz Servlet 설정 추가(web.xml)

<!-- 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>/quart.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>2</load-on-startup>
</servlet>
<!-- //Quartz setting -->

<!-- Quartz run -->
<servlet>
  <servlet-name>SchedulerInit</servlet-name>
  <servlet-class>SchedulerInit</servlet-class>
  <load-on-startup>3</load-on-startup>
</servlet>
<!-- /Quartz run -->

<!-- Quartz run Servlet Mapping -->
<servlet-mapping>
  <servlet-name>SchedulerInit</servlet-name>
  <url-pattern>/SchedulerInit</url-pattern>
<servlet-mapping>
<!-- //Quartzrun  Servlet Mapping --> 

* 참고 : servlet은 최초 클라이언트로부터 요청이 들어올때 초기화 되는데 이를 방지하기 위해 사용하며 'load-on-startup'의 값이 0보다 크게 설정되면 서버가 시작될 때 servlet을 초기화 한다. (값은 우선순위를 뜻함, 모든 servlet의 'load-on-startup'의 값을 1로 하면 먼저 작성된 servlet부터 초기화 수행)

4. Quartz properties 파일 추가

Quartz는 quartz.properties라는 독창적인 속성 파일을 사용한다.  Quartz의 설정을 위해 일반적으로 StdSchedulerFactory 를 이용해 현재 작업 디렉토리의 'quartz.properties' 라는 특성 파일을 로드한다. (이때 로드가 실패하면 org.quartz 패키지에 있는 'quartz.properties' 파일을 로드한다) 이 파일 또한 Quartz Library와 같이 어플리케이션의 class path에 위치시켜야 한다. * ex) Quartz가 포함 된 웹 어플리케이션을 빌드하는 경우 quartz.properties 파일을 WEB-INF/classes 폴더에 위치하면 된다.


quartz.properties 기본 설정

// 스케줄러의 이름 설정
org.quartz.scheduler.instanceName = SchedulerInit
// 스레드 풀의 수 설정(최대 동시 작업을 실행할 수 있는 수)
org.quartz.threadPool.threadCount = 3
// 작업 및 트리거의 세부 정보 등 Quartz의 모든 데이터는 데이터베이스가 아닌 메모리에 보관
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

보다 세부적인 설정 방법은 여기를 참고하기 바란다.

5. Scheduler Class 작성

web.xml에서 설정한 SchedulerInit 클래스를 작성해보자

import javax.servlet.http.HttpServlet;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

public class SchedulerInit extends HttpServlet {

  private static final long serialVersionUID = 1L;
  private SchedulerFactory schedulerFactory;
  private Scheduler scheduler;

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

  public void init () {
    try {
      JobDetail job = new JobDetail("JobTest", Scheduler.DEFAULT_GROUP, quartzTestJob.class);
      CronTrigger trigger = new CronTrigger("JobTest", Scheduler.DEFAULT_GROUP, "5 * * * * ?");
      scheduler.scheduleJob(job, trigger);
      scheduler.start();
    } catch (Exception e) {
      e.printStackTrace();
    }
}

[Line 1~7] import 문 작성

[Line 9] HttpServlet 상속

[Line 11] 객체 직렬화 중 클래스 UID값이 변경되는 것을 방지하기 위해 seriaVersionUID 값을 명시적으로 선언

[Line 15~22] 스케줄러 인스턴스화

[Line 26] 작업 인스턴스 정의

[Line 27] 트리거 인스턴스 정의

[Line 28] 트리거를 사용하여 작업 예약

[Line 29] 스케줄러 시작


StdSchedulerFactory.getDefaultScheduler()를 사용하여 스케줄러를 획득하면 활성 스레드가 있기 때문에 scheduler.shutdown()을 호출 할 때까지 응용 프로그램이 종료되지 않습니다.

6. Job Class 작성

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

public class quartzTestJob implements Job {
  public void execute(JobExecutionContext context) {
    System.out.println("Job이 수행됨 - " + new Date(System.xurrentTimeMillis()) + " -");
  }
}

7. 스케줄러 수행 일시 설정 관련(CronTrigger)

  • 유닉스의 cron tab의 표현식과 거의 동일
  • 기본 표현식은 "초 분 시 일 월 요일 년도(옵션)" 으로 설정

상세 표현법 (Quartz API 2.2.1v - org.quartz.CronExpression)

 Field Name

 Allowed Values

 Allowed Special Characters

 Seconds

 0-59

 , - * /

 Minutes

 0-59

 , - * /

 Hours

 0-23

 , - * /

 Day-of-month

 1-31

 , - * ? / L W

 Month

 1-12 or JAN-DEC

 , - * ? /

 Day-of-Week

 1-7 or SUN-SAT

 , - * ? / L #

 Year (Optional)

 empty, 1970-2199

 , - * / 


특수문자 (Quartz API 2.2.1v - org.quartz.CronExpression)

  • [*] 모든 값을 의미 (ex - minutes 필드에 * 값을 설정하면 매분을 의미)
  • [?] 정의된 값이 없음을 의미 (Day-of-month, Day-of-week 둘 중 한 필드 이상에 무언가 설정할 때만 값을 부여하면 됨)
  • [-] 범위 지정 (ex - Hours 필드에 9-11로 셋팅되면 9시, 10시, 11시를 위미)
  • [/] 증가되는 값 지정 (ex - Seconds 필드에 3/13으로 셋팅되면 3초부터 매 13초를 의미. 즉, 3초, 16초, 29초...)
  • [L] 마지막을 의미 (해당 월의 마지막 또는 주의 마지막을 의미)
  • [W] 가장 가까운 주일을 의미 (ex: - Day-of-month 필드에 13W로 셋팅되면 해당달의 13일에서 가장 가까운 평일을 의미. 즉, 13일이 토요일이면 12일(금)날 스케줄러가 돌게됨)
  • [#] 해당 월의 몇 번째를 의미 (ex - 6#3으로 셋팅되면 해당 월의 세번째 금요일을 뜻함. 6이 요일을 뜻하고 3이 세번째를 뜻함. 하나의 값만 설정 가능)

참고

[1] http://www.quartz-scheduler.org/

[2] http://www.apache.org/licenses/LICENSE-2.0

[3] http://crontab.org/



반응형