최신 게시글(JAVA)
2018.06.29 / 21:54

스케쥴러 구현

aichatbot
추천 수 33

http://okjsp.pe.kr/bbs?act=VIEW&seq=62106&bbs=bbs3&keyfield=content&keyword=timer&pg=

간단한 Sample을 보여드립니다. 
프로퍼티 파일을 이용하면 동적으로 Class를 Load할 수 있죠. 
또한 Quartz Sample을 보시면 Crontime까지 실행 도중에 변경가능합니다. 또한 같은 스케쥴 시간을 갖고 있는 Job은 여러개 동시에 등록 가능합니다. 
Quartz의 Sample중 InterruptableJobTest을 보시면 실행중인 Job을 찾아서 Delete 시키는 방법도 있으므로, 이런 기능들을 잘 섞어서 쓰시면 가능할 것 같은데요. 
------------------- 
import java.text.ParseException; 
  
import org.apache.log4j.Logger; 
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; 
  
import com.util.Config; 
  
/** 
 * project.properties에 설정된 내용을 이용하여 정해진 시간마다 등록된 Thread를 실행하기 위한 Main Program 
 */ 
  
/** 
 *  
 */ 
public class QuartzSample { 
    static Logger logger = Logger.getLogger( Np2RawDataSyncTimerMain.class ); 
  
    public static void main(String [] args) 
    { 
       // Sample.properties 를 읽어 원하는 내용을 찾아주는 Class 
        Config cf = new Config(); 
  
        // TaskGroups을 구한다. 
        // White space로 구분한다. 
        String [] taskGroups = cf.getConfig( "TaskGroups" ).split( "\\s" ); 
  
        SchedulerFactory schFact = null; 
        Scheduler scheduler = null; 
  
        JobDetail jobDetail = null; 
        CronTrigger trigger = null; 
        String className = null; 
  
        try 
        { 
            // Schedule 처리를 위한 SchedulerFactory 생성 
            schFact = new StdSchedulerFactory(); 
            scheduler = schFact.getScheduler(); 
            scheduler.start(); 
  
            for ( int i = 0; i < taskGroups.length; i++ ) 
            { 
                String scheduleTime = cf.getConfig( taskGroups[i] + ".ScheduleTime" ); 
                String [] tackName = cf.getConfig( taskGroups[i] + ".TaskNames" ).split( "\\s" ); 
  
                for ( int j = 0; j < tackName.length; j++ ) 
                { 
                    Class c = null; 
                    className = cf.getConfig( tackName[j] + ".ClassName" ); 
  
                    logger.debug( tackName[j] + ".ClassName : " + className ); 
  
                    // 실행될 Class를 Load한다. 
                    c = Class.forName( className ); 
  
                    jobDetail = new JobDetail( tackName[j], taskGroups[i], c ); 
  
                    trigger = new CronTrigger( tackName[j], taskGroups[i] ); 
                    try 
                    { 
                        trigger.setCronExpression( scheduleTime ); 
                    } 
                    catch ( ParseException e2 ) 
                    { 
                        logger.error( "CronTrigger ParseException : " + tackName[j] + ".ClassName : " + className ); 
                        logger.error( "CronTrigger ParseException : " + scheduleTime ); 
                        e2.printStackTrace(); 
                    } 
  
                    // Config에서 읽은 공통 사항을 Job에 전달하기 위해 저장한다. 
                    jobDetail.getJobDataMap().put( "web.driver", webDriver ); 
                    jobDetail.getJobDataMap().put( "web_db.url", webURL ); 
                    jobDetail.getJobDataMap().put( "web_db.username", username ); 
                    jobDetail.getJobDataMap().put( "web_db.password", password ); 
  
                    try 
                    { 
                        scheduler.scheduleJob( jobDetail, trigger ); 
                    } 
                    catch ( SchedulerException e1 ) 
                    { 
                        logger.error( "SchedulerException : " + tackName[j] + ".ClassName : " + className ); 
                        e1.printStackTrace(); 
                    } 
                } 
            } // for 
  
        } 
        catch ( ClassNotFoundException e ) 
        { 
            logger.error( "ClassNotFoundException : " + className ); 
            e.printStackTrace(); 
        } 
        catch ( SchedulerException e ) 
        { 
            logger.error( "SchedulerException : Scheduler could not execute!!" ); 
            e.printStackTrace(); 
        } 
  
    } 
  

--------------------------- 
Sample.properties 파일의 설정내용 
  
TaskGroups = RawDataSyncGroup 
  

# RowDataSync Group 설정 
# 매일 5분 마다 실행 
RawDataSyncGroup.ScheduleTime = 0 0/5 * * * ? 
RawDataSyncGroup.TaskNames = RawDataSync_1 RawDataSync_2 
  
# 실행될 Task의 Full Package 이름을 설정 
RawDataSync_1.ClassName = com.kt.np2.biz.sync.RawDataSync_1 
RawDataSync_2.ClassName = com.kt.np2.biz.sync.RawDataSync_2