지난번에 spring quartz로 사용하지 않고 @scheduled 어노테이션만 사용하여 스케쥴링 프로세스를 구성하였더니 cron식을 동적으로 사용할 수 없었다.

그래서 이번엔 quartz를 사용하여 동적 스케쥴링을 구성해보았다.

 

구글링을 해보면 거의 대부분 spring 설정 xml파일에 quartz bean들을 추가하는 방식으로 설명이 되있고 회사에서 담담하고 있는 프로젝트 또한 그런 형태로 되어있다.

 

필자는 xml파일에 설정하는 것이 아닌 java단에서 스케쥴링 프로세스가 바로 실행될 수 있도록 구성해 보았다.(xml에 끄적이는 편을 선호하지 않음)

 

1. 필요 라이브러리

 

 - springframework-version : 3.3.1

 - java-version : open jdk 1.8

 - quartz  : 1.8.6(spring quartz를 사용하기 위한 라이브러리)

 - cglib : @configuration 사용 시 cglib exception발생 시 사용

<dependency> 	
	<groupId>org.quartz-scheduler</groupId> 	
    <artifactId>quartz</artifactId> 	
    <version>1.8.6</version> 
</dependency> 
<dependency>         
    <groupId>cglib</groupId> 	
    <artifactId>cglib</artifactId> 	
    <version>3.2.10</version> 
</dependency>

 

 

2. 소스 코드는 다음과 같다.

 

<SchedulExecuter.java>

package com.spring.test.util;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.stereotype.Component;
import com.spring.test.dao.NoticeDao;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class ScheldulExecuter {        
    
    //tomcat 구동 시 메소드가 자동 실행 되도록 하는 어노테이션 	
    @PostConstruct 	
    public void schedulerSet() throws Exception {
        //jobDetail 설정 		
        MethodInvokingJobDetailFactoryBean jobDetailBean = new MethodInvokingJobDetailFactoryBean(); 		
        jobDetailBean.setTargetObject(new ScheldulExecuter()); 		jobDetailBean.setTargetMethod("scheduledStart"); 		
        jobDetailBean.setGroup("test1"); 		
        jobDetailBean.setName("scheduledStart"); 	
        jobDetailBean.afterPropertiesSet(); 	
        
        //cronTriger 설정 		
        CronTriggerBean cronTrigger = new CronTriggerBean(); 		
        cronTrigger.setJobDetail((JobDetail)jobDetailBean.getObject()); 	
        cronTrigger.setCronExpression("0/5 * * * * ?"); 		
        cronTrigger.setName("scheduledStart"); 		
        Scheduler sch = new StdSchedulerFactory().getScheduler(); 	
        sch.scheduleJob((JobDetail)jobDetailBean.getObject(),cronTrigger); 		
        sch.start(); 	
    }  	
    
    public void scheduledStart() throws Exception{ 		
        logger.info("스케쥴 수행!!"); 	
    } 
}

소스는 간단하다. 

 - jobDetail

  TargetObject :  실행할 프로세스가 정의된 class 객체를 넣어준다.

  TargetMethod : 실행할 프로세스가 정의된 method 명을 넣어준다.

  Group : 스케쥴의 그룹 명칭을 정의한다.(보통 비슷한 스케쥴끼리 묶어서 정의함)

  Name : 스케쥴의 이름을 정의한다.(보통 실행되는 프로세스 명칭을 정의함, 본인은 TargetMethod와 동일하게 넣음)

  afterPropertiesSet : doc에는 bean 설정이 끝난 후 수행한다는 의미처럼 적혀있는 것 같다. 해당 설정을 안하면 scheduleJob에 jobDetailBean.getObject() 값에 null로 들어가 exception이 발생한다.

 

 - cronTrigger

   jobDetail : jobDetail 객체를 넣어준다.

   cronExpression : cron식을 넣어준다.

   name : 트리거의 이름을 정의한다.(jobDetail의 name과 동일하게 넣음)

 

jobDetail과 cronTrigger가 모두 정의 되면 schedulejob에 넣어준 후 start()메소드를 호출하면 된다.

 

<tomcat 구동 시 스케쥴이 실행됨을 확인, 본인은 데이터베이스 연결된 것 까지 확인하였다.>

 

이후에 SchedulExecuter에 dao단을 주입한 후 schedulerSet()메소드 안에서 쿼리를 수행하여 가져온 값을 핸들링 하여 setCronExpression값에 사용하면 되겠다.

'spring' 카테고리의 다른 글

spring 스케쥴링 설정  (0) 2019.02.12
view에서 특정 함수 반복 실행 방지  (0) 2019.02.12
spring mybatis 게시판  (1) 2019.02.12
spring mybatis 셋팅  (0) 2019.02.11

+ Recent posts