[스프링 배치] skip 설정에 관하여..

1,716 views
Skip to first unread message

kooma

unread,
Jun 7, 2010, 10:20:29 PM6/7/10
to Korea Spring User Group
안녕하세요. 저는 스프링 배치를 짜고있는 초보 프로그래머입니다.
점점 더워가는 날씨에 졸음만 더해가는 계절이 다가오네요.
스프링 배치를 적용해 볼까 해서 보기 시작한지 2달이 다 되어가고...
영문 레퍼런스를 읽다보면 멍~하니 어느새 졸고있는...ㅜ

아...인사는 이쯤에서 마무리하고 본론으로 들어가서..

제 주제가 spring batch 에서 skip 정의하는 부분에 관한 것인데요
아래 job 과 itemReader 설정 부분을 보시면

<batch:job id="sampleJob" parent="abstractJob" restartable="true">
<batch:step id="sampleStep">
<batch:tasklet start-limit="10" allow-start-if-
complete="false">
<batch:chunk reader="sampleCastorReader"
processor="sampleProcessor"
writer="sampleIBatisWriter" reader-transactional-queue="true"
skip-limit="2" commit-interval="5">
<batch:skippable-exception-classes>
<batch:include class="java.lang.Exception" />
<batch:exclude class="java.io.FileNotFoundException" />
</batch:skippable-exception-classes>
</batch:chunk>
<batch:transaction-attributes isolation="DEFAULT" />
</batch:tasklet>
</batch:step>
</batch:job>

<bean id="sampleCastorReader"
class="org.springframework.batch.item.xml.StaxEventItemReader">
<property name="fragmentRootElementName" value="unit" />
<property name="resource" value="classpath:data/xmls/sample-
read.xml" />
<property name="unmarshaller" ref="sampleCastorMarshaller" />
</bean>

<bean id="sampleCastorMarshaller"
class="org.springframework.oxm.castor.CastorMarshaller">
<property name="mappingLocation" ref="sampleMarshallerResource" />
<property name="validating" value="true" />
<property name="encoding" value="utf-8" />
</bean>

<bean id="sampleMarshallerResource"
class="org.springframework.core.io.FileSystemResource">
<constructor-arg value="src/main/resources/configCastor/xml-
mapping-sample.xml" />
</bean>

Exception이 던져지지 않는 한 이상없이 잘 실행됩니다.
문제는 읽어들일 xml파일의 한 부분을 스키마 정의와 다르게 타입을 변형하여 수정한 후 skip이 되는지 테스트 하는 과정에서
org.springframework.oxm.castor.CastorUnmarshallingFailureException 이 발생
하는 것 까지는 확인이 되었는데 skip이 1개 처리된 후에는 무조건 작업이 중단되어 버리네요.
디버깅해 보면 다음 읽어들일 아이템이 null 이 되어 exitStatus가 FINISHED 가 되어 버리는 상황이...
xml Reader 는 skip 1개로 그냥 중단..그리고 execution status는 completed...;;
위 설정에서 reader만 FlatFileReader 로 처리했을 때에는 skip-limit에 맞게 skip 되고
jobRepository에 persist 되고 잘 동작하던 것이었는데...


대략 제 의견을 적어보면...
1. xml Reader는 기본적으로 schema 유효성 검사를 마친 후에 배치잡을 돌려야 하는것인지...
2. 아니면 castor oxm만 예외적으로 이렇게 동작을 하는 것인지...
3. 아니면 제일 유력한 것으로 제가 잘못 한 것인지...;;;

좀 명확한 해답을 구하는 입장에서 게시해 봅니다. ^^;

그럼 오늘하루도 힘내세요~!! 대~~한 민국!

Sanghyuk Jung

unread,
Jun 8, 2010, 12:08:17 AM6/8/10
to ks...@googlegroups.com
안녕하세요,
 
 skippable-exception에 java.lang.Exception이 정의되어 있는데,  xml 파일의 전체적인 정합성이 안 맞아서 전혀 파일  파싱이 안 되니 skip 1건으로 기록되고 종료되는거 같네요; 비슷한 경우를 실행시켜 보지는 않았는데, 상황 설명해주신 것으로봐서는 지금의 동작이 정상(?)인 것 같습니다.
 
 해당 job은 일단 failure가 나는 것이 정상일 거 같으므로  skippable-exception에 CastorUnmarshallingFailureException 나 그것을 감싸서 던지는 Exception을 exclude를 시키는 것이 낳지 않을까 합니다.
 
StepExecutionListener.beforeStep 같은데서 따로 파일의 정합성만을 검사하는 로직을 추가할 수도 있겠지만, 그것보다는 어짜피 읽으려고 시도할 때 Exceptoin을 발생하므로, 따로 이벤트 통지등이 필요하다면 ItemReadListener.onReadError같은 것을 활용할 수 있지 않을까해요.
 
암튼 java.lang.Exception보다는 더 정교한 Exception 선언 정책을 가지고 가는게 바람직하지 않나 하는 생각이 들어요 ^^;

2010년 6월 8일 오전 11:20, kooma <nostal...@gmail.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


kooma

unread,
Jun 8, 2010, 4:08:39 AM6/8/10
to Korea Spring User Group
네..우선적으로 답글에 대해 감사드립니다. ^^

제가 java.lang.Exception 대신 디버그모드에서 캐치된
org.springframework.oxm.castor.CastorUnmarshallingFailureException 과
org.xml.sax.SAXException 을 include 해보았지만 현상은 똑같았습니다.
내부적으로 발생한 exception threads 을 iterator 형식으로 루프를 돌려서 제일 마지막 즉, 단말의
exception 만을 취해서
jobRepository 에 기록하는 듯 하구요..그 이후에 다음 item을 가져오는 부분에서 null 값이 옴으로 인해서 정
상 종료가 되는 듯 합니다.
아직 실력이 미비하여 정확하게 기술은 못하겠네요..^^;
테스트 결과 java.lang.Exception 으로 러프하게 선언 정책을 잡은 것이 문제는 아닌 듯 해요.

xml reader 가 fragment 단위로 읽어들이는데 unmarshalling 도중 문제가 생기면 다음 fragment
를 못읽어오는 이유가 무엇인지...
좀 더 확실하게 살펴봐야할 부분인듯 싶네요.

skip listener 로 인터셉트한 후에 다음 fragment 를 읽도록 executionContext 를 이용하여 제어하
는 방법도 생각해 보고있구요
아니면 읽기 전에 xml 파일들을 스키마 validate 검사를 거친 후 문제되는 fragment 들만 따로 파일로 빼놓고 진행
하는 것도 생각중인데요..
파일들이 여러개일 경우 partition job 으로 step 들을 파일단위로 분리하여 각자 처리하도록 하고 있어서
validation 체크를 하는 비용도 따져봐야 할 듯요.
배치잡 성격상 전체 시스템에 어떠한 영향을 끼칠지를 먼저 심사숙고해 봐야할 듯 하네요.

On 6월8일, 오후1시08분, Sanghyuk Jung <bene...@gmail.com> wrote:
> 안녕하세요,
>
> skippable-exception에 java.lang.Exception이 정의되어 있는데, xml 파일의 전체적인 정합성이 안
> 맞아서 전혀 파일 파싱이 안 되니 skip 1건으로 기록되고 종료되는거 같네요; 비슷한 경우를 실행시켜 보지는 않았는데, 상황
> 설명해주신 것으로봐서는 지금의 동작이 정상(?)인 것 같습니다.
>
> 해당 job은 일단 failure가 나는 것이 정상일 거 같으므로 skippable-exception에
> CastorUnmarshallingFailureException 나 그것을 감싸서 던지는 Exception을 exclude를 시키는 것이
> 낳지 않을까 합니다.
>
> StepExecutionListener.beforeStep 같은데서 따로 파일의 정합성만을 검사하는 로직을 추가할 수도 있겠지만,
> 그것보다는 어짜피 읽으려고 시도할 때 Exceptoin을 발생하므로, 따로 이벤트 통지등이 필요하다면
> ItemReadListener.onReadError같은 것을 활용할 수 있지 않을까해요.
>
> 암튼 java.lang.Exception보다는 더 정교한 Exception 선언 정책을 가지고 가는게 바람직하지 않나 하는 생각이 들어요
> ^^;
>

> 2010년 6월 8일 오전 11:20, kooma <nostalgia...@gmail.com>님의 말:

> > 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com<ksug%2Bunsu...@googlegroups.com>로
> > 이메일을 보내주세요.
> > 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -

Sanghyuk Jung

unread,
Jun 8, 2010, 9:36:35 AM6/8/10
to ks...@googlegroups.com
네, 말씀하신 것을 들으니 전체 파싱에 문제가 아니고 fragment의 파싱에서 에러가 나도 그런 현상이 생기나보네요 Caster만의 문제인지, 다른 라이브러리도 그런지 궁금하네요
 
 혹시 XML 스키마를 어떻게 바꿔서 에러를 내셨는지 공유해주실수 있을까요? 전 Jaxb하고 XSream만 써봤기는했는데,  xml에서 스키마와 안 맞아서 생기는 에러상황은 못 만나봐서 같은 상황에서 다른 라이브러리가 어떨지는 모르겠네요. 간단한 거면 한가할 때 한번 실험해보겠습니다 ^^;
 
 
 

 
2010년 6월 8일 오후 5:08, kooma <nostal...@gmail.com>님의 말:

kooma

unread,
Jun 9, 2010, 2:26:25 AM6/9/10
to Korea Spring User Group
아..스키마를 바꾼건 아니구요.
그 스키마를 참조하는 xml 문서내의 데이터를 변경해서 Exception 을 발생시켜 봤습니다.
예를들면 <element name="sample" type="integer" /> 라는 엘리먼트가 정의된 상태에서
xml instance 문서 내에서는 <sample>123</sample> 와 같이 데이터를 받는게 정상적이나
<sample>일이삼</sample> 로 했을 경우에는 매핑에서 부터 데이터 캐스팅이 안되어 문제가 생기니
Unmarshalling Exception 이 발생하더라구요.
단지 스키마와 인스턴스 문서 사이의 유효성 문제가 아니라
Castor 가 스키마를 참조해서 코드제네레이션하는 기능이 있어서 생성된 bean class 들의 타입이 스키마에서 정의한 데
로 따라가거든요.
보통은 CastException 을 예상했는데
CastorUnmarshallingFailureException 이 던져지고 SaxException 까지 호출되고 끝이라
는..;;
RuntimeException 도 include 해봤지만...결과는 똑같구요..
skip 처리 후 다음 fragment 를 못읽어 오는 이유를 찾아봐야 할텐데..흠..

혹시 Jaxb 나 XStream 에서는 입력 데이터를 받을 때 타입이 틀리면 어떻게 되는지 테스트 해보셨으면 어떻게 처리 되었는
지 상황설명 좀 부탁드릴게요~
저도 내일 쯤이면 XStream 으로 간단 테스트는 해봐야겠네요..^^
지금은 spring batch admin 을 이용해서 모니터링을 설계해 보는 중이라..ㅋ

저녁엔 주문해 놓은 붉은악마 응원복 가지러~ㄱㄱ싱~
이제 D-day 3 네요..ㅋ
12일 그리스전때 괜찮은 응원장소 아시면 추천도 같이 좀...^^;


On 6월8일, 오후10시36분, Sanghyuk Jung <bene...@gmail.com> wrote:
> 네, 말씀하신 것을 들으니 전체 파싱에 문제가 아니고 fragment의 파싱에서 에러가 나도 그런 현상이 생기나보네요 Caster만의
> 문제인지, 다른 라이브러리도 그런지 궁금하네요
>
> 혹시 XML 스키마를 어떻게 바꿔서 에러를 내셨는지 공유해주실수 있을까요? 전 Jaxb하고 XSream만 써봤기는했는데, xml에서
> 스키마와 안 맞아서 생기는 에러상황은 못 만나봐서 같은 상황에서 다른 라이브러리가 어떨지는 모르겠네요. 간단한 거면 한가할 때 한번
> 실험해보겠습니다 ^^;
>

> 2010년 6월 8일 오후 5:08, kooma <nostalgia...@gmail.com>님의 말:

> > <ksug%2Bunsu...@googlegroups.com<ksug%252Buns...@googlegroups.com>

Reply all
Reply to author
Forward
0 new messages