아...인사는 이쯤에서 마무리하고 본론으로 들어가서..
제 주제가 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. 아니면 제일 유력한 것으로 제가 잘못 한 것인지...;;;
좀 명확한 해답을 구하는 입장에서 게시해 봅니다. ^^;
그럼 오늘하루도 힘내세요~!! 대~~한 민국!
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
제가 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에서 그룹을 방문하세요.- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -
혹시 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>