2010. 7. 12. 13:43
뭐 오래전에 quartz를 한번 사용해봤었고.. 나름 편한듯 싶어.. 이번 프로젝트에서도 요넘을 사용하고자 프로토타입을 제작중..
짜증나는 문제(??) 가 발생함..
Spring + quartz 를 사용하는데.. 요넘들을 같이 사용하면 어플 구동할때 처음에 무조건 실행하게 만드는게 쉽지 않음.. 뭐 다른 방법이 있는데 내가 찾지를 못하는 건지.. 찾다 귀찮아서 그냥 하나 제작함.
뭐.. 다행인건.. Job class 를 구동하는데.. 특별한 parameter가 필요하지 않기 때문에 좀더 쉽게 끝난듯..
스프링 설정 파일을 보면 알것지만.. MethodInvokingJobDetailFactoryBean 을 사용하는 것과 차이점은
firstStart 설정하는 것 밖에 없음..
ps.
java reflection 은 정말 유용한 기술인듯..
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();
}
}
}
}
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>
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 은 정말 유용한 기술인듯..
'framework > spring' 카테고리의 다른 글
[Spring MVC] - @annotation 과 aspect를 활용한 파라미터 널 체크 (0) | 2012.05.14 |
---|---|
[quartz] - cronExpression 기간 설정 (0) | 2011.06.24 |
[problem] - web.xml 에 log4j 설정 (0) | 2011.01.28 |
[spring] - transactionManager example (0) | 2010.06.30 |