사용자 도구

사이트 도구


springframework:springboot:batch

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
springframework:springboot:batch [2018/07/25 18:14]
kwon37xi [application.properties/yml]
springframework:springboot:batch [2021/09/06 16:06] (현재)
kwon37xi
줄 6: 줄 6:
 아래는 SpringBoot 에서 명령행(Command line)으로 Spring Batch Job을 실행하는 방법이다. 아래는 SpringBoot 에서 명령행(Command line)으로 Spring Batch Job을 실행하는 방법이다.
  
-===== 의존성 및 bootJar 설정(Boot 2.x 기준) =====+  * [[https://github.com/kwon37xi/springboot2-batch-example|SpringBoot2 Batch Example]] 예제 소스 
 + 
 +===== 의존성 및 bootJar 설정 =====
 <code groovy> <code groovy>
 compile('org.springframework.boot:spring-boot-starter-batch') compile('org.springframework.boot:spring-boot-starter-batch')
  
 +// 2.x
 bootJar { bootJar {
     mainClassName = "my.boot.batch.BatchApplication"     mainClassName = "my.boot.batch.BatchApplication"
 +}
 +
 +// 1.x - 지정하지 않으면 자동으로 @SpringBootApplication 애노테이션이 붙은 클래스로 자동 지정됨.
 +bootRepackage {
 +    mainClass = "my.boot.batch.BatchApplication"
 } }
 </code> </code>
줄 21: 줄 29:
     * **''spring.batch.job.enabled=true''**일 때 자동 생성되며, ''spring.batch.job.names'' 에 쉼표로 구분되어 지정된 Job들을 실행한다. 단, **''spring.batch.job.names''가 존재하지 않으면 모든 Job을 실행해버린다!**     * **''spring.batch.job.enabled=true''**일 때 자동 생성되며, ''spring.batch.job.names'' 에 쉼표로 구분되어 지정된 Job들을 실행한다. 단, **''spring.batch.job.names''가 존재하지 않으면 모든 Job을 실행해버린다!**
     * ''@EnableBatchProcessing''에 의해 생성된 ''JobLauncher'', ''JobExplorer''를 주입받고,      * ''@EnableBatchProcessing''에 의해 생성된 ''JobLauncher'', ''JobExplorer''를 주입받고, 
-    * Program 인자로 ''param1=value1 param2=value2''로 준 값이 자동으로 Job Parameter key/value로 들어가게 된다.+    * **Program 인자로 ''param1=value1 param2=value2''로 준 값이 자동으로 Job Parameter key/value로** 들어가게 된다.
   * 기본적으로 ''@Primary'' ''DataSource''를 자동으로 사용한다. 보통 이 경우 문제가 된다. 별도 DB를 따로 사용하게 설정하려면 [[springframework:batch|Spring Framework Batch]] 에서 설정 Override 참조.   * 기본적으로 ''@Primary'' ''DataSource''를 자동으로 사용한다. 보통 이 경우 문제가 된다. 별도 DB를 따로 사용하게 설정하려면 [[springframework:batch|Spring Framework Batch]] 에서 설정 Override 참조.
  
줄 29: 줄 37:
 @SpringBootApplication @SpringBootApplication
 @Import(각종기타 설정 import) @Import(각종기타 설정 import)
-public class BatchApplication {+public class BatchApplication extends DefaultBatchConfigurer {
     public static void main(String[] args) {     public static void main(String[] args) {
-        return SpringApplication.exit(SpringApplication.run(BatchApplication.class, args));+        int exitCode = SpringApplication.exit(SpringApplication.run(BatchApplication.class, args)); 
 +        System.exit(exitCode); 
 +    } 
 +     
 +    @Value("${spring.batch.job.names:NONE}"
 +    private String jobNames; 
 + 
 +    // 어디선가 미리 생성해둔 spring batch 용 database 
 +    @Autowired 
 +    @Override 
 +    public void setDataSource(@Qualifier("batchDataSource") DataSource batchDataSource) { 
 +        super.setDataSource(batchDataSource); 
 +    } 
 +     
 +    // spring.batch.job.names 를 지정하지 않으면 모든 Job이 실행돼 버리기 때문에 
 +    // 방어차원에서 넣은 job.names validation 처리     
 +    @PostConstruct 
 +    public void validateJobNames() { 
 +        log.info("jobNames : {}", jobNames); 
 +        if (jobNames.isEmpty() || jobNames.equals("NONE")) { 
 +            throw new IllegalStateException("spring.batch.job.names=job1,job2 형태로 실행을 원하는 Job을 명시해야만 합니다!"); 
 +        }
     }     }
 } }
 </code> </code>
  
 +> ''DefaultBatchConfigurer'' 사용시에 이 클래스내에서 ''transactionManager''를 batchDataSource 용으로 생성해버려서 원래 애플리케> 이션의
 +> DataSourceTransactionManagerAutoConfiguration.DataSourceTransactionManagerConfiguration 가 작동하지 않게 된다.
 +> 따라서 항상 **애플리케이션용 DataSource에 대한 transactionManager를 항상 명시적으로 만들어주고 @Primary 설정**을 해줘야 한다.
  
 ===== 예제 Batch Job Configuration ===== ===== 예제 Batch Job Configuration =====
줄 90: 줄 122:
     job:     job:
       enabled: true       enabled: true
 +    initialize-schema: embedded
 +  main:
 +    web-application-type: NONE
 </code> </code>
 +  * ''spring.batch.initialize-schema'' 는 거의 항상 ''embdded''로 지정하며, 별도 DB 사용시에는 ''never''로 지정한다. ''always''인 경우는 거의 없다고 봄. 
 +  * SpringBoot 2.x 기준, ''spring-boot-starter-web'', ''spring-boot-starter-webflux''가 의존성에 없어야 하며, 만약 있다면 ''spring.main.web-application-type=NONE''으로 설정할 것. 
 +  * Spring Batch 를 integraition test 할 때 ''spring.batch.job.enabled=false'' 로 두고 ''JobLauncherTestUtils'' 로 런칭하게 하지 않으면 배치 Job이 두 번 실행된다. 첫번째 실행시 파라미터가 잘못 주입된다.
 ===== 실행 ===== ===== 실행 =====
 ''bootJar''로 jar를 생성하고 ''bootJar''로 jar를 생성하고
줄 103: 줄 140:
 </code> </code>
  
-**''spring.batch.job.names''는 쉼표로 구분하여 여러개도 지정 가능하다.**+  * **''spring.batch.job.names''는 쉼표로 구분하여 여러개도 지정 가능하다.** 
 +  * **''spring.batch.job.names''를 명시하지 않으면 모든 job 이 다 실행된다.** 
 +===== 완전 auto configuration ===== 
 +  * 완전히 AutoConfig 로 SpringBoot batch 를 설정할 때 ''@org.springframework.boot.autoconfigure.batch.BatchDataSource'' 를 사용하여 batch 용 dataSource 지정이 가능하다. 
 + 
 +==== spring-boot-starter-batch-web ==== 
 +  * [[https://github.com/codecentric/spring-boot-starter-batch-web|codecentric/spring-boot-starter-batch-web]] 
 +  * SpringBoot Web으로 batch Job 실행. 
 + 
 + 
 +===== 참고 ===== 
 +  * [[https://cheese10yun.github.io/spring-batch-basic/|Spring Batch 간단 정리 - Yun Blog | 기술 블로그]] 
 +  * [[https://spring.io/blog/2021/01/27/spring-batch-on-kubernetes-efficient-batch-processing-at-scale|Spring Batch on Kubernetes: Efficient batch processing at scale]]
springframework/springboot/batch.1532510060.txt.gz · 마지막으로 수정됨: 2018/07/25 18:14 저자 kwon37xi