현재 회사에서 사용하는 배치 프로그램들이 개발자마다 다른.. 방법으로.. 만들어져 있어서 이번에 개선을 하기로 했다.
Spring의 Spring Scheduler와 MyBatis로 일괄 적용을 하기로 했는데,
이왕 적용 하는김에 정리도 같이 해보려고 한다.
Spring Scheduler란?
Spring framework에서 제공하는 스케줄러
Spring3버전 이상의 환경에서 사용할 수 있다.
Spring Scheduler 적용
applicationContext.xml
Scheduler를 사용하기 위해 task를 추가해준다.
x
<beans ...
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
...
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd ">
...
<task:annotation-driven />
</beans>
<task:annotation-driven />
@Schedule
,@Async
어노테이션을 활성화시켜준다.xml이 아닌 java config를 사용한다면 아래와 같이 어노테이션으로 작성하면 된다.
xxxxxxxxxx
public class SpringConfig {
...
}
SpringBoot에서는 Application 클래스에 지정해주면 된다.
x
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Scheduler.java
x
public class Scheduler {
name = "service") (
private Service service;
fixedDelay = 10000) // 10초 주기로 스케줄 작업 실행 (
public void syncResult() {
service.syncResult();
}
cron = "0 5 * * * * ") // 매 시간 5분마다 실행한다. (
public void updateResult() {
service.updateResult();
}
}
@Scheduled
스케줄을 지정한다.
fixedDelay
- 마지막 실행이 종료되고 옵션값만큼의 시간을 대기한 후 다음 실행을 시작한다.
- 항상 하나의 작업 인스턴스가 실행되도록 할 때 유용하다.
- 단위는 millisecond
initialDelay
- fixedDelay와 함께 사용된다.
- 최초 Delay 시간을 지정하며, 이 후 작업은 fixedDelay에 따라 실행된다.
fixedRate
각 실행이 독립적으로 시작된다. (이전 작업의 실행을 확인하지 않는다.)
이전 실행의 시작시간으로부터 옵션값만큼 대기한 후 다음 실행을 시작한다.
단위는 millisecond
fixedRate 옵션을 사용해도 Spring Scheduler는 병렬 실행이 되지 않는 것이 기본이므로, 이전 실행이 끝날 때까지 다음 실행이 시작 되지는 않는다.
- 이전 작업이 빨리 완료되지 않으면 Out of Memory Exception이 발생할 수 있다.
- 병렬 실행을 하고싶으면
@Async
어노테이션을@Scheduled
어노테이션과 함께 사용하면 된다.
cron
- cron식을 사용해서 스케줄을 지정한다.
- cron식 사용법은 여기서
fixedDelayString
,fixedRateString
- 위에서는 모두 스케줄링 값을 하드코딩했는데, 설정파일 등에서 받아와 사용하게 할 수도 있다.
xxxxxxxxxx
fixedDelayString = "${schedule.sync.result.delay}") (
fixedRateString = "${schedule.sync.result.rate}") (
cron = "${schedule.sync.result.cron}") (
또는 xml 파일에서 지정할 수 있다.
xxxxxxxxxx
<!-- Configure the scheduler -->
<!-- pool-size default는 1이다. -->
<task:scheduler id="myScheduler" pool-size="3" />
<!-- Configure parameters -->
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="beanA" method="methodA"
fixed-delay="10000" initial-delay="1000" />
<task:scheduled ref="beanB" method="methodB"
fixed-rate="10000" />
<task:scheduled ref="beanC" method="methodC"
cron="*/10 * * * * *" />
</task:scheduled-tasks>
'공부 > web' 카테고리의 다른 글
[Spring] Http 요청 파라미터 Annotation (0) | 2019.12.20 |
---|---|
게시글 SNS로 공유 및 클립보드에 복사하기 (0) | 2018.09.16 |
[node.js] route에서 반복문(forEach 문)으로 만든 배열 rendering하기 (0) | 2018.09.05 |
[jQuery/datepicker] 특정일 비활성화(disabled) 하기 (0) | 2018.09.04 |
쿠키와 세션 (0) | 2018.07.20 |
댓글