오늘은 프로그램이 특정 작업을 반복하는 배치(스케줄링)란 무엇인지 알아보고 간단한 예제를 통해 사용법을 알아본다.
회사에서 특정 시간마다 반복 작업으로 로그를 확인해서 로그에 이상이 있다면 Slack에 알림을 보내는 작업을 해야했다.
이렇게 되면 매 시간마다 로그를 확인하는 작업이 필요했고, 그 결과에 따라 알림 여부를 발송한다.
이러한 요구사항을 확인한 난 Spring Batch와 Quartz가 떠올랐다.
하지만 Spring Batch가 없어도 Quartz만으로 배치 모듈을 만들 수 있어서, Quartz만 쓰기로 했다.
참고 :
들어가기 전에 개발환경은 이러하다.
Java 11
Spring boot 2.5.3
gradle 7.1.1
implementation 'org.springframework.boot:spring-boot-starter-quartz'
build.gradle에 Quartz라이브러리를 사용하기 위해 추가한다.
그 다음,
메인 클래스에 @EnableScheduling어노테이션을 추가해준다.
이렇게 되면 기본적으로 Quartz를 사용하기 위한 준비는 모두 끝났다.
특정 작업을 반복적으로 실행할 테스트 메서드를 하나 준비한다.
메서드에 @Scheduled 어노테이션을 추가해주고, cron을 인자로 넣어주게되면,
리눅스에서 사용하는 크론탭과 동일한 표현식으로 메서드의 실행 시간을 정할 수 있다.
다만 차이가 있다면 크론탭은
분부터 시작하기 때문에 5개 항목만 입력하면 되지만,
쿼츠에선 초부터 시작하기 때문에 6개의 항목을 입력해서 정의해줘야한다.
예시에서 사용한
@Scheduled(cron = "* * * * * *")
의 경우 매 초마다 메서드가 실행된다.
실행해보기.
@Scheduled(cron = "* * * * * *")
public void testQuartz() {
LocalDateTime now = LocalDateTime.now();
System.out.println(now.getHour() + ":" + now.getMinute() + ":" + now.getSecond());
}
예제 메서드이다.
메서드가 실행될 때 마다, OS의 Time을 가져와서 출력한다.
위에서 언급한대로 1초마다 콘솔이 찍혀야한다.
잘 실행이 된 모습이다.
예제 2:)
@Scheduled(cron = "*/5 * * * * *")
public void testQuartz() {
LocalDateTime now = LocalDateTime.now();
System.out.println(now.getHour() + ":" + now.getMinute() + ":" + now.getSecond());
}
위 코드는 5초에 한번씩 실행하도록 만든 표현식이다.
5초가 지날 때 마다, 콘솔에 잘 찍히고 있는 모습이다.
이 처럼 기본적인 스케줄링을 위한 작업은 다 끝났다.
위 링크의 예제를 통해서 자신만의 크론 표현식을 만들어 특정 시간에 특정 작업을 하는 프로그램을 작성해보자.
'Java' 카테고리의 다른 글
Log4j 보안 이슈 (0) | 2021.12.13 |
---|---|
spring,java]JPA를 이용한 API서버 (0) | 2021.11.30 |
SpringBoot,React]스프링 실행시 리액트 서버 자동 실행 , 빌드시 같이 빌드하기 (0) | 2021.08.06 |
java,spring]twilio를 이용해서 전화솔루션 구축하기 (비상연락망) (4) | 2021.06.21 |
람다를 간단하게 써보자 (0) | 2021.06.13 |
댓글