1. JobLauncherApplicationRunner
bean으로 정의된 job을 spring boot가 scan해서 JobLauncherApplicationRunner에게 전달해주고 JobLauncherApplicationRunner가 각각의 job을 실행시킴
2. BatchProperties
1. 실행순서
1. BatchAutoConfiguration
public class BatchAutoConfiguration {
public BatchAutoConfiguration() {
}
.
.
.
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 생성
BatchProperties에서 JobNames을 가지고 옴 (JobNames는 application.properties 또는 argument로 받아온 "실행 하려고 하는 job name" 들임, 따로 설정을 해주지 않았다면 JobNames는 빈 값이 될 것이다.)
JobName이 존재한다면 JoblauncherApplicationRunner에 jobname들을 넣어준다.
2. JobLauncherApplicationRunner
public class JobLauncherApplicationRunner implements ApplicationRunner, Ordered, ApplicationEventPublisherAware {
public void setJobs(Collection<Job> jobs) {
this.jobs = jobs;
}
public void run(String... args) throws JobExecutionException {
logger.info("Running default command line with: " + Arrays.asList(args));
this.launchJobFromProperties(StringUtils.splitArrayElementsIntoProperties(args, "="));
}
protected void launchJobFromProperties(Properties properties) throws JobExecutionException {
JobParameters jobParameters = this.converter.getJobParameters(properties);
this.executeLocalJobs(jobParameters);
this.executeRegisteredJobs(jobParameters);
}
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;
}
}
private void executeRegisteredJobs(JobParameters jobParameters) throws JobExecutionException {
if (this.jobRegistry != null && StringUtils.hasText(this.jobNames)) {
String[] jobsToRun = this.jobNames.split(",");
String[] var3 = jobsToRun;
int var4 = jobsToRun.length;
for(int var5 = 0; var5 < var4; ++var5) {
String jobName = var3[var5];
try {
Job job = this.jobRegistry.getJob(jobName);
if (!this.jobs.contains(job)) {
this.execute(job, jobParameters);
}
} catch (NoSuchJobException var8) {
logger.debug(LogMessage.format("No job found in registry for job name: %s", jobName));
}
}
}
}
protected void execute(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, JobParametersNotFoundException {
JobParameters parameters = this.getNextJobParameters(job, jobParameters);
JobExecution execution = this.jobLauncher.run(job, parameters);
if (this.publisher != null) {
this.publisher.publishEvent(new JobExecutionEvent(execution));
}
}
}
spring boot 에서 job을 scan해서 jobLauncher에게 넘겨주는데 setJobs 메서드를 이용해서 넘겨줌
ApplicationRunner 인터페이스를 구현하였긴 때문에 run(String args...) 메서드를 spring이 호출해준다.
이때 argument를 받는데, argument는 외부에서 전달해준 argument이다.
executeLocalJobs
batch job을 선별해서 실행 (batch job의 이름은 batchJob1)
spring:
batch:
names: batchJob1
아래와 같이 argument로 받아서 실행할 수 있다.
application.yml 설정
spring:
batch:
names: ${job.name:NONE}
iintellij edit configuration
application.yml 설정
spring:
config:
activate:
on-profile: mysql
datasource:
hikari:
jdbc-url: jdbc:mysql://localhost:3306/springbatch?useUnicode=true&characterEncoding=utf8
username: root
password: 1111
driver-class-name: com.mysql.cj.jdbc.Driver
batch:
jdbc:
# schema 생성과 관련한 option
initialize-schema: always
# 기본은 BATCH_ , -> prefix를 바꾸게 되면 아래 이름으로 query가 생성이 됨.
# query가 생성이 되는 것이지, table 이름도 변경이 되서 생성이 되는 것은 아니기 때문에 TABLE 이름도 변경해서 생성해 줘야한다.
table-prefix: SYSTEM_
job:
# 자동 실행 방지 enabled = false
# enabled: false
# job을 선별해서 실행하고자 할 때 names 설정 추가
# NONE은 임의의 문자를 의미한다. {job.name:NONE} 실행시점에 argument로 받겠다는 의미임
# names: batchJob2
names: ${job.name:NONE}
profile을 mysql로 설정 해 놓았기 때문에 active profiles를 아래와 같이 설정해 주고 사
'강의 > 스프링배치' 카테고리의 다른 글
SimpleJob - 개념 및 API 소개 (0) | 2023.01.10 |
---|---|
스프링 배치 실행 - JobBuilderFactory / JobBuilder (0) | 2023.01.09 |
스프링 배치 도메인 이해 - JobLauncher (0) | 2023.01.03 |
스프링 배치 도메인 이해 - Job repository (0) | 2023.01.02 |
스프링 배치 도메인 이해 - ExecutionContext (0) | 2023.01.02 |