본문 바로가기

programming/java, Spring, android, js

[Spring boot+Quartz] 배치 샘플

일단 내가 쿼츠를 살펴보게 된 이유는 신규 의뢰 때문이었다.

 

A라는 회사가 고객들의 이체를 관리하는데 이에 대한 수정 업무였다.

애초에 배치가 처음이기도 했고;;

엄청 헤매다가~ 소스에 보이는 쿼츠는 또 뭔가 하다가~ 찾아보게 되었다.

 

뭐 특징이 어떤 것인지, 어떻게 활용하면 좋을지는 최하단에 참고 링크에 가서 보면 거의 명세서 수준으로 자세하게 나와 있을뿐더러 작성하신 개발자님의 다른 글들도 깊이가 있어서... 뭐 그런 류의 글을 작성하는 것은 중복된 것 같아 다른 형태의 글을 써 내려가려 한다.

 

우선 스프링 부트를 하나 만든다.

 


 

1. 주소창에 다음 URL을 친다.

 

https://start.spring.io/

불러오는 중입니다...

 


 

2. 원하는 세팅을 선택하고, 추가 옵션으로 쿼츠(Quartz 스케줄러)를 선택한다.

  1) 적당히 원하는 Dependency를 선택해 준다.

1) 적당히 원하는 Dependency 를 선택해 준다.

  2) 쿼츠 스케쥴러, Spring Batch를 선택해 준다.

* 쿼츠 버전이 마음에 들지 않다면 다운로드하신 뒤 설정 파일 (pom.xml 또는 build.gradle)을 적절히 수정하시면 된다.

* 다른 것들은 입맛대로 고르셔요~

 


 

3. Generate 눌러서 만들어진 파일을 다운로드하고 자신의 IDE로 불러온다.

  1) 압축을 해제한다.

적절히 압축을 풀면 이런 모습이다.

 

  2) IDE로 임포트 한다.

     * 주의 : 이클립스에 gradle 프로젝트를 가져올 때는 그냥 open 하면 불편하고 gradle project로 임포트 하는 게 편하다.

IDE (이클립스) 로 불러온 모양1
IDE (이클립스) 로 불러온 모양2

 

     쓸쓸하게 세팅된 게 따뜻해지고 싶은가 보다. ㅎㅎ

     이제 짜 봅시다.

 

 


 

4. Job, JobController, 을 만든다

 

  - 샘플에서는 분당 무언가를 출력하는 그런 소스를 구현하고자 한다. 간단히 보자면, 

  - Job 은 실행 주체이다.

  - JobController는 실행 주체들을 언제 투입할지 매니지먼트한다.

 

  1) 일정 시간마다 실행할 Job을 만든다.

  - 하기 첨부된 소스는 실행마다 1을 출력한다.

package com.example.demo.job;

import org.quartz.InterruptableJob;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.UnableToInterruptJobException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class TrReReqJob extends QuartzJobBean implements InterruptableJob {
	@Override
	public void interrupt() throws UnableToInterruptJobException {
		// TODO Auto-generated method stub
		
	}

	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		log.info("1");
	}

}

  2) Job 들을 관리할 JobController를 만든다.

  - 1분마다로 Job을 실행할 수 있도록 설계한다.

package com.example.demo.ctr;

import static org.quartz.JobBuilder.newJob;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.example.demo.job.TrReReqJob;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class BatchController {

    @Autowired
    private Scheduler scheduler;
    

    @PostConstruct
    public void start() {

        JobDetail aggreReqJobDetail = buildJobDetail(TrReReqJob.class, "testJob", "test", new HashMap());
        try {
			scheduler.scheduleJob(aggreReqJobDetail, buildJobTrigger("0 * * * * ?"));
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }

    //String scheduleExp ="0 40 11 * * ?"; 초 분 시 일 월 ?
    public Trigger buildJobTrigger(String scheduleExp) {
        return TriggerBuilder.newTrigger()
                .withSchedule(CronScheduleBuilder.cronSchedule(scheduleExp)).build();
    }

    public JobDetail buildJobDetail(Class job, String name, String group, Map params) {
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.putAll(params);

        return newJob(job).withIdentity(name, group)
                .usingJobData(jobDataMap)
                .build();
    }
}

*) 잡 트리거에서 스케줄을 앞에서부터 초/분/시/일/월 단위 실행을 처리한다. (역순)

예를 들어, 스케줄 데이터는 하기와 같다.

 [0 40 * * * ?] -> 매시각 40분 0초마다 해당 잡을 실행 해라. 

 [0 0 1 4 * ?] -> 매달 4일 새벽 1시 정각마다 해당 잡을 실행 해라.

 

 


 

5. 실행해본다.

 

  1) 로그를 보면 알겠지만, 소스상 매분 0초마다 잡이 잘 실행되고 있음을 알 수 있다.

혹시 똑같이 따라하고 DB 오류가 로그에 뜬다면 6번을 참고하여 주세요.

  2) 샘플의 최종 모양새는 아래와 같다.

 

*6. 샘플 그대로 따라 했는데, 디비 오류가 납니다.

  1) 스크린샷을 그대로 따라 한다면, 아무래도 디비 커넥션 오류가 발생할 수도 있다. 이경우, 로컬로 적당히 디비를 하나 열고 그 정보를 기입해 주도록 하자.

spring.datasource.url=jdbc:mariadb://127.0.0.1:9800/bflab
spring.datasource.username=dev_botbinoo
spring.datasource.password=1q2w3e4r
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

 

 


샘플 파일을 첨부합니다.

 

batchSample.zip
0.07MB

 


 

 참고 오류  : https://fntg.tistory.com/133

 

[Error 해결방법] Cannot determine embedded database driver class for database type NONE.

아래와 같은 에러 메세지를 출력하면서 정상적으로 Context가 올라오지 않는 문제 발생 아래의 에러 메세지 중에서 가장 중요한 부분은 bold 처리된 부분이다. 처리 방법은 다음과 같다. /src/main/resources/appl..

fntg.tistory.com

 참고 , 읽으면 좋을 글 : https://kingbbode.tistory.com/38

 

Quartz + Spring Batch 조합하기

Zum 에서 BeyondJ2EE 김태기 팀장님과 표준화 프로젝트를 진행하며, Zum 에서의 Batch 에 대한 표준을 작성하며 알게 된 Quartz Framework 의 매력과 직접 개발해본 Spring 과의 조합 및 궁합 을 소개해보려고 합..

kingbbode.tistory.com

 

[사전예약] LG전...

반응형