반응형

고객사의 요청으로 일정시간마다 특정 DB에서 데이터를 가져오고 넣어주는 작업이 필요했습니다.

 

일정시간마다 동작이 필요하다보니 자바로 스케줄러를 구성하게 되었고 Quartz를 사용하여 구성해보았습니다.

 

spring 프로젝트에서 was에 스케줄러 추가하여 구성하여도 되지만, 이번 경우엔 간단하게 데이터 처리만 하면 되기때문에 Maven 프로젝트로 생성하여 스케줄러를 구성해보았습니다.

 

 

 

JAVA 스케줄러 구성하기

먼저 Maven프로젝트를 생성하시고 pom.xml에 사용할 라이브러리인 Quartz 정보를 추가합니다.

pom.xml

<!-- scheduler - quartz  --> 
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

SchedulerTest.java

import java.util.Date;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

@DisallowConcurrentExecution
public class SchedulerTest implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("::: 스케줄러가 동작합니다.  current Time [" + new Date(System.currentTimeMillis()) + "] :::");
    }
}

동작시킬 스케줄러를 구성합니다.

 

SchedulerTest.java 파일을 만들고 Job을 상속받습니다. execute()에 동작시킬 내용을 정의합니다.

 

@DisallowConcurrentExecution 어노테이션은 동기화 처리를 위해 추가하였습니다.

어노테이션을 설정한 해당 스케줄러가 끝나지 않은 상태에서 다음 요청이 들어왔을 경우 대기하고 있게 됩니다.

저같은 경우는 5초마다 동작하는 스케줄러를 구성예정입니다. 하지만 5초안에 스케줄러의 동작이 끝나지 않게 되면 DB 데이터가 꼬일 수 있기때문에 Lock처리를 해두었습니다.

 

App.java

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

public class App{

    public static void main(String[] args) {
        // SchedulerFactory Create
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();

            JobDetail job = newJob(SchedulerTest.class).withIdentity("jobName", Scheduler.DEFAULT_GROUP).build();

            // 5 seconds action
            Trigger trigger = newTrigger().withIdentity("trggerName", Scheduler.DEFAULT_GROUP)
                    .withSchedule(cronSchedule("0/5 * * * * ?")).build();

            scheduler.scheduleJob(job, trigger);
            scheduler.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

실제로 동작시킬 App.java의 메인문을 구성합니다.

 

먼저 동작시킬 스케줄러를 연결해주고 Trigger부분에서 동작시킬 주기를 설정합니다.

동작주기는 Crontab형태로 입력합니다.

저는 매 5초마다 동작하도록 설정하였고, 동작 결과는 아래와 같습니다.

 

동작결과

 

반응형