Recent Posts
Recent Comments
Link
11-21 14:38
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

Spring 3 Quartz 1.8.6 스케줄링 본문

DEV&OPS/Java

Spring 3 Quartz 1.8.6 스케줄링

ALEPH.GEM 2021. 8. 30. 10:23

Quartz 1.8.6

Spring3.X 프로젝트에서는 Quartz 2.X 이상을 지원하지 않아서 보통 Quartz 1.8.6을 많이 사용합니다.

http://www.quartz-scheduler.org/downloads/

 

Downloads

 

www.quartz-scheduler.org

 

Maven pom.xml

<dependencies>
    <!-- Spring 3 dependencies -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency> 
    <!-- QuartzJobBean in spring-context-support.jar -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency>
    <!-- Spring + Quartz need transaction -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency>
    <!-- Quartz framework -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>1.8.6</version>
    </dependency>
</dependencies>

Spring 3.X 에서 quartz를 사용하기 위해 1.8.6 버전으로 사용합니다.

 

컴포넌트 설명

Job : 비지니스 로직이 들어갈 컴포넌트. 실제 해당 시간에 수행할 작업들을 구현합니다.

JobDetailBean : Job의 속성 정보, 작업을 정의한 클래스를 스케줄링에 등록하는 컴포넌트.

TriggerBean :  시간 주기를 설정하는 컴포넌트

SchedulerBean : Job 정보와 각종 속성들을 모아 Manager Thread를 생성하여 해당 시간에 Job을 실행하는 컴포넌트 

 

Quartz 설정 (applicationContext.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
		
		<!-- 실제 작업을 수행하는 클래스 등록 -->
		<bean id="processor" class="com.datastreams.gw.scheduler.daily.Processor" />
        
		<!-- 작업을 정의한 클래스(setter로 주입)를 등록  -->
		<bean name="runJob" class="org.springframework.scheduling.quartz.JobDetailBean">
			<!-- 작업을 정의 -->
			<property name="jobClass" value="com.datastreams.gw.scheduler.daily.RunJob" />
			<!-- 실제 스케줄링될 작업 -->
			<property name="jobDataAsMap">
				<map>
					<entry key="processor" value-ref="processor" />
				</map>
			</property>
		</bean>
        
		<!-- trigger: 작업 주기를 등록(cronExpression을 사용) -->
		<bean id="cronTriggerDaily" class="org.springframework.scheduling.quartz.CronTriggerBean">
			<property name="jobDetail" ref="runJob" />	<!-- 실행할 작업 -->
			<!-- 초 분 시 일 월 요일(1-7, 일요일부터) 연도(생략가능) -->
			<property name="cronExpression" value="0 10 10 ? * 2-6" /> <!-- 매주 월~금요일 10시 10분 0초 마다 실행 -->
		</bean>
        
		<!-- Scheduler : 스케줄 관리를 위해 작업과 트리거를 같이 등록-->
		<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
			<property name="jobDetails">
				<list>
					<ref bean="runJob" />
				</list>
			</property>
			<property name="triggers">
				<list>
					<ref bean="cronTriggerDaily" />
				</list>
			</property>
		</bean>	
</beans>

trigger를 사용할 때 simple trigger를 사용할 수도 있으나 정밀한 주기 설정을 위해서 cron trigger를 사용하는 것을 권장합니다.

 

CronExpression

자동 실행될 배치 주기를 기술하는 표현법으로 "초 분 시 일 월 요일 년도"  으로 표기합니다.

  • 년도는 생략가능합니다.
  • 요일을 기술하면 일(날짜)을 ? 처리 해야하고 일(날짜)를 기술하면 요일을 ? 으로 기술해야 해서 배타적입니다. 즉, 동시에 요일과 날짜를 기술할 수 없습니다. 요일과 날짜 중에서 둘 중 하나는 물음표 표기를 해야만 합니다.
  • * 기호는 전체 값을 기술합니다.
  • - 기호는 값의 범위를 지정합니다. 요일은 일요일(1)부터 토요일(7)까지 숫자로 표기할 수 있고 월요일부터 금요일이라면 2-6 으로 표기합니다. 일반적으로 리눅스 등에서 사용하는 cron expression은 0-6 이지만 quartz에서 사용하는 요일은 1-7 을 사용합니다.
  • / 기호는  (범위/숫자) 으로 표기하며 범위에 속한 값 중에서 숫자만큼의 간격으로 실행하게 해 줍니다. 만약 (*/10 * * * *) 이라면 10초 간격으로 반복 실행합니다.  
  • , (콤마) 기호는 값을 개별로 추가할 때 사용합니다. 중복해서 기술할 수 있습니다.
  • L 은 마지막을 뜻합니다.
  • W는 주중(weekday)을 뜻합니다.
  • #은 n번째를 의미합니다.

예제

0 0 12 * * ? 매일 12시(정오)
0 10 10 ? * * 매일 오전 10시 10분
0 15 10 * * ? 2021 2021년에 매일 아침 10시 15분
0 * 14 * * ? 매일 오후 2시 0분 ~ 59분
0 0/5 14,18 * * ? 매일 오후 2시부터 2시 55분까지 5분마다, 6시부터 6시 55분까지 5분마다
0 0-5 14 * * ? 매일 오후 2시부터 2시 5분까지 매분
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 2021-2022 2021년부터 2022년까지 매달 마지막 금요일 오전 10시 15분
0 15 10 ? * 6#3 매달 3번째 금요일 오전 10시 15분
0 0 12 1/5 * ? 매달 첫날부터 5일마다 12시(정오)

 

실제 작업을 수행할 클래스 Processor.java

public class Processor {
  //기본생성자
  public Processor() {		
  }
	
  //실제 배치 작업을 기술 한다. 실제 반복 실행할 메서드
  public void process() {
      System.out.println("배치 작업 실행!");
  }
}

 

스케줄러를 정의하는 클래스 RunJob.java

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

//QuartzJobBean을 상속받아서 스케줄러를 구현구현
public class RunJob extends QuartzJobBean {
	//실제 실행될 태스크 인스턴스
	private Processor processor;
	
	//setter방식으로 주입
	public void setProcessor(Processor processor) {
		this.processor = processor;
	}

	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
	//스캐줄러에서 실행을 원하는 메서드를 호출
		processor.process();		
	}
}

 

Main.java

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {        
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");    
    }
}

 

 

 

 

 

 

 

 

 

 

728x90