개인적으로 spring shceduler와 quartz shceduler가 같은건 줄 알았는데, 알고보니 다른거여서 다시 포스팅을 남긴다.
Spring scheduler
spring scheduler는 spring에서 built in 으로 제공한다. quartz보다 훨씬 간단하게 사용할 수 있다는 장점이 있다. 프로젝트가 복잡하지 않고 단순히 scheduling과 bean만 필요하다면 quartz보다 spring scheduler가 낫다.
메인메소드에 @EnabledScheduling을 달아주고,
@EnableScheduling
@SpringBootApplication
public class Application() {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
원하는 메소드에 @Scheduler를 달아서 사용한다.
이때 메소드는 void의 return타입이여야 하고, 파라메터를 가질 수 없다.
public class Scheculer() {
@Scheduled(fixedDelay = 1000) // scheduler 끝나는 시간 기준으로 1000 간격으로 실행
public void scheduleFixedDelayTask() {
System.out.println(
"Fixed delay task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedRate = 1000) // scheduler 시작하는 시간 기준으로 1000 간격으로 실행
public void scheduleFixedRateTask() {
System.out.println(
"Fixed rate task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(cron = "0 15 10 15 * ?") // cron에 따라 실행
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"schedule tasks using cron jobs - " + now);
}
@Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris") // cron에 TimeZone 설정 추가
}
Spring Quartz
quartz는 Job Scheduling 라이브러리다. 그냥 Spring에서는 configuration이 잔뜩 필요하지만, 아래와같은 starter 라이브러리가 있어서 auto configuration으로 사용 가능하다.
implementation "org.springframework.boot:spring-boot-starter-quartz"
quartz에는 Job, jobDetail, Trigger, JobListener, TriggerListener등이 있다.
Job은 실행할 프로세스를 말한다.
JobDetail은 Job에대한 구체적인 정보를 담는 instance이다.
Trigger는 Job의 실행조건이다.
JobListener는 프로세스가 실행될 때 타는 이벤트,
TirggerListener는 trigger가 실행도리 때 타는 이벤트를 말한다.
quartz에서는 job, jobDetail, trigger가 필수적이다.
Job을 만들고, Scheduler에 Job과 Job의 실행조건인 Trigger을 달아주면, 조건에 따라서 Job이 실행된다.
JobListener, TriggerListener를 달아서 Job또는 Trigger가 실행될때마다 특정 함수를 실행시킬 수도 있다.
아래와 같이 사용한다.
먼저 job을 만들어야 한다.
@Configuration
public class CollectJob implements Job {
private final CollectService collectService;
public CollectJob(CollectService collectService) {
this.collectService = collectService;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("[Collect] collect Job Start...");
}
}
job detail을 만든다.
@Bean
public JobDetail tistoryJobDetail() {
return JobBuilder.newJob().ofType(CollectJob.class)
.storeDurably()
.withIdentity("job_detail")
.withDescription("Invoke Tistory Job service...")
.build();
}
trigger를 만든다.
@Bean
public Trigger tistoryTrigger(@Qualifier("tistoryJobDetail") JobDetail job) {
return TriggerBuilder.newTrigger().forJob(job)
.withIdentity("tistory_job_trigger")
.withSchedule(cronSchedule("0 0 9 * * ?")
.inTimeZone(TimeZone.getTimeZone("Asia/Seoul")))
.build();
}
quartz에서 제공해주는 기능들이다.
1. scheduler간의 clustering기능
2. shceduler 실패에 대한 후처리 기능
3. JVM 종료 이벤트를 캐치하여 스케줄러에게 종료를 알려주는기능
4. 여러가지 plugin
5. 이벤트 처리 (Job, Trigger)
즉 복잡한 설정이 필요할때는 quartz를 사용하면 된다.
쿼츠에 대한 자세한 설명은 아래 포스팅을 참고하자.
https://wouldyou.tistory.com/94
참고
https://stackoverflow.com/questions/4385719/spring-scheduling-scheduled-vs-quartz
'Spring' 카테고리의 다른 글
[springboot] ApplicationPidFileWriter 란? (0) | 2023.08.03 |
---|---|
[spring] form데이터 @RequestPart vs @RequestParam (2) | 2023.07.20 |
[spring] @RequestBody @ResquestParam 등 정리 (0) | 2022.10.31 |
[spring] (1) springboot, mysql, mybatis 연결, DB에서 데이터가져오기 (5) | 2022.10.20 |
Eclipse로 war 파일 만들기 (0) | 2022.05.02 |