JAVA] Quartz (쿼츠)를 사용하여 자바 스케줄링(scheduling) 하기

Quartz : http://www.opensymphony.com/

tutorial : http://quartz-scheduler.org/docs/tutorial/index.html

 

 

추가 Library 

 

 

참고 : http://blog.naver.com/kst7132?Redirect=Log&logNo=140101991602

         http://blog.naver.com/minis24?Redirect=Log&logNo=80105633208

 

스트러츠에서 Quartz 사용 : http://mygeni.tistory.com/79

스프링에서 Quartz 사용 : http://suya55.springnote.com/pages/1126992

 

 

CronTrigger 사용한 예제

 

 먼저 테스트로 사용할 Job 클래스 두개를 아래와 같이 만들어 준다.
Job으로 사용할 클래스는 반드시 org.quartz.Job 인터페이스를 구현하고
Job 인터페이스가 가지고 있는 public void execute(JobExecutionContext context) 메소드를 정의해 주어야 한다.

 

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

public class TestJob1 implements Job {
 public void execute(JobExecutionContext context) {
  System.out.println("TestJob1.execute() is Executed... : " + new Date());
 }
}
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;

public class TestJob2 implements Job {
 public void execute(JobExecutionContext context) {
  System.out.println("TestJob2.execute() is Executed... : " + new Date());
 }
}



위에서 만든 두개의 Job 클래스를 스케쥴에 등록해주는 소스이다.
생성자에 있는 코드를 보면 먼저 스케쥴을 생성하여 시작해준다.
그리고 TestJob1 클래스를 매분마다 00초에 실행하도록 스케쥴에 등록해주었다.
그러면 스케쥴은 정해진 주기에 따라 TestJob1 클래스에 있는 execute(JobExecutionContext context) 메소드를 실행해준다.
두번째 TestJob2 클래스는 매분마다 30초에 실행하도록 스케쥴에 등록해주었다.
import java.text.ParseException;
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 TestCronTrigger {
private SchedulerFactory schedFact;
private Scheduler sched;

public TestCronTrigger() {
  try {
   // 스케쥴 생성후 시작
   schedFact = new StdSchedulerFactory();
   sched = schedFact.getScheduler();
   sched.start();
  
   // Job1 생성 (Parameter : 1.Job Name, 2.Job Group Name, 3.Job Class)
   JobDetail job1 = new JobDetail("job1", "group1", TestJob1.class);

   // Trigger1 생성 (Parameter : 1.Trigger Name, 2.Trigger Group Name, 3.Cron Expression)
   CronTrigger trigger1 = new CronTrigger("trigger1", "group1", "0 * * * * ?");

   // 아래는 trigger 가 misfire 되었을 경우에 대한 처리를 설정한다.
   //trigger1.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
   sched.scheduleJob(job1, trigger1);
  
   // Job2 생성후 등록  
   JobDetail job2 = new JobDetail("job2", "group2", TestJob2.class);
   CronTrigger trigger2 = new CronTrigger("trigger2", "group2", "30 * * * * ?");
   sched.scheduleJob(job2, trigger2);

      // Job2 삭제 (30초 후)
   // Thread.sleep(30000);
   // sched.deleteJob("job2", "group2");
  } catch (SchedulerException e) {
   e.printStackTrace();
  } catch (ParseException e) {
   e.printStackTrace();
  }
}

public static void main(String[] args) {
  new TestCronTrigger();
}
}



위의 세 클래스를 만들고 실행해주면 아래와 같은 결과가 나온다.

 

TestJob1.execute() is Executed... : Tue Jun 16 19:09:00 KST 2009
TestJob2.execute() is Executed... : Tue Jun 16 19:09:30 KST 2009
TestJob1.execute() is Executed... : Tue Jun 16 19:10:00 KST 2009
TestJob2.execute() is Executed... : Tue Jun 16 19:10:30 KST 2009
TestJob1.execute() is Executed... : Tue Jun 16 19:11:00 KST 2009



참고로 아래의 표는 CronTrigger 에서 작업주기를 설정하는 식의 예와 설명이다.
순서

    1. Seconds (0-59) - * /

    2. Minutes (0-59)  - * /

    3. Hours (0-23)  - * /

    4. Day-of-month (1-31) - * ? / L W C

    5. Month (1-12 or JAN-DEC) - * /

    6. Day-of-week (1-7 or SUN-SAT) - * ? / L C #

    7. Year (optional, empty, 1970-2099) - * /

 

의미

"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분에 실행

 

 

 

 

 

SimpleTrigger을 사용한 예제

 

 

[ex : Job 구현 클래스]

 

 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;

 

 public class QuartzJob implements Job {

     @Override
     public void execute(JobExecutionContext arg0) throws JobExecutionException {
          System.out.println("쿼츠 잡스케줄 실행합니다.");
     }
}

 

 

 

[ex : 잡스케줄링]

 

 import java.util.Date;
 import org.quartz.JobDetail;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.SimpleTrigger;
 import org.quartz.Trigger;
 import org.quartz.impl.StdSchedulerFactory;

 

 public class QuartzScheduling {
     public static void main(String[] args) throws SchedulerException{
        

         // 실행할 준비가 된 Scheduler 인스턴스를 리턴한다.

         Scheduler scheduler = new StdSchedulerFactory().getScheduler();   
        

         // 쿼츠에서 Scheduler 는 시작,정지,일시정지를 할수 있다.

         // Scheduler 가 시작되지 않거나 일시 정지상태이면 Trigger 를 발동시키지 않으므로 start()해준다.

         scheduler.start();
  

         // JobDetail 인스턴스를 생성한다.

         JobDetail jobDetail = new JobDetail("QuartzJob",                                // 잡의 이름 ,이 잡을 가리키는 역할

                                                             Scheduler.DEFAULT_GROUP,       // 잡의 그룹이름

                                                             QuartzJob.class);                       // 특정 잡을 구현한 클래스
  
         // 트리거를 생성한다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

         Trigger trigger = new SimpleTrigger("simpleTrigger",                            //트리거 이름

                                                            Scheduler.DEFAULT_GROUP,        //그룹이름

                                                            new Date(),                                 //트리거의 시작일

                                                            null,                                            // 트리거의 종료일 null 이면 종료일 없음

                                                            SimpleTrigger.REPEAT_INDEFINITELY, //반복할 횟수 ,무제한으로 설정됨

                                                            3000);                                          //인터벌
        //실행 

        scheduler.scheduleJob( jobDetail , trigger );  
       }
}

 

 

 

 

 



추가로... J2EE환경에서 작동하게 하려면 다음과 같이 설정할 수 있다.

J2EE환경에서는 servlet으로 초기화 하는 부분을 작성하고 WAS시작시 해당 servlet을 호출하도록 설정(web.xml에서 설정)하면 서비스가 시작 되면서 스케쥴이 동작하게된다.

SimpleTrigger을 사용한 예제

 

 

[ex : Job 구현 클래스]

 

package com.servlet; 
import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;

 

 public class QuartzJob implements Job {

     @Override
     public void execute(JobExecutionContext arg0) throws JobExecutionException {
          System.out.println("쿼츠 잡스케줄 실행합니다.");
     }
}

 

 

 

[servlet으로 스케쥴 작성]
 

 

package com.servlet;
import java.util.Date;
 

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

 

import org.quartz.JobDetail;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.SimpleTrigger;

import org.quartz.Trigger;

import org.quartz.impl.StdSchedulerFactory;

 

import com.enrise.framework.log.Log;

 

public class QurtzSample extends HttpServlet {

      

       @Override

       public void init(ServletConfig cfg) throws ServletException {

             // TODO Auto-generated method stub

             super.init(cfg);

            

            

             try{

          //실행할 준비가 Scheduler 인스턴스를 리턴한다.

                    Scheduler scheduler = new StdSchedulerFactory().getScheduler();

                   

          // 쿼츠에서 Scheduler 시작, 정지, 일시정지할 있다.

          // Scheduler 시작되지 않았거나 일시 정지상태이면 Trigger

            발동시키지 않으므로 start()해준다.

          scheduler.start();

                   

          //JobDetail인스턴스를 생성한다.

                    JobDetail jobDetail = new JobDetail("QuartzJob",

                                        Scheduler.DEFAULT_GROUP,

                                                                                QuartzJob.class);

                   

          //트리거를 생성한다.

                    Trigger trigger = new SimpleTrigger("simpleTrigger", 
                                       
Scheduler.
DEFAULT_GROUP,

                                                                                new Date(),

                                                                                null,

                                        SimpleTrigger.REPEAT_INDEFINITELY,
                                       
3000);

           //실행

           scheduler.scheduleJob(jobDetail, trigger);

                   

                   

             }catch(SchedulerException se){

                    Log.debug.println(se.toString());

             }

      }

 

}

  
          



[web.xml에 내용추가]  - WAS 시작시 특정 서블릿 호출

 

 

  <servlet>      
          <servlet-name>QurtzSample</servlet-name>
          <servlet-class>com.servlet.QurtzSample</servlet-class>
          <init-param>
                <param-name>shutdown-on-unload</param-name>
                <param-value>true</param-value>
          </init-param>
          <load-on-startup>2</load-on-startup>
   </servlet>

 

 

 

 

 



출처: http://invincure.tistory.com/entry/Java-Quartz-쿼츠를-사용하여-자바-스케줄링scheduling-하기 [Do you want it? Come get it.]

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
106 Spring MVC Dropdown Box Example file 졸리운_곰 2018.03.26 214
105 SpringBoot JPA 예제 졸리운_곰 2018.03.13 344
104 스프링 CKEditor 적용 - 에디터 졸리운_곰 2018.03.07 2594
103 spring ckeditor 파일업로드 예제 (file upload) file 졸리운_곰 2018.03.07 2036
102 CKEditor 사용 및 파일 업로드 적용 졸리운_곰 2018.03.07 164
101 Spring MVC Checkbox And Checkboxes Example 자바 스프링 mvc 체크박스 샘플 file 졸리운_곰 2018.03.07 80
100 SPRING MVC - CHECKBOXES EXAMPLE 자바 스프링 mvc 체크박스 예제 file 졸리운_곰 2018.03.07 184
99 Spring MVC Dropdown Box Example 스프링 웹 개발 [콤보 선택 박스] file 졸리운_곰 2018.03.07 238
98 SPRING과 ANGULAR2 연동해서 실행하기 file 졸리운_곰 2018.02.12 198
97 두번째, 스프링 배치보다 간편한 스프링 Quartz 졸리운_곰 2018.02.08 118
96 첫번째, 스프링 배치보다 간편한 스프링 Quartz 졸리운_곰 2018.02.08 104
» JAVA] Quartz (쿼츠)를 사용하여 자바 스케줄링(scheduling) 하기 졸리운_곰 2018.02.08 628
94 Spring Batch를 이용한 기본적인 Batch Application 졸리운_곰 2018.02.08 81
93 Quartz + Spring Batch 조합하기 file 졸리운_곰 2018.02.08 2061
92 스프링 web MVC와 앵귤러의 통합 How to configure AngularJs with Spring MVC | SpringBoot file 졸리운_곰 2018.01.28 204
91 스프링 부트와 앵귤러의 통합 : Spring Boot and AngularJS Integration Tutorial file 졸리운_곰 2018.01.28 492
90 mybatis에서 selectKey 사용법 졸리운_곰 2018.01.24 391
89 Spring form:form 태그 설명 졸리운_곰 2018.01.24 180
88 java spring form 태그 졸리운_곰 2018.01.24 147
87 Spring MVC - 값 전달 file 졸리운_곰 2018.01.24 94
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED