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 |