Spring2015. 8. 24. 14:23

Spring framework를 쓰기 위해 복잡한 설정을 할 필요없이 관례적으로 쓰는 기본 설정을 써서 바로 개발에 들어갈 수 있는 Spring Boot를 보다가 Task scheduler도 그대로 이용할 수 있지 않을까 해서 돌려봤습니다.


이제까지 XML 설정없이 annotation으로만 다른 기능들은 돌아갔기에 스케쥴링도 어노테이션만 추가해 보았습니다.


@Scheduled(fixedRate = 5000)


이거 하나만으로 돌아간다면 대박인데, 그렇게 쉽게는 안 돌아가더군요^^


메인 클래스에 @EnableScheduling 어노테이션 붙여줘야 스케쥴링 작동. 

* 참고사이트 : http://spring.io/guides/gs/scheduling-tasks/




@Component

public class ScheduledTasks {


     private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Scheduled(fixedRate = 5000)

public void reportCurrentTime(){

System.out.println("[fixedRate]The time is now " + dateFormat.format(new Date()));

}


}




그러던 스케쥴링 특성상 운영 초기에는 스케쥴링 시간 변경 빈도가 높을 수 있는데, 그때마다 빌드하면 불편한 점이 많습니다.


스케쥴링 시간 설정은 XML에서 하는 것이 변경이 용이하기에 스프링 부트에선 어떻게 XML로 따로 설정하는지 찾아봤습니다.


아래와 같이 @ImportResource 어노테이션 붙여주면 해당 파일에서 설정가능했습니다.




@SpringBootApplication

@EnableScheduling

@ImportResource("/tasks.xml")

public class Application {

public static void main(String[] args) throws Exception{

SpringApplication.run(Application.class, args);

}


}



tasks.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.xsd

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


<task:scheduled-tasks scheduler="myScheduler">

        <task:scheduled ref="myBean" method="reportCurrentTime" fixed-delay="5000" />

        <task:scheduled ref="myBean" method="reportCurrentTime2" cron="0 2 * * * *" />

    </task:scheduled-tasks>

 

    <task:scheduler id="myScheduler"/>

</beans>





스케쥴 설정의 reference를 연결하기 위해서 컴퍼넌트 이름 정해주고 @Scheduled 어노테이션을 제거하기만 하면 XML 설정대로 돌아갑니다.


@Component("myBean")

public class ScheduledTasks {


private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

public void reportCurrentTime(){

System.out.println("[fixedRate]The time is now " + dateFormat.format(new Date()));

}

public void reportCurrentTime2(){

System.out.println("[Cron]The time is now " + dateFormat.format(new Date()));

}

}









Posted by net4all