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()));
}
}
'Spring' 카테고리의 다른 글
Spring Boot에서 "org.hamcrest.Matchers"'s signer information 에러처리 (0) | 2019.10.08 |
---|