찾아보니 Quartz는 더욱 복잡한 작업에 사용되고 스프링 스케줄러는 상대적으로 쉬운 작업에 사용된다고 한다.
여기서 더욱 복잡한 작업은 정교한 시간 설정 및 한 job이 다른 job에게 영향을 줄 수 있는 , 작업간의 복잡한 상황이 존재하는 경우를 의미한다.
@SpringBootApplication
@EnableScheduling
public class PagingApplication {
public static void main(String[] args) {
SpringApplication.run(PagingApplication.class, args);
}
}
참고로 @EnableScheduling이 없으면 @Scheduled를 사용해도 동작하지 않는다.
@Scheduled(fixedDelay = 5000)
public void hello() throws InterruptedException{
System.out.println("hello");
Thread.sleep(5000);
}
이렇게 사용하면 hello를 출력->5초를 기다림->메서드가 끝났으므로 끝난기준으로 5초를 기다림 따라서 hello를 출력한지 10초가 지나면 출력함.
@Scheduled(fixedRate= 5000)
public void hello() throws InterruptedException{
System.out.println("hello");
Thread.sleep(5000);
}
이렇게 사용하면 hello출력후 5초기다림->hello 출력 이런 식으로 된다.
@Scheduled(initialDelay = 5000,fixedRate= 5000)
public void hello() throws InterruptedException{
System.out.println("hello");
}
5초를 기다린 후->메서드 실행->5초를 기다린 후 ->메서드 실행을 반복한다.
@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가 동시에 실행된다.
잘 읽었습니다. 좋은 정보 감사드립니다.