뭐 오래전에 quartz를 한번 사용해봤었고.. 나름 편한듯 싶어.. 이번 프로젝트에서도 요넘을 사용하고자 프로토타입을 제작중.. 짜증나는 문제(??) 가 발생함..

Spring + quartz 를 사용하는데.. 요넘들을 같이 사용하면 어플 구동할때 처음에 무조건 실행하게 만드는게 쉽지 않음.. 뭐 다른 방법이 있는데 내가 찾지를 못하는 건지.. 찾다 귀찮아서 그냥 하나 제작함.

뭐.. 다행인건.. Job class 를 구동하는데.. 특별한 parameter가 필요하지 않기 때문에 좀더 쉽게 끝난듯..

MethodInvokingJobDetailFactoryBean.java
package com.quartz;

import java.lang.reflect.Method;

import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;

/**
 * 스케쥴러를 돌리고 싶고.. 무조건 어플이 처음 구동할 때.. 한번은 돌아줘야 하고..
 * 뭐 이런 경우가 가끔 생길지도 모른다.
 * 이럴때 도통 방법을 모르것더라.. 그래서 그냥 MethodInvokingJobDetailFactoryBean 이넘 상속받아서 하나 맹갔다.
 * 스프링 설정시 <property name="fisrtStart"><value>true</value></property> 만 넣어주면 됨.
 *
 * @author 배명훈
 *
 */
public class CtmMethodInvokingJobDetailFactoryBean extends MethodInvokingJobDetailFactoryBean {

    public void setFisrtStart(boolean fisrtStart) {
       
        if(fisrtStart) {
       
            try {
                // spring di로 삽입한 job object
                Class dymClass     = getTargetObject().getClass();            
                Method[] methods = dymClass.getMethods();
               
                for(int i = 0;i<methods.length;i++) {
                    String methodName = methods[i].getName();
                   
                    // spring di로 삽입한 target method를 찾자.
                    if(methodName.equals(getTargetMethod())) {
                        methods[i].invoke(getTargetObject(), null);
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }  
    }
}

Spring 설정파일
<bean id="weatherProcMethodInvokingJobDetail"
        class="com.quartz.CtmMethodInvokingJobDetailFactoryBean">
        <property name="targetObject"><ref bean="weatherProc"/></property>
        <property name="targetMethod"><value>execute</value></property>
        <property name="concurrent"><value>false</value></property>
        <property name="fisrtStart"><value>true</value></property>
</bean>

스프링 설정 파일을 보면 알것지만.. MethodInvokingJobDetailFactoryBean 을 사용하는 것과 차이점은
firstStart 설정하는 것 밖에 없음..

ps.
    java reflection 은 정말 유용한 기술인듯..
Posted by 짱가쟁이