SpringBatch JobLauncherApplicationRunner Job Name 을 지정하여 실행시키기 (동시에 Job 여러개 지정하여 실행시키기)

반응형
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만 실행된다.

 

Program Argument 설정

 

 

수행 코드 분석

  • 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;
        }
    }
...

 

 

 

 

반응형

Designed by JB FACTORY