상세 컨텐츠

본문 제목

Spring Batch - Scheduler 등록

Spring/Spring Batch

by Chan.94 2022. 10. 14. 08:17

본문

반응형

Spring Scheduler

다양한 이유로 스케줄링 프로그램을 만드는 일이 생길 것이다. Spring에서는 Spring Scheduler를 제공한다.

Spring Scheduler는 별도의 추가적인 의존성이 필요하지 않다. Spring Boot starter에 기본적인 의존성으로 제공된다. 사용하기 위해서는 @EnableScheduling 어노테이션을 붙여주면 된다.

Spring Batch에 Scheduler를 등록하도록하겠다.

Spring Batch에 대한 내용은 아래 링크를 참조 바란다.

@EnableScheduling

@EnableScheduling	//스케줄링 활성화
@EnableBatchProcessing
@SpringBootApplication
public class SpringBatchApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBatchApplication.class, args);
    }

}

 

 

 

ThreadPoolTaskScheduler

ThreadPoolTaskScheduler는 태스크 실행 및 스케줄링에 사용되는 스프링 라이브러리이다.

Batch를 관리할 때 Thread를 개발자가 직접 제어하지 않고 실행하고 싶은 Task와 시간을 Pool에 넣는다. 그러면 ThreadPoolTaskScheduler에서 제어하여 해당 시간에 맞춰서 Thread를 생성 및 실행시키고 종료까지 해준다.

@Configuration
public class SchedulerConfiguration implements SchedulingConfigurer {

	private final int POOL_SIZE = 2;
	
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

		threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
		threadPoolTaskScheduler.setThreadNamePrefix("DevLog-Scheduler-");
		threadPoolTaskScheduler.initialize();

		taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);

	}

}

PoolSize를 2로 설정하였기에 등록된 스케줄 중 동일한 시간에 스케줄이 있다면 2개의 Thread만 동작할 것이다.

 

@Scheduler 옵션

구분 내용
fixedDelay 이전 작업이 종료된 후 설정 시간만큼 기다린 후에 시작한다. (밀리세컨드)
@Scheduled(fixedDelay = 1000)
fixedRate 이전 작업이 종료되지 않아도 설정된 시간마다 시작한다. (밀리세컨드)
@Scheduled(fixedRate = 1000)
initialDelay 작업 시작 시, 설정된 시간만큼 기다린 후 시작한다. (밀리세컨드)
@Scheduled(fixedRate = 1000, initialDelay = 2000)
cron 원하는 시간대를 설정하여 작업을 실행한다.
@Scheduled(cron = "* * * * * *") 
초(0-59), 분(0-59), 시간(0-23), 일(1-31), 월(1-12), 요일(1-7, 1:일, 7:토)
zone 시간대를 설정 한다. 미설정 시 로컬 시간대가 적용된다.
@Scheduled(cron = "* * * * * *", zone = "Asia/Seoul") 

Spring Batch를 스케줄을 등록 중이라면 Crontab을 가장 많이 사용할 것이다.

 

Crontab 설정

특수 문자  * – , / ? 을 사용해서 다양한 표현을 할 수 있다.

  • * : 모든 값
  • , : 다양한 값을 설정할 수 있게 지원 (ex, Second에 0,30이면 0초 30초 설정)
  • - : 설정 값의 범위를 지정 (ex, Hour에 0-23이면 0시에서 23시까지 설정)
  • / : 시간의 간격을 설정 (ex, Second값으로 0/30을 설정하면 0부터 30초 간격으로 설정)

Crontab 설정 Example

모든 요일 8 AM에 실행 :  0 0 8 * * *
모든 요일 4 PM에 실행: 0 0 16 * * *
모든 요일 9AM, 9PM에 실행: 0 0 9,21 * * *
모든 요일 8AM,9AM,10AM, 11AM에  실행: 0 0 8-11 * * *
모든 요일 21PM,22PM,23PM, 0AM에 실행: 0 0 21-00 * * *
모든 요일 6:30 AM, 9:30PM에 실행: 0 30 6,21 * * *
모든 시간 0초 0분에 실행: 0 0 * * * *
모든 시간 15초에 실행: 15 * * * * *
모든 요일 0시 15초에 실행: 15 0 0 * * *
매년 8월 25일 9AM에 실행: 0 0 9 25 8 *
매달 7일 9시 30AM에 실행: 0 30 9 7 * *
매년 2월 14일 9AM이 화요일, 일요일이면 실행: 0 0 9 14 2 SUN, TUE
모든 요일 모든 시간 30분에 실행: 0 30 0-23 * * *

 

Scheduler 등록 (@Schaduled)

@Component
public class ExampleScheduler {

	@Autowired
	private JobLauncher jobLauncher;
	@Autowired
	private ExampleJobChunkConfiguration exampleJobChunkConfiguration;
	
	@Scheduled(cron = "0 * * * * *")
	public void runExampleJob() {
		//job parameter 설정
		Map<String, JobParameter> confMap = new HashMap<>();
		
		Calendar calendar = Calendar.getInstance();
		Date date = calendar.getTime();
		confMap.put("time", new JobParameter(date));
		JobParameters jobParameters = new JobParameters(confMap);
		
		try {
			jobLauncher.run(exampleJobChunkConfiguration.exampleJobChunk(), jobParameters);
		} catch (Exception e) {
	    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	    		System.out.println(String.format("ERRER TIME : %s", sdf.format(date)));;
		}		
	}
}

Scheduler에 등록할 class는 IoC컨테이너에 등록되어있어야 한다. Example이기 때문에 @Component 어노테이션을 사용하였다.

 

ExampleJobChunkConfiguration는 Chunk 지향 프로세싱으로 Step을 구성한 객체이다.

Spring Batch - Chunk 지향 프로세싱(Mybatis)

 

JobParameter 설정

Job실행 전 Job에서 사용될 Parameter 정보를 설정한다. Batch는 보통 일자별로 동작하도록 설정하고 SQL을 작성할 것이기 때문에 Date타입으로 저장하겠다. 저장된 정보는 BATCH_JOB_EXECUTION_PARAMS 테이블에 적재될 것이다.

BATCH_JOB_EXECUTION_PARAMS 

Job과 함께 실행되는 JobParameter 정보를 저장한다.
String, Date, Long, Double 네 가지 타입의 값만 사용이 가능하며, 해당 파라미터가 Job Instance 생성에 관여한다.

 

Job 실행

JobLauncher는 Job을 실행하는 역할을 담당한다

jobLauncher.run(exampleJobChunkConfiguration.exampleJobChunk(), jobParameters);

 


 

간단한 테스트를위해 @Scheduled를 사용하였지만, Quartz + Spring Batch를 사용할 수 있다.

 

[Spring/Quartz] - [JAVA] Quartz - 개념

[Spring/Quartz] - [JAVA] Quartz - Spring boot Example

 

 

반응형

관련글 더보기

댓글 영역

>