메뉴 건너띄기
상단메뉴 바로가기
본문 바로가기

이 누리집은 대한민국 공식 전자정부 누리집입니다.

본문 영역

적용 지원, FAQ, Q&A 게시판을 통해 기술 문제 해결을 지원합니다.

묻고 답하기

쿼츠실행시 오류질문이요..
  • 작성자

    박*혁

  • 작성일

    2013-08-22 14:36:11

  • 조회수

    3,975

  • 구분

    실행환경

  • 진행상태

    완료

질문

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
<property name="triggers">
<list>
<ref bean="UserTrigger" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">5</prop>
<prop key="org.quartz.threadPool.threadPriority">4</prop>
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean>
<bean id="UserTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="UserJob" />
<property name="cronExpression" value="0/10 * * * * ?" />
</bean>
<bean id="UserJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="egovframework.dctoday.admin.controller.QuartzController" />
</bean>

다음과같이 10초마다 돌수있게 설정해놓고


@Controller
public class QuartzController extends QuartzJobBean {

@Autowired
private EventQuartzService eventQuartzService;

@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
// TODO Auto-generated method stub
int a = new Date().getSeconds();
System.out.println(a);
try{
eventQuartzService.eventUpdate();
}catch(Exception e){
e.printStackTrace();
}
System.out.println("1");
}

}

다음과같이 컨트롤러에서 사용할수있게만들어놨습니다..

일반적으로 service serviceimpl을통해 아이바티스로 들어갈수있는

eventQuartzService.eventUpdate();

이 부분에서

java.lang.NullPointerException
at egovframework.dctoday.admin.controller.QuartzController.executeInternal(QuartzController.java:26)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)

자꾸 널포인트가떨어지는데 널포인트가 떨어지는 이유를 도무지 모르겠네요...

질문이좀 허접하긴한것같지만 남겨봅니다..

답변

안녕하세요. 박준혁님.

JobDetailBean을 통해 지정하신 jobClass의 경우는 일반적은 클래스로 동작하기 때문에 Spring의 DI(Dependency Injection)과 같은 기능을 사용하실 수 없습니다. 즉, @Autowired가 역할을 하지 못하기 때문에 대상 eventQuartzService가 null이기 때문에 NullPointerException가 발생합니다.

이 경우는 JobDetailBean가 아닌 MethodInvokingJobDetailFactoryBean를 다음과 같이 활용하셔야 합니다. (이 경우는 QuartzJobBean를 extends 하실 필요가 없기 때문에 Quartz에 대한 의존도도 낮추실 수 있습니다.)

<bean id="eventService"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="eventQuartzService" />
<property name="targetMethod" value="eventUpdate" />
<property name="concurrent" value="false" />
</bean>

보다 자세한 내용은 다음 가이드의 "MethodInvokingJobDetailFactoryBean" 부분을 참조하시면 되실 것 같습니다.

http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:fdl:scheduling

그럼, 즐거운 하루되십시오.
감사합니다.

이 페이지의 구성

묻고 답하기