스케줄링이란 일정한 시간마다
특정한 업무를 수행하는 것이다. 오라클데이터베이스 같은 경우에는 dbms_job에서 지원하며
자바기반 환경에서는 quartz 를 많이 사용한다. 이번 예제에서는 Spring
Framework3.,2와 quartz 1.8.6에서 간단히 스케줄링을
구현했다
:namespace prefix = o ns =
"urn:schemas-microsoft-com:office:office" />
아래에서 태스크는
JOB에 기술되어 실행되는 일이다. JOB에 등록되는 것인데 헷갈리지
말자.
PSJ
Spring
Framework3.2에서 아직 Quartz2.0 이상은 지원하지 않는 것 같다.
다음 같은 오류 발생!!
class
org.springframework.scheduling.quartz.JobDetailBean has interface
org.quartz.JobDetail as super class
따라하기
1.
간단히 스프링 프로젝트 하나 생성하자.
2.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.samples</groupId>
<artifactId>springquarts</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!--
Generic properties -->
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--
Spring -->
<spring-framework.version>3.2.3.RELEASE</spring-framework.version>
<!--
Hibernate / JPA -->
<hibernate.version>4.2.1.Final</hibernate.version>
<!--
Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!--
Test -->
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<!--
QuartzJobBean in spring-context-support.jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!--
Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- spring quarts에서
transaction이
필요
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!--
Quartz framework -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.1.7</version>
</dependency>
<!--
Logging with SLF4J & LogBack -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<!--
Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!--
Test Artifacts -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.
이번에는 실제 스케줄링 되면서 실행될 클래스 태스크 클래스와 실행메소드를
만들자.
package
jobschedule.edu.onj;
/*
* 스케줄러에
걸어서
실행시킬
JOB
* 본
예제에서는
1초에
한번씩
실행됨
*/
public
class RunTask {
public
void
myWork() {
System.out.println("오라클자바커뮤니티
스프링
스케줄러");
}
}
4.
쿼츠에서 실행될 JOB을 정의하자.(JOB에 TASK를
정의한다.)
두가지 방법이
있는데,,, (본 예제에서는 두 방법 모두 기술하여 테스트)
- MethodInvokingJobDetailFactoryBean을 이용하는
간단방법
<bean
id="onjJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"
ref="runTask" />
<property name="targetMethod"
value="mywork" />
</bean>
- QuartzJobBean을 상속한 클래스를 만들고
XML에서 쿼츠 JOB을 정의하는 방법
package
jobschedule.edu.onj;
import
org.quartz.JobExecutionContext;
import
org.quartz.JobExecutionException;
import
org.springframework.scheduling.quartz.QuartzJobBean;
//QuartzJobBean은
복잡한
스케줄링에
적합한
유연한
스케줄러.
//상속받아서
스케줄러를
구현하자.
public
class
QuartzJob extends
QuartzJobBean {
//실제
실행될
태스크
private RunTask
runTask;
//실제
실행될
태스크를
setter 주입
받는다.
public
void
setRunTask(RunTask runTask) {
this.runTask =
runTask;
}
//실행을
원하는
메소드를
CALL한다.
protected
void
executeInternal(JobExecutionContext context) throws
JobExecutionException {
runTask.myWork();
}
}
XML에서 다음과 같이 정의하면 된다.(XML은 아래에서 한번에
정리)
<!--
실제스케줄링될 태스크(세터주입될)와
JOB을정의한
클래스등록 -->
<bean name="onjJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<!--
JOB을
정의
-->
<property name="jobClass" value="jobschedule.edu.onj.QuartzJob" />
<!--
실제스케줄링될
JOB-->
<property name="jobDataAsMap">
<map>
<entry key="runTask" value-ref="runTask" />
</map>
</property>
</bean>
5.
Trigger 기술(정의한 JOB을 어떤 주기로 실행할 것인지
정의)
이 또한 두 가지 방법이
있는데 SimpleTrigger와 cronTrigger가 있다. SimpleTrigger는 작업의 주기를
repeatInterval 속성으로 정의하는 반면 cronTrigger는
Unix의 CronTab 설정하듯이 한다.
- SimpleTrigger
<!--
Simple Trigger, run every 1 seconds -->
<bean id="onjTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!--
실행할 JOB
-->
<property name="jobDetail" ref="onjJob" />
<!--
1초에
한번씩
-->
<property name="repeatInterval" value="1000" />
<!--
최초
시작시 1초후에 start
-->
<property name="startDelay" value="1000" />
</bean>
- cronTrigger
<!--
유닉스의
cron tab처럼
설정,
1초마다
-->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="onjJob" />
<property name="cron__EXPRESSION__" value="0/1 * * * * ?" />
</bean>
6.
스케줄러 관리를 위한 Scheduler Factory를 정의
<!-- job 과
trigger 함께
기술
-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="onjJob" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="cronTrigger" /> <!--
cronTrigger로
바꿔보라
-->
</list>
</property>
</bean>
7.
완성된 XML(springquartz.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!--
실제
실행
될
태스크
-->
<bean id="runTask" class="jobschedule.edu.onj.RunTask" />
<!--
실제스케줄링될 태스크(세터주입될)와
JOB을정의한
클래스등록 -->
<bean name="onjJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<!--
JOB을
정의
-->
<property name="jobClass" value="jobschedule.edu.onj.QuartzJob" />
<!--
실제스케줄링될
JOB-->
<property name="jobDataAsMap">
<map>
<entry key="runTask" value-ref="runTask" />
</map>
</property>
</bean>
<!--
위에서
정의한
JobDetailBean을
이용하여
스케줄링되는
JOB을
등록하는
방법이외,JOB을
등록하는
다른
방법
MethodInvokingJobDetailFactoryBean을
이용하는
간단한
방법,
스케줄링될
클래스와
메소드
정의
<bean id="onjJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"
ref="runTask" />
<property name="targetMethod"
value="mywork" />
</bean>
-->
<!--
Simple Trigger, run every 1 seconds -->
<bean id="onjTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!--
실행할 JOB
-->
<property name="jobDetail" ref="onjJob" />
<!--
1초에
한번씩
-->
<property name="repeatInterval" value="1000" />
<!--
최초
시작시 1초후에 start
-->
<property name="startDelay" value="1000" />
</bean>
<!--
유닉스의
cron tab처럼
설정,
1초마다
-->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="onjJob" />
<property name="cron__EXPRESSION__" value="0/1 * * * * ?" />
</bean>
<!-- job 과
trigger 함께
기술
-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="onjJob" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="cronTrigger" /> <!--
cronTrigger로
바꿔보라
-->
</list>
</property>
</bean>
</beans>
8.
TEST를 위한 Client Program
package
jobschedule.edu.onj;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public
class
ScheuleMain {
public
static
void
main(String[] args) {
new
ClassPathXmlApplicationContext("springquartz.xml");
}
}
9.
결과
15:19:47.953
[main] INFO
org.quartz.core.QuartzScheduler - Scheduler
org.springframework.scheduling.quartz.SchedulerFactoryBean#0_$_NON_CLUSTERED
started.
15:19:48.718
[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-1] DEBUG
org.quartz.core.JobRunShell - Calling execute on job
DEFAULT.onjJob
오라클자바커뮤니티 스프링
스케줄러
15:19:48.937
[Timer-0] DEBUG org.quartz.utils.UpdateChecker - Checking for available updated
version of Quartz...
15:19:49.718
[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2] DEBUG
org.quartz.core.JobRunShell - Calling execute on job
DEFAULT.onjJob
오라클자바커뮤니티 스프링
스케줄러
15:19:50.718
[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-3] DEBUG
org.quartz.core.JobRunShell - Calling execute on job
DEFAULT.onjJob
오라클자바커뮤니티 스프링
스케줄러
15:19:51.718
[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-4] DEBUG
org.quartz.core.JobRunShell - Calling execute on job
DEFAULT.onjJob
오라클자바커뮤니티 스프링
스케줄러
15:19:52.718
[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-5] DEBUG
org.quartz.core.JobRunShell - Calling execute on job
DEFAULT.onjJob
오라클자바커뮤니티 스프링
스케줄러
15:19:53.718
[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] DEBUG
org.quartz.core.JobRunShell - Calling execute on job
DEFAULT.onjJob
오라클자바커뮤니티 스프링
스케줄러
15:19:54.718
[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-7] DEBUG
org.quartz.core.JobRunShell - Calling execute on job
DEFAULT.onjJob
오라클자바커뮤니티 스프링 스케줄러
[오프라인 개강예정강좌, 오프라인교육장에 오시면 보다 자세히 배울 수 있습니다.]
오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[12/09][기업100%환급]Spring Framework,MyBatis,Hibernate실무프로젝트과 정
[12/16][기업100%환급]PL/SQL,ORACLE HINT,TUNING
[12/16]웹퍼블리싱 마스터
[12/16]안드로이드개발자과정
[12/16]iPhone 하이브리드 앱 개발 실무과정
[12/23][기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
[01/06][기업100%환급]SQL기초에서 Schema Object까지
[평일야간]
[12/09]C#,ASP.NET마스터
[12/09]JAVA&WEB프레임워크실무과정
[12/10]Spring3.X, MyBatis, Hibernate실무과정
[12/10]SQL초보에서실전전문가까지
[12/16]자바초보에서안드로이드까지
[12/17]웹퍼블리싱 마스터
[12/23]iPhone하이브리드앱개발실무과정
[주말]
[12/14]Spring3.X,MyBatis,Hibernate실무과정
[12/14]SQL초보에서전문가까지
[12/14]웹퍼블리싱 마스터
[12/21]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
[12/21]자바초보에서안드로이드까지
[12/28]C#,ASP.NET마스터
오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[12/09][기업100%환급]Spring Framework,MyBatis,Hibernate실무프로젝트과 정
[12/16][기업100%환급]PL/SQL,ORACLE HINT,TUNING
[12/16]웹퍼블리싱 마스터
[12/16]안드로이드개발자과정
[12/16]iPhone 하이브리드 앱 개발 실무과정
[12/23][기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
[01/06][기업100%환급]SQL기초에서 Schema Object까지
[평일야간]
[12/09]C#,ASP.NET마스터
[12/09]JAVA&WEB프레임워크실무과정
[12/10]Spring3.X, MyBatis, Hibernate실무과정
[12/10]SQL초보에서실전전문가까지
[12/16]자바초보에서안드로이드까지
[12/17]웹퍼블리싱 마스터
[12/23]iPhone하이브리드앱개발실무과정
[주말]
[12/14]Spring3.X,MyBatis,Hibernate실무과정
[12/14]SQL초보에서전문가까지
[12/14]웹퍼블리싱 마스터
[12/21]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
[12/21]자바초보에서안드로이드까지
[12/28]C#,ASP.NET마스터
댓글 없음:
댓글 쓰기