Spring Batch (6) - Test & Debug

이슈 사항

 - 특정 폴더 내의 파일을 읽어 들여야 한다.
 : MultiResourceItemReader을 이용하여 문제 사항 처리
   (단 MultiResourceItemReader에 delegate할 Reader는 ResourceAwareItemReaderItemStream를 implement 해야한다.
   이번 경우는 직접 Reader를 구현하였기 때문에 implement에 ResourceAwareItemReaderItemStream를 추가 하였음
  
 - DB 조회 하여 조회 된 결과가 있으면 입력 값을 수정 하여야 한다.
 : 해당이슈는 Processor에서 DB를 조회(Mybatis 이용)해야하는데
org.springframework.dao.TransientDataAccessResourceException: Cannot change the ExecutorType when there is an existing transaction
위와 같은 오류가 발생
Transaction문제로 판단되어서 org.mybatis.spring.SqlSessionFactoryBean에 대한 Bean을 추가 등록하여 Processor에서 조회하는 DAO에 적용 하니 문제가 해결되었음
(이번 케이스는 readOnly이고 조회 밖에 안하니깐 트랜젝션의 Propagation는 상관 없음..그러나 insert를 한다면 =_=; Writer를 써야 할듯)
- Writer 이슈 : affected row가 반드시 있어야 한다.
: batch 재 시작시 처음 부터 다시 시작한다는 정책 변경으로 batch repository를 mysql에서 내부 db로 변경 하였다.
그로 인해 중복된 데이터의 insert를 막기 위해 해당 테이블에는 unique key가 설정 하였다.(뭐 그게 아니더라도 당연히 했어야 하지만)
그래서 writer에서 사용하는 insert 구문을 replace로 변경하였다.
물론 잘 돈다.
근데 좀 느린거 같은 기분이 찜찜 ㅠㅠ
다른 방법을 모색 하다가 그냥 replace를 insert로 변경하고 on duplication update를 사용하였는데 업데이트할 대상은 없다는게 고민이 되었다. 
일단 임시로 index가 없는 임의 field를 자기 할당을 하여 땜빵질을 했다. =_=;; 변태스러운 sql문을 만들다니. ㅠㅠ

Debug

- 'org.springframework.dao.InvalidDataAccessResourceUsageException: Batch execution returned invalid results. Expected 1 but number of BatchResult objects returned was 2'
: Writer에서 반영된 건수가 다수일 경우 발생하는데 해당 문제는 아래의 Q&A를 확인
[https://code.google.com/p/mybatis/issues/detail?id=741]
위 글을 보면 =_= 버전 문제 였음
아래와 같이 pom.xml에 dependency 등록
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.0</version>
</dependency>
But 버전을 올리는 순간 Caused by: java.lang.NoClassDefFoundError: org/apache/ibatis/mapping/DatabaseIdProvider 오류 발생
아..이분들이 팩키징을 잘못 했나 싶어 아래와 같은 dependency 등록
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
이로서 문제는 해결 ^^
- CompositeItemWriter를 이용하여 Writer를 구현하였는데 하나의 Writer는 Item에 대해 1:1인 반면 다른 Writer는 0-N 관계 즉 입력이 리스트이고 리스트 크기가 0~N 이때 Query Exception 발생
: 입력된 리스트가 없을 경우 Mybatis Mapper에서 Insert 구문을 감싸게 IF문을 걸어줌
IF 조건에 맞지 않을 경우 Query Exception이 발생하고 Error  ~~Empty Query~ 라는 에러 메세지가 발생
그래서 해당 Exception는 skip Exception으로 등록 하려는데 Query Exception의 발생 범위가 Empty Query로 인해 발생 하는 범위 보다 크고, Skip Exception 등록 시 Skip Count를 설정하려고 했지만 최악의 경우 매번 발생한다면 Skip Count를 지정하기 어려움이 있었음
그래서 MyBatisBatchItemWriter를 상속 받은 임의 Writer Class 만들고 write 시 Exception을 받아 Exception Message에 "Empty Query" 문구가 substring일  경우 Exception을 내보내지 않는 방법으로 처리


- 그리고 아직 진행중 ㅠㅠ maven을 통해 어여 배포하고 테스트하고 log도 강화하고 ㅠㅠ
해야겠답


댓글

이 블로그의 인기 게시물

Spring Batch - JobParameters Default Value 만들기

Hsqldb Server 재기동 시 오류