스프링 배치에서 JOB 통계를남기려면 어떻게 할가요?

1,221 views
Skip to first unread message

나연우

unread,
Oct 21, 2009, 4:28:13 AM10/21/09
to Korea Spring User Group
스프링 배치에서 JOB이 종료된이후에 해당 JOB에서

처리해야 할 전체 건수
정상처리된건수
오류건수

이런 정보를 알고자 합니다. 어떻게 해야 할까요?
batch_step_execution에 있는 read_count에는 해당 step에서 ItemReader을 통하여
읽혀진 카운트가 들어가 있어서 읽어야할 전체 카운트는 찾을수가 없습니다.

좋은 방법이 없을까요?

Sanghyuk Jung

unread,
Oct 21, 2009, 6:16:57 AM10/21/09
to ks...@googlegroups.com
'읽어야할 전체 카운트'와 '읽혀진 카운트'의 차이가 발생하는 시점이 어디인가요?
 
Step이 지나면서 점점 읽혀지는 것이 줄어드는 것인가요? Job의 형태를 대략적으로 설명해주시면 같이 고민을 해보는데 도움이 될 것 같습니다.

2009년 10월 21일 오후 5:28, 나연우 <sssi...@gmail.com>님의 말:

나연우

unread,
Oct 21, 2009, 8:47:44 PM10/21/09
to Korea Spring User Group
ItemReader을 통하여 1000건의 데이터를 읽어야 하는데 10건을 읽고 오류가 발생하게 되면
Stpe이 종료되어서 전체 읽어야 할건수가 1000인지를 체크를 할수 없어서
질문을 올렸습니다.

다시 문서을 찾아 보니 skippable-exception-classes 을 이용하여 오류 발생시 Skip을 하도록 하고
SkipListener을 구현하여서 익셉션이 발생한 Item의 로그가 남도록 하면
전체 처리해야 할 건수와 오류 건수를 파악 할수 있겠네요.

정상혁님의 문서 ,박찬욱님의 문서를 참조하면서 많은 도움을 받고 작업을 하고 있는데
아직 실력이 미천하여 지대로 작업 하고 있는지 하면서도 의문이 드네요.

정상혁님 제가 제대로 파악 하고 있는 것일까요?

On 10월21일, 오후7시16분, Sanghyuk Jung <bene...@gmail.com> wrote:
> '읽어야할 전체 카운트'와 '읽혀진 카운트'의 차이가 발생하는 시점이 어디인가요?
>
> Step이 지나면서 점점 읽혀지는 것이 줄어드는 것인가요? Job의 형태를 대략적으로 설명해주시면 같이 고민을 해보는데 도움이 될 것
> 같습니다.
>

> 2009년 10월 21일 오후 5:28, 나연우 <sssin9...@gmail.com>님의 말:


>
>
>
> > 스프링 배치에서 JOB이 종료된이후에 해당 JOB에서
>
> > 처리해야 할 전체 건수
> > 정상처리된건수
> > 오류건수
>
> > 이런 정보를 알고자 합니다. 어떻게 해야 할까요?
> > batch_step_execution에 있는 read_count에는 해당 step에서 ItemReader을 통하여
> > 읽혀진 카운트가 들어가 있어서 읽어야할 전체 카운트는 찾을수가 없습니다.
>

> > 좋은 방법이 없을까요?- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -

Sanghyuk Jung

unread,
Oct 21, 2009, 9:12:02 PM10/21/09
to ks...@googlegroups.com
아래에 있는 메타데이터 테이블을 보면
 
SKIP에 대한 3가지 속성이 보입니다.
read_skip_count
write_skip_count
process_skip_count
 
여기가 그런 skip 건수를 기록하기 위한 공간입니다. 각 skip_count의 정확한 조건은 아직 저도 파악해보지 못했는데, 이번 기회에 한번 소스를 보고 말씀드리겠습니다 ^^;
 
 
 
 
스프링배치 2.0에 대한 추가적인 자료나 각종 삽질을 방지하기 위한 글을 쓰려고 준비중인데, 정리되는대로 KSUG를 통해서 알려드리겠습니다. (몇달째 그냥 지나고 있군요 ^^; )

 
2009년 10월 22일 오전 9:47, 나연우 <sssi...@gmail.com>님의 말:

박성철

unread,
Oct 21, 2009, 9:26:32 PM10/21/09
to ks...@googlegroups.com
책에 들어갈 내용을 KSUG에 최초 공개하시는 건가요?
기대하겠습니다. +_+

Sanghyuk Jung 쓴 글:
아래에 있는 메타데이터 테이블을 보면
 
SKIP에 대한 3가지 속성이 보입니다.
read_skip_count
write_skip_count
process_skip_count
 
여기가 그런 skip 건수를 기록하기 위한 공간입니다. 각 skip_count의 정확한 조건은 아직 저도 파악해보지 못했는데, 이번 기회에 한번 소스를 보고 말씀드리겠습니다 ^^;
 
 
 
 
스프링배치 2.0에 대한 추가적인 자료나 각종 삽질을 방지하기 위한 글을 쓰려고 준비중인데, 정리되는대로 KSUG를 통해서 알려드리겠습니다. (몇달째 그냥 지나고 있군요 ^^; )

 
2009년 10월 22일 오전 9:47, 나연우 <sssi...@gmail.com>님 의 말:
ItemReader 을 통하여 1000건의 데이터를 읽어야 하는데 10건을 읽고 오류가 발생하게 되면

Sanghyuk Jung

unread,
Oct 21, 2009, 9:43:00 PM10/21/09
to ks...@googlegroups.com
read_skip_count
write_skip_count
process_skip_count
 
속성들은 각각 read와 write, process시 Exception등에 대한 skip policy에 따라서 기록되네요.
 
그리고 processor에서 null값으로 return되어서 filtering된 건은 filter_count라는 속성에 기록됩니다. ItemProcessor를 이용해서 skip할 건을 체크하는 편이 더 편하다면 이 속성을 이용할 수도 있습니다.
 
 


 
2009년 10월 22일 오전 10:26, 박성철 <gyu...@gmail.com>님의 말:

Sanghyuk Jung

unread,
Oct 21, 2009, 9:47:36 PM10/21/09
to ks...@googlegroups.com
그리고 스프링배치 책은 나오게 된다면 KSUG분들을 대상으로 베타리더로 모집할 생각을 하고 있습니다 ^^;
 
책에는 기초 활용법 위주로 쓰자는 의견이 있어서 어떤 내용이 들어가고 빠질지는 아직도 고민중인데, 책에 들어갈 수 없는 내용도 KSUG를 통해서는 공유할 수 있을 듯합니다.
 

 
2009년 10월 22일 오전 10:43, Sanghyuk Jung <ben...@gmail.com>님의 말:

박성철

unread,
Oct 21, 2009, 10:25:31 PM10/21/09
to ks...@googlegroups.com
줄서요. (아자 1등) ㅎㅎ
기대가 큽니다.

그런데 너무 초보적인 내용만 있는 것도 그렇고요. 굳이 고급 내용을 다 넣지 않더라도 간단한 정보나 어떤어떤  것들이 있다는 것은 짚어주는 것이 좋을 것 같습니다.

어제 누군가가 저에게 웹에서 쓰던 (DAO를 주입 받아 쓰는) 서비스를 배치에서 그대로 쓸 수 없냐고 물어봤는데 책에 나오나요? ㅋㅋ

Sanghyuk Jung 쓴 글:
그리고 스프링배치 책은 나오게 된다면 KSUG분들을 대상으로 베타리더로 모집할 생각을 하고 있습니다 ^^;
 
책에는 기초 활용법 위주로 쓰자는 의견이 있어서 어떤 내용이 들어가고 빠질지는 아직도 고민중인데, 책에 들어갈 수 없는 내용도 KSUG를 통해서는 공유할 수 있을 듯합니다.
 

 
2009년 10월 22일 오전 10:43, Sanghyuk Jung <ben...@gmail.com>님 의 말:

Sanghyuk Jung

unread,
Oct 21, 2009, 10:50:52 PM10/21/09
to ks...@googlegroups.com
다른 모듈에서 쓰던  클래스를 연결시킬 수 Adaptor를 제공하기 때문에, 조건만 잘 맞으면 기존 클래스를 Spring배치의 인터페이스에 맞추거나 Wrapping단을 안 두어도 연결가능합니다.
 Step레벨(CallableTaskletAdapter,MethodInvokingTaskletAdapter)이나 Reader(ItemReaderAdapter)단위, Writer단위temWriterAdapter)모두 존재합니다. 주로 Writer단위가 가장 연결이 편해보이더군요.
 
 배치는 워낙 시나리오가 다양한 것 같아요.
 
로 연결해서 쓰는 것도 가능하구요, 아니면 Http

2009년 10월 22일 오전 11:25, 박성철 <gyu...@gmail.com>님의 말:

안영회

unread,
Oct 21, 2009, 10:53:00 PM10/21/09
to ks...@googlegroups.com
어떤 내용이 들어가고 빠질지는 아직도 고민중인데, 책에 들어갈 수 없는 내용도 KSUG를 통해서는 공유할 수 있을 듯합니다.

다음 사항을 포함한다면 어떨까요?

  • PL-SQL로 작성한 배치 프로그램 > Spring Batch 프로그램 변환
  • 배치 프로그램 자동화 테스트

박성철

unread,
Oct 21, 2009, 10:54:55 PM10/21/09
to ks...@googlegroups.com

  • PL-SQL로 작성한 배치 프로그램 > Spring Batch 프로그램 변환
  • 배치 프로그램 자동화 테스트

오.. 둘 다 멋져요.
특히 Spring Batch로 바꾸는 건 단계별로 진행하면서 Batch의 기능을 하나씩 소개하는 것도 좋겠어요.


나연우

unread,
Oct 21, 2009, 11:05:12 PM10/21/09
to Korea Spring User Group
질문에 대해서 즉각적으로 답이 오니 너무 좋은거 같습니다.

혼자끙끙 거리는 것에 대해서 여러 의견들을 들으니.
다시 한번 생각해 볼수 있는 기회가 되는거 같아 좋습니다.

그리고 책도 빨리 나왔으면 좋겠네요.

책이 나온다면 국내 처음 으로 나오는것이 되겠네요..
많은 도움이 되리라 기대 하고 있겟습니다.

On 10월22일, 오전11시54분, 박성철 <gyu...@gmail.com> wrote:
> > * PL-SQL로 작성한 배치 프로그램 > Spring Batch 프로그램 변환
> > * 배치 프로그램 자동화 테스트


>
> 오.. 둘 다 멋져요.
> 특히 Spring Batch로 바꾸는 건 단계별로 진행하면서 Batch의 기능을 하나씩
> 소개하는 것도 좋겠어요.
>
>
>

나연우

unread,
Oct 21, 2009, 11:12:39 PM10/21/09
to Korea Spring User Group
<step id="excInitDataLoad_01" next="excInitDataLoad_02">
<tasklet allow-start-if-complete="true">
<chunk reader="excInitDataLoad_01_select"
writer="excInitDataLoad_01_insert" commit-interval="1" skip-
limit="10">
<skippable-exception-classes>
<![CDATA[
java.lang.Exception
]]>
</skippable-exception-classes>

</chunk>
<listeners>
<batch:listener ref="steplogginglistener"/>
</listeners>
</tasklet>
</step>

위와 같이 모든 Exception 대하여 스킵을 하도록 하였구요
ItemReader를 통하여 읽게 되는 건수는 5건이 있습니다.
이 5건은 이미 DB에 있어서 모두 중복 PK에러가 발생하도록 되어 있는데요

BATCH_JOB_EXECUTION에 아래와 같이 나왔네요

COMMIT_COUNT : 6
READ_COUNT : 5
FILTER_COUNT : 5
WRITER_COUNT : 0
READ_SKIP_COUNT : 0
WRITER_SKIPCOUNT : 5
ROLLBACK_COUNT : 10

여기에서 COMMIT_COUNT: 6건과
ROLLBACK_COUNT : 10건이 어떻게 나올수 잇는것인지 이해가 되지 않네요.

제생각으로는 COMMITCOUNT 도 5 ROLLBACK_COUNT : 0이 되어야 하지 않나요?

> > - 원본 텍스트 보기 -- 원본 텍스트 숨기기 -

Sanghyuk Jung

unread,
Oct 22, 2009, 12:23:55 AM10/22/09
to ks...@googlegroups.com
두가지만 확인해 주시면 나름대로 짐작되는 흐름을 파악해보겠습니다.
1. ItemWriter는 JdbcBatchItemWriter쓰시는 것이 맞으신가요?
2. JobParameter는 어떤 방식으로 생성하시나요?
 


 
2009년 10월 22일 오후 12:12, 나연우 <sssi...@gmail.com>님의 말:

나연우

unread,
Oct 22, 2009, 2:08:58 AM10/22/09
to Korea Spring User Group
다시한번 빠른 답변에 감사 드립니다.

1. ItemWriter는 JdbcBatchItemWriter쓰시는 것이 맞으신가요?

아래와같이 IbatasBatchItemWriter를 사용하고 있습니다.

<bean id="excInitDataLoad_01_insert"
class="org.springframework.batch.item.database.IbatisBatchItemWriter">
<property name="statementId" value="CF_INST_FV_BAS.INSERT01" /
>
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>


2. JobParameter는 어떤 방식으로 생성하시나요?

아래와 같이 Launch 하는 부분에서 하드코딩을하여 사용하고 있습니다.

public void testLaunchJob() throws Exception {
this.logger.debug("validatePostConditions");
Map param = new HashMap();
param.put("PROC_YMD", new JobParameter("20090831"));
param.put("CORP_SECD", new JobParameter("TI01"));

this.jobParameters = new JobParameters(param);
this.jobExecution = getLauncher().run(this.job,
this.jobParameters);

....

<bean id="excInitDataLoad_01_select"

class="org.springframework.batch.item.database.IbatisPagingItemReader"
scope="step">
<property name="queryId" value="excInitDataLoad_01_select" />
<property name="sqlMapClient" ref="sqlMapClient" />
<property name="parameterValues">
<map>
<entry key="PROC_YMD" value="#{jobParameters
[PROC_YMD]}"/>
</map>
</property>
</bean>
..

On 10월22일, 오후1시23분, Sanghyuk Jung <bene...@gmail.com> wrote:
> 두가지만 확인해 주시면 나름대로 짐작되는 흐름을 파악해보겠습니다.
> 1. ItemWriter는 JdbcBatchItemWriter쓰시는 것이 맞으신가요?
> 2. JobParameter는 어떤 방식으로 생성하시나요?
>

> 2009년 10월 22일 오후 12:12, 나연우 <sssin9...@gmail.com>님의 말:

Sanghyuk Jung

unread,
Oct 22, 2009, 4:27:52 AM10/22/09
to ks...@googlegroups.com
같은 job parameter로 여러번 실행했을 때 값이 변화추세(?)가 어떻게 되는지도 한번 확인해보시기 바랍니다.
 
나머지는 저도 한번 비슷한 예제를 만들어서 시험해보고 말씀드리겠습니다~

2009년 10월 22일 오후 3:08, 나연우 <sssi...@gmail.com>님의 말:
Reply all
Reply to author
Forward
0 new messages