spring scheduler

Dasole Kwon·2023년 4월 25일
0

Linux crontab과 같은 scheduler를 Spring-boot에서 다뤄보자.
본 문서에서는 다음과 같은 job scheduler를 다룰 것이다.

  • Spring-boot Framework Scheduler
  • Quartz
  • Jenkins
    최종적으로 Jenkins Scheduler를 이용해 Spring-batch를 핸들링 할 것이다.

1. Spring-boot Framework 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);
    }
}

1.1 Enable Scheduling

  • Project Application에 @EnableScheduling추가
  • Shceduler를 사용할 class에 @Scheduled, @Component 추가
  • @Scheduled 규칙
    • Method는 void타입
    • Method는 매개변수 사용 불가

1.2 Create Job

주기적으로 실행 될 Job을 구현한다.

@Component
public class SpringFrameworkScheduler {
  
  @Scheduled(fixedDelay = 1000)
  public void printJob() {
    System.out.println(new Date());
  }
}
  • Scheduled(fixedDelay = 1000)
    • 1000ms 주기로 메소드를 반복한다.
    • fixedDelay 외에도 fixedRate, initialDelay, cron 등 다양한 옵션을 사용 할 수 있다.
  • 자주 쓰는 cron의 옵션:
    • (cron = "초 분 시 일 월 요일")
    • *: all
    • ?: none
    • m: array
    • a-b: a부터 b까지
    • a/b: a부터 b마다. a, a+b, a+b+b ...

1.3 Execute

./gradlew build -x test

java -jar ./build/libs/*.jar

1.4 Check


1000ms 주기로 출력 되는 것을 확인.

2. Quartz

자바로 개발 된 오픈소스 Job Scheduling 라이브러리로 보다 다양한 기능을 제공한다. 다만 완벽한 Cluster간 로드 분산은 안된다.

Quartz에서는 Job을 관리하기가 쉽지 않다.
흔히 알고 있는 CI Tool, Jenkins를 이용 할 것이다.

2.1 About Quartz

  • Job
    • execute 인터페이스를 제공한다.
    • 실제 작업을 execute메서드에 구현하면 된다.
    • JobDataMAp
      • Job 인스턴스가 실행 할 때 사용 할 수 있는 정보를 담을 수 있다.
    • JobDetail
      • Job을 실행시키기 위한 정보를 담고 있다.
      • JobDetail 정보를 기반으로 Trigger가 스케줄링 한다.
    • Trigger
      • Job을 실행 시킬 스케줄링 조건을 담고 있다.
      • SimpleTrigger, CronTrigger로 지정할 수 있다.
    • Misfire Instructions
      • 불발된 Trigger에 대한 policy를 지원한다.
  • Listener
    • JobListener
      • Job 실행 전/후
    • TriggerListener
      • Trigger 발생/불발/완료
  • JobStore
    • Job과 Trigger를 RAMJobStore

3. Jenkins

Jenkins를 통해 배치를 실행할 수 있다. 만일 Jenkins를 사용하고 있다면 배치 Jenkins와 배포 Jenkins를 분리하는 것을 추천.

3.1 Create docker-compose.yml

vim docker-compose.yml

version: '2'

networks:
  ci:

services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    # 원하는 경로에 volume 마운트
    volumes:
      - ~/jenkins/:/var/jenkins_home
    networks:
      - ci

3.2 Run Jenkins

docker-comopse up -d

# 확인
docker ps
docker logs -f jenkins

3.3. Init Jenkins

Jenkins를 올린 서버의 8080포트를 들어가서 pwd를 입력 해야 함.
초기 패스워드는 다음 경로에서 확인 가능하다.

# 1. docker log
docker logs -f jenkins

# 2. read password file
cat /var/jenkins_home/secrets/initialAdminPassword

패스워드를 입력하고 플러그인들을 다운 받고 다음단계에서 계정을 생성하면 Jenkins 초기 세팅이 완료된다.
향후 Jenkins에서 원하는 플러그인을 모두 받을 수 있다.

3.4 Create jar file

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가 주기적으로 실행시켜 줄 것이다.

3.5 Set the Schedule

이제 위에서 만든 jar를 Jenkins에서 스케줄링 하자.

3.5.1 Create item

3.5.2 Enter an item name

3.5.3. Move jar to Jenkins workspace

item을 만들면 workspace가 생성된다. 새로운 workspace에 jar를 옮기기 위한 작업이다.


저장을 한 후, Build Now를 통해 빌드를 해준다.

아래를 따라 들어가면 로그를 볼 수 있다.

Build History > #number > Console Output

로그에서 $PWD가 jenkins agent의 Workspace인 것을 알 수 있다.

실제 jenkins container나 volume mount 경로를 보면 확인 할 수 있다.

해당 경로에 jar파일을 옮긴다.

3.5.4. Set the schedule

이제 jar파일을 주기적으로 실행시켜주면 끝이다. 구성을 눌러 방금 생성한 item을 수정한다.

주기를 정해준다 (예:1분마다)

쉘 스크립트에 다음을 추가해준다.

java -jar demo-0.0.1-SNAPSHOT.jar

3.6 Check

이제 Jenkins가 1분마다 빌드를 하는 것을 볼 수 있다.

로그를 살펴보면 다음과 같다.

이제 spring batch를 Jenkins Scheduler로 핸들링 하는 작업을 할 수 있게 되었다.

https://velog.io/@rivernine/Spring-boot-Scheduler

0개의 댓글

관련 채용 정보