[Spring] Spring 3에서 작업 스케줄러(Task Scheduler) 메써드 구현하기

* 일반적으로 전산실 환경에서 주기적인 디비 백업이나 메일 발송 기능은 유닉스 또는 리눅스 상에서의 cron을 이용하여 쉘 스크립트를 실행하는 형태로 구현한다. 현재 Spring Web MVC 3를 기반으로 개발 중인 사내 웹 애플리케이션에도 이런 형태의 스케줄 작업을 구현할 필요가 생겼는데 웹 애플리케이션 내부에서 구현해보자는 생각에 Spring 3 환경에서 Task Scheduler 메써드를 구현하는 방법을 조사해봤다.


* Spring 3에서는 어노테이션 기반으로 cron만큼 편리하고 직관적인 작업 스케줄러 기능을 지원한다.


* 적용할 Spring Web MVC 3 프로젝트가 XML 기반의 ApplicationContext로 구성되었다는 가정 하에 아래와 같이 task.xml 파일을 작성한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns:task="http://www.springframework.org/schema/task" 

xsi:schemaLocation="

        http://www.springframework.org/schema/beans 

        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 

        http://www.springframework.org/schema/task 

        http://www.springframework.org/schema/task/spring-task-3.1.xsd">

<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" />

<task:executor id="taskExecutor" pool-size="1" />

<task:scheduler id="taskScheduler" />

</beans>


* DispatcherServlet 역할을 하는 XML 파일에 아래 내용을 추가한다.

<import resource="task.xml" />


* 작업 스케줄러 메써드를 구현하기 위한 모든 준비가 끝났다. 이제 구현할 메써드를 @Service 클래스에 작성하면 된다. 방법은 간단하다. 특정 주기로 실행될 메써드 앞에 @Scheduled 어노테이션을 작성하면 된다.

@Scheduled(cron = "* * 1 * * ?") // 매일 오전 1시에 실행한다.

public void doSomething() {

  // doSomething

}


* 아래와 같이 다양한 주기 설정이 가능하다.

@Scheduled(fixedDelay = 3600000) // 1000 * 60 * 60, 즉 1시간마다 실행한다.


<참고자료>

Scheduled Jobs in Spring 3 (by Matt Young)

http://www.vodori.com/blog/spring3scheduler.html


Spring Framework 3.2 Reference Documentation: 27. Task Execution and Scheduling

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html


저작자 표시 비영리 동일 조건 변경 허락
신고