사용자 도구

사이트 도구


springframework:batch

차이

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

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
springframework:batch [2020/04/16 09:38]
kwon37xi
springframework:batch [2023/12/08 13:43] (현재)
kwon37xi [Java Config Spring Bean 설정시 리턴 타입을 인터페이스가 아닌 구현 클래스로 지정할 것.]
줄 37: 줄 37:
     * ''text'' -> ''longtext''     * ''text'' -> ''longtext''
     * ''datetime'' -> ''datetime(6)''로 변경해서 실행할 것.     * ''datetime'' -> ''datetime(6)''로 변경해서 실행할 것.
 +    * 테이블 생성시 명백하게 대문자로 테이블명을 생성해줘야한다.
 +    * 만약 [[database:mysql|MySQL]]을 사용하면서 소문자로 테이블을 생성해버렸다면 다음과 같은 설정을 추가해줘야한다.
 +      * see [[database:mysql:config|MySQL 설정]] 대소문자 테이블명 부분의 ''lower_case_table_names=1''
  
 ===== Migration ===== ===== Migration =====
줄 44: 줄 47:
  
 ===== Transaction 설정 ===== ===== Transaction 설정 =====
 +==== Connection Pool 설정 ====
 +  * batch job 이 job 단위로 단독 프로세스로 실행되는 경우
 +  * batch job 은 실제로 Parallel 로 실행되는게 아니면 DB 커넥션이 1~2개 정도 밖에 필요하지 않다.
 +  * parallel, async 실행에 대비해서 maximum connection 갯수는 충분한 숫자로 하되,
 +  * minimum 갯수를 5개 혹은 그 이하로 지정해야 Batch job 이 실행 될 때마다 커넥션을 과도하게 맺느라 들어가는 실행시간 지연 문제를 해소하고, 불필요하게 DB connection 을 점유하여 DB 자체의 한계에 봉착하는 문제를 피할 수 있다.
 +
 ==== 트랜잭션 매니저를 지정하지 않으면 ==== ==== 트랜잭션 매니저를 지정하지 않으면 ====
 TransactionManager를 지정하지 않으면 다음과 같은 오류가 발생한다. TransactionManager를 지정하지 않으면 다음과 같은 오류가 발생한다.
줄 82: 줄 91:
   * 외부에서 그 데이터를 사용할 수 있게 하고자 했다면,   * 외부에서 그 데이터를 사용할 수 있게 하고자 했다면,
   * 절대로 Step 에 트랜잭션 매니저를 지정하지 말고, ''ResourcelessTransactionManager'' 를 사용하거나 CHUNK 를 작게 가져가야 한다.   * 절대로 Step 에 트랜잭션 매니저를 지정하지 말고, ''ResourcelessTransactionManager'' 를 사용하거나 CHUNK 를 작게 가져가야 한다.
 +  * ''ResourcelessTransactionManager'' 로 Batch Job 을 지정하면, Batch job 의 chunk 가 아닌, 각각의 ''Service''/''Repository'' 등의 메소드에 설정된 ''@Transactional''을 기준으로 트랜잭션이 작동하게 된다.
   * 안그러면 CHUNK size 만큼의 처리가 모두 끝날때까지 DB lock 이 잡혀있어서 외부에서 이벤트를 받아서 처리하는 측에서 lock 획득에 실패해서 오류가 발생하게 된다.   * 안그러면 CHUNK size 만큼의 처리가 모두 끝날때까지 DB lock 이 잡혀있어서 외부에서 이벤트를 받아서 처리하는 측에서 lock 획득에 실패해서 오류가 발생하게 된다.
 +  * 이게 아니더라도, **트랜잭션은 항상 짧게 가져가야 한다.**
 ===== JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters 오류 발생 ===== ===== JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters 오류 발생 =====
   * Job은 Job + Job Parameter 로 Job Key 가 결정되는데 동일한 Job Key 일 경우 실행이 안된다.   * Job은 Job + Job Parameter 로 Job Key 가 결정되는데 동일한 Job Key 일 경우 실행이 안된다.
줄 98: 줄 108:
  
 ===== RunIdIncrementer 사용시 기존 파라미터가 현재 파라미터 지정한 것을 덮어씀  ===== ===== RunIdIncrementer 사용시 기존 파라미터가 현재 파라미터 지정한 것을 덮어씀  =====
-  * ''RunIdIncrementer''를 사용하게 되면 항상 기존 실행됐던 Job의 파라미터가 현재 파라미터를 덮어쓰는 현상이 발생한다.+  * ''RunIdIncrementer''를 사용하게 되면 기존 job이 패했을 경우 기존 실패 Job의 파라미터가 현재 파라미터를 덮어쓰는 현상이 발생한다.
   * 이유는 ''RunIdIncrementer''가 동일 파라미터로 Job을 실행하려고 사용하는 것이라서 인 듯 하다.   * 이유는 ''RunIdIncrementer''가 동일 파라미터로 Job을 실행하려고 사용하는 것이라서 인 듯 하다.
-  * 따라서 ''RunIdIncrementer''를 사용하면서도 파라미터를 유지하려면 다른 방식을 써야 한다.+  * 따라서 ''RunIdIncrementer''를 사용하면서도 파라미터 값을 유지하려면 다른 방식을 써야 한다. 
 +  * [[https://jojoldu.tistory.com/487|Spring Batch의 유니크 Job Parameter 활용하기]]
   * [[https://github.com/codecentric/spring-boot-starter-batch-web/issues/38|optional/omitted jobParameters are reloaded from previous jobs · Issue #38 · codecentric/spring-boot-starter-batch-web]]   * [[https://github.com/codecentric/spring-boot-starter-batch-web/issues/38|optional/omitted jobParameters are reloaded from previous jobs · Issue #38 · codecentric/spring-boot-starter-batch-web]]
  
줄 129: 줄 140:
  
 > o.s.b.c.l.AbstractListenerFactoryBean    : org.springframework.batch.item.ItemReader is an interface.  The implementing class will not be queried for annotation based listener configurations.  If using @StepScope on a @Bean method, be sure to return the implementing class so listner annotations can be used. > o.s.b.c.l.AbstractListenerFactoryBean    : org.springframework.batch.item.ItemReader is an interface.  The implementing class will not be queried for annotation based listener configurations.  If using @StepScope on a @Bean method, be sure to return the implementing class so listner annotations can be used.
 +> org.springframework.batch.item.ItemReader는 인터페이스입니다. 구현 클래스는 어노테이션 기반 listener 구성에 대해 실행되지 않습니다. @Bean 메소드에서 @StepScope를 사용하는 경우 listner 어노테이션을 사용할 수 있도록 구현 클래스를 리턴해야합니다.
 +
 +
  
  
springframework/batch.1586997487.txt.gz · 마지막으로 수정됨: 2020/04/16 09:38 저자 kwon37xi