삶 가운데 남긴 기록 AACII.TISTORY.COM
Spring 3 Quartz 1.8.6 스케줄링 본문
Quartz 1.8.6
Spring3.X 프로젝트에서는 Quartz 2.X 이상을 지원하지 않아서 보통 Quartz 1.8.6을 많이 사용합니다.
http://www.quartz-scheduler.org/downloads/
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");
}
}
'DEV&OPS > Java' 카테고리의 다른 글
Spring MVC legacy project maven tomcat oracle mybatis 설정 (0) | 2022.02.15 |
---|---|
Log4j 보안 취약점 대응(Log4Shell) 2021년 11월 24일 (0) | 2021.12.22 |
is exceeding the 65535 bytes limit (0) | 2021.08.18 |
ClassNotFoundException 과 NoClassDefFoundError (0) | 2021.08.05 |
Maven 자바 표준 빌드 도구 (0) | 2020.05.13 |