스프링-스케쥴러 사용법

이진우·2023년 7월 18일
0

스프링 학습

목록 보기
4/41

지정된 시간 혹은 간격마다 메서드가 실행되게 하려면

Quartz 혹은 스프링 스케줄러를 이용한다.

Quartz vs 스프링 스케줄러

찾아보니 Quartz는 더욱 복잡한 작업에 사용되고 스프링 스케줄러는 상대적으로 쉬운 작업에 사용된다고 한다.
여기서 더욱 복잡한 작업은 정교한 시간 설정 및 한 job이 다른 job에게 영향을 줄 수 있는 , 작업간의 복잡한 상황이 존재하는 경우를 의미한다.

사전 세팅

xml로 설정을 해주어도 되고 @EnableScheduling 을 사용하여도 된다. 여기서는 @EnableScheduling을 사용하겠다.주로 main을 실행하는 부분에 붙인다.
@SpringBootApplication
@EnableScheduling
public class PagingApplication {

	public static void main(String[] args) {
		SpringApplication.run(PagingApplication.class, args);
	}

}

참고로 @EnableScheduling이 없으면 @Scheduled를 사용해도 동작하지 않는다.

fixedDelay 사용

  • 이전 실행이 끝난 후에 지정된 시간(ms)만큼 지연 후 메서드를 실행
  • @Scheduled(fixedDelay = 5000)
        public void hello() throws InterruptedException{
            System.out.println("hello");
            Thread.sleep(5000);
        }

    이렇게 사용하면 hello를 출력->5초를 기다림->메서드가 끝났으므로 끝난기준으로 5초를 기다림 따라서 hello를 출력한지 10초가 지나면 출력함.

    fixedRate 사용

  • 이전 실행과 상관없이 지정된 시간(ms)마다 메서드를 실행
  • @Scheduled(fixedRate= 5000)
        public void hello() throws InterruptedException{
            System.out.println("hello");
            Thread.sleep(5000);
        }

    이렇게 사용하면 hello출력후 5초기다림->hello 출력 이런 식으로 된다.

    initialDelay 사용

  • 초기값을 먼저 기다린 후에 메서드가 실행된다.
  • @Scheduled(initialDelay = 5000,fixedRate= 5000)
        public void hello() throws InterruptedException{
            System.out.println("hello");
        }

    5초를 기다린 후->메서드 실행->5초를 기다린 후 ->메서드 실행을 반복한다.

    cron 사용

  • 특정시간에 원하는 메서드를 수행하고 싶다면 cron을 사용하여 처리
  • cron 기준 왼쪽부터 초 분 시간 일 월 요일을 의미한다.
  • @Scheduled(cron ="0 25 01 * * *")
        public void hello() throws InterruptedException{
            System.out.println("hello");
        }

    그렇기 때문에 위 코드는 1시 25분에 메서드가 실행이 된다.

    동기 비동기를 위한 예제

     @Scheduled(fixedRate= 5000)
        public void hello() throws InterruptedException{
            Thread.sleep(5000);
            System.out.println("hello");
            Thread.sleep(5000);
        }
        @Scheduled(fixedRate= 5000)
        public void hello2() throws InterruptedException{
            Thread.sleep(5000);
            System.out.println("hello2");
            Thread.sleep(5000);
        }

    이런 경우가 있다면 실행 결과가 어떻게 될까??
    hello와 hello2가 동시에 실행될까??

    그렇지 않다 실행결과를 보면

    위 메서드 기준 hello와 hello2가 번갈아서 10초를 간격으로 실행된다. 즉 한 메서드가 끝나야 다른 메서드가 실행된다는 것을 의미한다.
    동시에 다수의 작업을 효율적으로 처리하고 싶다면
    클래스에는 @EnableAsync를 붙여주고

    @EnableAsync
    public class MemberService {

    메서드에는 @Async를 붙여준다.

     @Scheduled(fixedRate= 5000)
        @Async
        public void hello() throws InterruptedException{
            Thread.sleep(5000);
            System.out.println("hello");
            Thread.sleep(5000);
        }
        @Scheduled(fixedRate= 5000)
        @Async
        public void hello2() throws InterruptedException{
            Thread.sleep(5000);
            System.out.println("hello2");
            Thread.sleep(5000);
        }

    그러면 hello와 hello2가 동시에 실행된다.

    profile
    기록을 통해 실력을 쌓아가자

    1개의 댓글

    comment-user-thumbnail
    2023년 7월 19일

    잘 읽었습니다. 좋은 정보 감사드립니다.

    답글 달기