반응형
728x90
반응형
JobLauncherApplicationRunner
- 스프링 배치 작업을 시작하는 ApplicationRunner 이고 ApplicationRunner의 구현체로, 어플리케이션이 정상적으로 구동되자마자 실행된다.
- BatchAutoConfiguration 에서 생성된다.
- 기본적으로 빈으로 등록된 모든 job을 실행시킨다.
사용자가 Job Name을 지정하여 실행시키고싶은 Job만 실행시킬 수 없을까?
예제코드
- application.yml
...
spring:
batch:
jdbc: # schema-mysql.sql 항상 실행
initialize-schema: always
job:
enabled: false # spring batch 자동실행 방지
names: ${job.name:NONE}
Run/Debug Configuration
--job.name=batchJob1, batchJob2 로 입력시 , 구분으로 여러 Job을 수행시킬 수 있다. 만약 존재하지 않는 BatchJob Name이 있으면 해당 Job은 PASS되어 존재하는 Job만 실행된다.
수행 코드 분석
- 1) BatchAutoConfiguration.java
JobLauncherApplicationRunner을 빈으로 등록한다. BatchProperties 를 파라미터로 받아서, 여기에서 Job Names를 읽어온다. 여기서 읽어오는 내용이 위의 Run/Debug Configuration에서 설정한 --job.name 의 value 다.
...
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(
prefix = "spring.batch.job",
name = {"enabled"},
havingValue = "true",
matchIfMissing = true
)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer, JobRepository jobRepository, BatchProperties properties) {
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getNames();
if (StringUtils.hasText(jobNames)) {
runner.setJobNames(jobNames);
}
return runner;
}
...
- JobLauncherApplicationRunner.java
...
@Autowired(
required = false
)
public void setJobs(Collection<Job> jobs) {
this.jobs = jobs;
}
...
JobLauncherApplicationRunner.java 의 run() 호출
- - run(ApplicationArguments args)
ApplicationRunner 의 구현체이므로 수행된다.
...
public void run(ApplicationArguments args) throws Exception {
String[] jobArguments = (String[])args.getNonOptionArgs().toArray(new String[0]);
this.run(jobArguments);
}
...
- - run(String... args)
...
public void run(String... args) throws JobExecutionException {
logger.info("Running default command line with: " + Arrays.asList(args));
this.launchJobFromProperties(StringUtils.splitArrayElementsIntoProperties(args, "="));
}
...
- - launchJobFromProperties(properties)
jobParameters 객체에 파라미터 정보들이 저장되고, 이를 매개변수로 executeLocalJobs()를 호출한다.
...
protected void launchJobFromProperties(Properties properties) throws JobExecutionException {
JobParameters jobParameters = this.converter.getJobParameters(properties);
this.executeLocalJobs(jobParameters);
this.executeRegisteredJobs(jobParameters);
}
...
- - executeLocalJobs(JobParameters jobParameters)
넘어온 job Name(jobToRun), job.getName() 이 일치하는 job을 실행시키고, 일치하는 job이 없다면 실행되지 않는다.
...
private void executeLocalJobs(JobParameters jobParameters) throws JobExecutionException {
Iterator var2 = this.jobs.iterator();
while(true) {
while(var2.hasNext()) {
Job job = (Job)var2.next();
if (StringUtils.hasText(this.jobNames)) {
String[] jobsToRun = this.jobNames.split(",");
if (!PatternMatchUtils.simpleMatch(jobsToRun, job.getName())) {
logger.debug(LogMessage.format("Skipped job: %s", job.getName()));
continue;
}
}
this.execute(job, jobParameters);
}
return;
}
}
...
반응형
'Coding > Spring Batch' 카테고리의 다른 글
[SpringBatch] COMPLETED된 Step도 Job 재실행 대상에 포함하기 -allowStartIfComplete (0) | 2022.02.15 |
---|---|
[SpringBatch] Incrementer() Custom : 직접 별도 클래스 생성하기 (0) | 2022.02.08 |
SpringBatch에서 JobLauncher 동기/비동기 실행 (0) | 2022.01.21 |
스프링배치 StepContribution (0) | 2022.01.19 |
SpringBatch 에서 StepExecution 알아보기 (0) | 2022.01.16 |