본문 바로가기

OpenSource/Spring

[Spring Batch] MapJobRepositoryFactoryBean을 사용하여 메타 테이블 생성 없이 배치 작업 설정 with CommandLineRunner

환경

  • Java 1.8
  • Spring Boot 2.2.4.RELEASE
  • Spring Batch 4.2.1.RELEASE
  • Maven

Spring Batch를 설정할때 각종 실행 결과, 파라미터 등의 메타데이터를 RDBMS에 저장하게 되는데, 간단한 배치작업 위주로 동작할때 이 메타데이터는 크게 중요하지 않을때가 있다.

이번에는 메타 데이터를 DB에 저장하지 않는 방법에 대해 남겨보려고 한다.

1. pom.xml에 Dependency 추가

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
  </dependency>

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
</dependencies>

2. BatchConfigDefaultBatchConfigurer 상속하여 DataSource를 null로 유지

import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class BatchConfig extends DefaultBatchConfigurer {
    @Override
    public void setDataSource(DataSource dataSource) {
		//data source를 null로 유지하기 위함
    }
}

3. Job 설정

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
@RequiredArgsConstructor
public class SimpleJobConfig {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("job1")
                .start(simpleStep1())
                .build();
    }

    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("job1Step1")
                .tasklet((contribution, chunkContext) -> {
                    log.info(">>>>>>>>>>>> Step1 execution");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

4. Application 시작시 자동으로 Job이 수행되지 않도록 수정

Application을 시작하게 되면 등록한 모든 잡들이 수행이 되게 되는데, 필자는 CommandLineRunner를 이용하여 수행하고자 하는 Job만 돌리기 위하여 자동 실행 옵션을 제거한다.

## application.properties
spring.batch.job.enabled=false

5. CommandLineRunner 설정

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@EnableBatchProcessing
@SpringBootApplication(
        exclude = {
                DataSourceAutoConfiguration.class
        }
)

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @RequiredArgsConstructor
    @Component
    class CommandLineStarter implements CommandLineRunner {
        private final ApplicationContext context;
        private final JobLauncher jobLauncher;

        @Value("${job.name}")
        private String jobName;


        @Override
        public void run(String... args) throws Exception {
            Job job = context.getBean(jobName, Job.class);
            //TODO 커맨드 라인에서 파라미터를 받아 job 파라미터로 넘겨주도록 설정함
            jobLauncher.run(job, new JobParameters());
        }
    }

}

6. 실행

IDE나 터미널에서 수행할때 --job.name= 파라미터를 통해 실행할 잡을 지정하면된다. 이때 JobName은 Job Class의 Bean Name(여기에서는 simpleJob)을 입력하면 된다.

 

실제 실행은 아래와 같이 하면 된다.

java -jar my-batch.jar --job.name=simpleJob