본문 바로가기

Spring

[Spring Batch] Dynamic Scheduler 다이나믹 스케쥴링

Spring Batch를 개발하면서 서버가 Zookeeper로 클러스터링 되어있을 때 Master인 노드만 스케쥴링을 시작하도록 구현하고 싶었다.

따라서 처음에 자동으로 Start 하지 못하도록 설정하고, Master일 때 스케쥴링을 Start 해주도록 할 예정이다.

 

먼저, 스케쥴러는 서버가 시작할 때 자동으로 실행하게 된다.

이것을 막으려면 bootstrap.yml에 설정하나만 추가하면 된다.

spring:
  batch:
    job:
      enabled: false

 

두번째로 DynamicAbstractScheduler를 구현하여 start / stop 할 수 있는 클래스를 만들 것이다.

public abstract class DynamicAbstractScheduler {
    private ThreadPoolTaskScheduler scheduler;
    
    public void stopScheduler() {
        if (scheduler != null) {
            scheduler.shutdown();
        }
    }
    
    public void startScheduler() {
        scheduler = new ThreadPoolTaskScheduler();
        scheduler.initialize();
        scheduler.schedule(getRunnable(), getTrigger());
    }
    
    private Runnable getRunnable() { return this::runner; }
    
    public absctract void runner();
    
    public absctract Trigger getTrigger();
}

 

job을 실행 시킬 scheduler 클래스를 구현하여 DynamicAbstractScheduler를 상속받도록 한다.

@Configuration
@EnableScheduling
@RefreshScope
public class TestScheduler extends DynamicAbstractScheduler {
    @Value("${schedule.test.cron}")
    private String testCron;
    
    private final SimpleJobLauncher jobLauncher;
    
    private final Job simpleJob;
    
    TestScheduler(SimpleJobLauncher jobLauncher, @Qualifier("simpleJob")Job simpleJob) {
        this.jobLauncher = jobLauncher;
        this.simpleJob = simpleJob;
    }
    
    @Override
    public void runner() {
        JobParameters parameters = new JobParametersBuilder()
                         .addString("JobID", String.valueOf(System.currentTimeMillis()))
                         .toJobParameters();
        try {
            jobLauncher.run(simpleJob, parameters);
        } catch(Exception e) {}
    }
    
    @Override
    public Trigger getTrigger() { return new CronTrigger(testCron); }
}

 

testCron 변수는 설정파일에 작성해두었고 cron 작성법은 아래와 같다.

 위치

필드명 

값의 번위 

 1

 초

0~59 

 2

 분

0~59 

 3

 시

0~23 

 4

 일

1~31 

 5

 월

1~12 또는 JAN-DEC

 6

 요일

0-7 또는 SUN-SAT (0 또는 7은 일요일) 

나는 0 0 0 * * 5 로 설정하였는데 이는 매주 금요일 0시 0분 0초에 실행한다는 의미이다.

 

SimpleJobLauncher는 config에 bean을 생성해두었다.

@Bean
public SimpleJobLauncher simpleJobLauncher(JobRepository jobRepository) {
    SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
    simpleJobLauncher.setJobRepository(jobRepository);
    return simpleJobLauncher;
}

simpleJob 또한 step으로 이루어진 Job을 bean으로 생성해두었다.

 

마지막으로 TestScheduler 클래스를 start / stop 하고싶은 부분에 넣어서

testScheduler.startScheduler();

testScheduler.stopScheduler();

이런 식으로 사용하면 된다!

 

 

참고

http://tech.javacafe.io/2018/05/30/dynamic_scheduling/

 

'Spring' 카테고리의 다른 글

[Spring Batch] ItemWriter  (0) 2020.01.09
[Spring Batch] ItemReader  (0) 2020.01.09
[Spring Batch] MongoItemWriter 구현  (0) 2020.01.09
[개념] Spring Batch 란?  (0) 2020.01.08