본문 바로가기
🐎Language/Java

[Java] Quartz 스케줄러

by inbeom 2023. 9. 24.
728x90
반응형
Quartz는 Java로 작성된 오픈소스 스케줄링 라이브러리이다.

 

Quartz를 사용하여 Java 애플리케이션에서 작업을 예약하고 관리할 수 있으며, 복잡한 작업 예약 및 스케줄링을 간편하게 처리할 수 있도록 도와준다.

 

라이브러리 추가.

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version> <!-- 최신 버전을 확인하여 업데이트 가능 -->
</dependency>

 

구조

Job

- 실행할 작업을 나타내는 인터페이스로 execute 메서드를 구현하여 작업 내용을 정의한다.

JobDetail

- Job을 실행하기 위한 상세 정보를 가진 객체로, Job 클래스와 그룹명, JobData 등을 포함한다.

Scheduler

- 작업의 실행과 관리를 담당하는 핵심 컴포넌트로, JobDetail과 Trigger를 관리하여 작업을 스케줄링한다.

Trigger

- Job을 실행하는 시점을 정의하며, 특정 시간, 주기적으로 또는 특정 이벤트 발생 시점에 작업을 실행한다.

JobData

- Job에게 데이터를 전달하기 위한 객체로, JobDetail이나 Trigger에 설정하여 Job내에서 활용할 수 있다.

JobListener

- Job의 실행 전/후 등의 이벤트를 감지하고 처리하기 위한 리스너로, Job 실행 상태에 따라 추가 동작을 수행할 수 있다.

 

 

Example >

Job 클래스 생성 (할일)
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // JobDataMap에서 데이터를 가져온다.
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        
        // 데이터 사용
        String param1 = dataMap.getString("param1");
        int param2 = dataMap.getInt("param2");
        
        System.out.println("param1: " + param1);
        System.out.println("param2: " + param2);
    }
}

 

Trigger, Scheduler 세팅 (실행 주기)
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class Main {
    public static void main(String[] args) throws SchedulerException {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
        .withIdentity("myJob", "group1")
        .usingJobData("param1", "value1") // 데이터 전달
        .usingJobData("param2", 123)      // 다른 타입의 데이터도 가능
        .build();

        Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("myTrigger", "group1")
        .withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 ? * WED")) // 매주 수요일 12시에 실행
        .build();

        scheduler.scheduleJob(jobDetail, trigger);

        scheduler.start();
    }
}

 

Listener 등록 (추가 작업)
public class MyJobListener implements JobListener {
    @Override
    public String getName() {
        return "myJobListener";
    }

    @Override
    public void jobToBeExecuted(JobExecutionContext context) {
        System.out.println("작업이 실행되기 전");
    }

    @Override
    public void jobExecutionVetoed(JobExecutionContext context) {
        System.out.println("작업이 실행되지 않음");
    }

    @Override
    public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
        System.out.println("작업이 실행된 후");
    }
}

 

스케줄러 동적 제어

# 작업 일시 중지
scheduler.pauseJob(JobKey.jobKey("myJob", "group1"));

# 작업 재개 
scheduler.resumeJob(JobKey.jobKey("myJob", "group1"));

# 작업 삭제
scheduler.deleteJob(JobKey.jobKey("myJob", "group1"));

# 스케줄러 종료
scheduler.shutdown();

 

728x90
반응형

'🐎Language > Java' 카테고리의 다른 글

[Java] MyBatis: ClassNotFoundException 트러블 슈팅 (JVM 네이밍 규칙)  (2) 2024.09.18
[JAVA] ver.8  (1) 2023.11.10
[Java] Gson이란?  (0) 2023.09.24
[Java] JVM - JRE - JDK  (0) 2023.09.17
[Java] Optional 클래스  (0) 2023.09.11