다양한 이유로 스케줄링 프로그램을 만드는 일이 생길 것이다. Spring에서는 Spring Scheduler를 제공한다.
Spring Scheduler는 별도의 추가적인 의존성이 필요하지 않다. Spring Boot starter에 기본적인 의존성으로 제공된다. 사용하기 위해서는 @EnableScheduling 어노테이션을 붙여주면 된다.
Spring Batch에 Scheduler를 등록하도록하겠다.
Spring Batch에 대한 내용은 아래 링크를 참조 바란다.
@EnableScheduling //스케줄링 활성화
@EnableBatchProcessing
@SpringBootApplication
public class SpringBatchApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBatchApplication.class, args);
}
}
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만 동작할 것이다.
구분 | 내용 |
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을 가장 많이 사용할 것이다.
특수 문자 * – , / ? 을 사용해서 다양한 표현을 할 수 있다.
모든 요일 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 * * *
@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)
Job실행 전 Job에서 사용될 Parameter 정보를 설정한다. Batch는 보통 일자별로 동작하도록 설정하고 SQL을 작성할 것이기 때문에 Date타입으로 저장하겠다. 저장된 정보는 BATCH_JOB_EXECUTION_PARAMS 테이블에 적재될 것이다.
BATCH_JOB_EXECUTION_PARAMS
Job과 함께 실행되는 JobParameter 정보를 저장한다.
String, Date, Long, Double 네 가지 타입의 값만 사용이 가능하며, 해당 파라미터가 Job Instance 생성에 관여한다.
JobLauncher는 Job을 실행하는 역할을 담당한다
jobLauncher.run(exampleJobChunkConfiguration.exampleJobChunk(), jobParameters);
간단한 테스트를위해 @Scheduled를 사용하였지만, Quartz + Spring Batch를 사용할 수 있다.
[Spring/Quartz] - [JAVA] Quartz - 개념
[Spring/Quartz] - [JAVA] Quartz - Spring boot Example
Spring Batch - Step 데이터 공유(Excution Context) (0) | 2022.10.13 |
---|---|
Spring Batch - 메타 테이블 (0) | 2022.10.12 |
Spring Batch - Chunk 지향 프로세싱(Mybatis) (0) | 2022.10.11 |
Spring Batch - 개념, Tasklet Example(SimpleJob, FlowJob) (1) | 2022.10.04 |
댓글 영역