Linux crontab과 같은 scheduler를 Spring-boot에서 다뤄보자.
본 문서에서는 다음과 같은 job scheduler를 다룰 것이다.
Spring-boot 자체적으로 지원하는 Scheduler로 @EnableScheduling, @Scheduled만으로 간단하게 구현 가능하다. 간단한 Job Scheduling을 할 때 사용하면 좋다.
Scheduler란?
: 일정한 시간 간격 또는 일정한 시각에 특정 로직을 돌리기 위해서 사용하는 것을 scheduler라고 함.
Dependency
: Spring Boot starter에 기본적으로 의존 org.springframework.scheduling
@EnableScheduling
@SpringBootApplication
public class Application() {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
주기적으로 실행 될 Job을 구현한다.
@Component
public class SpringFrameworkScheduler {
@Scheduled(fixedDelay = 1000)
public void printJob() {
System.out.println(new Date());
}
}
./gradlew build -x test
java -jar ./build/libs/*.jar
1000ms 주기로 출력 되는 것을 확인.
자바로 개발 된 오픈소스 Job Scheduling 라이브러리로 보다 다양한 기능을 제공한다. 다만 완벽한 Cluster간 로드 분산은 안된다.
Quartz에서는 Job을 관리하기가 쉽지 않다.
흔히 알고 있는 CI Tool, Jenkins를 이용 할 것이다.
Jenkins를 통해 배치를 실행할 수 있다. 만일 Jenkins를 사용하고 있다면 배치 Jenkins와 배포 Jenkins를 분리하는 것을 추천.
vim docker-compose.yml
version: '2'
networks:
ci:
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins
# 원하는 경로에 volume 마운트
volumes:
- ~/jenkins/:/var/jenkins_home
networks:
- ci
docker-comopse up -d
# 확인
docker ps
docker logs -f jenkins
Jenkins를 올린 서버의 8080포트를 들어가서 pwd를 입력 해야 함.
초기 패스워드는 다음 경로에서 확인 가능하다.
# 1. docker log
docker logs -f jenkins
# 2. read password file
cat /var/jenkins_home/secrets/initialAdminPassword
패스워드를 입력하고 플러그인들을 다운 받고 다음단계에서 계정을 생성하면 Jenkins 초기 세팅이 완료된다.
향후 Jenkins에서 원하는 플러그인을 모두 받을 수 있다.
Jenkins가 구동되는 서버에 Spring-boot jar파일을 옮기는 작업이다.
Jenkins는 해당 jar파일을 설정된 주기로 실행 시켜주는 역할을 할 것이다. 아래는 spring batch의 jar파일을 다룬다.
모든 소스는 페이지 하단 링크에 있다.
Spring-boot 환경의 서버에서 jar를 만든 후 Jenkins 서버에 jar파일을 옮긴다.
##### Spring-boot Server #####
# 다음을 통해 Spring batch를 jar로 만든다.
./gradlew build
# Jenkins 서버에 jar파일을 복제한다.
scp ./build/libs/*.jar $USER@$JENKINS_SERVER:~
##### Jenkins Server #####
# Jar파일 실행
java -jar ~/*.jar
Jenkins서버에서 jar를 실행하면 다음과 같은 결과를 확인 할 수 있다.
simpleStep1이 실행된 것을 볼 수 있다.
이 작업을 Jenkins Scheduler가 주기적으로 실행시켜 줄 것이다.
이제 위에서 만든 jar를 Jenkins에서 스케줄링 하자.
item을 만들면 workspace가 생성된다. 새로운 workspace에 jar를 옮기기 위한 작업이다.
저장을 한 후, Build Now를 통해 빌드를 해준다.
아래를 따라 들어가면 로그를 볼 수 있다.
Build History > #number > Console Output
로그에서 $PWD가 jenkins agent의 Workspace인 것을 알 수 있다.
실제 jenkins container나 volume mount 경로를 보면 확인 할 수 있다.
해당 경로에 jar파일을 옮긴다.
이제 jar파일을 주기적으로 실행시켜주면 끝이다. 구성을 눌러 방금 생성한 item을 수정한다.
주기를 정해준다 (예:1분마다)
쉘 스크립트에 다음을 추가해준다.
java -jar demo-0.0.1-SNAPSHOT.jar
이제 Jenkins가 1분마다 빌드를 하는 것을 볼 수 있다.
로그를 살펴보면 다음과 같다.
이제 spring batch를 Jenkins Scheduler로 핸들링 하는 작업을 할 수 있게 되었다.