spring batch 관련 질문

579 views
Skip to first unread message

규우

unread,
May 18, 2011, 8:19:44 AM5/18/11
to Korea Spring User Group
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">


<bean id="jobDetailFactoryBean"

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="targetUserCleanBatch" />
<property name="targetMethod" value="execute" />
<property name="concurrent" value="false" />
</bean>


<!--
second (0-59)
minutes (0-59)
hours (0-23)
day of month (1-31)
month (1-12)
day of week (1-7 or SUN-SAT)
-->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetailFactoryBean" />
<property name="cronExpression" value="* 30 * * * ?" />
</bean>

<bean
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>

</beans>

위와 같이 매시 30분에 배치가 구동되게 설정을 하고 있는 상태입니다.
간혹 1초마다 배치가 구동되는 현상이 있는데 혹시 이런 경험 해보신 분 계신가요?

처음 겪어 보는 증상이라 참 난해하네요.

파란하늘

unread,
May 18, 2011, 9:21:55 AM5/18/11
to ks...@googlegroups.com, Korea Spring User Group


설정과 다르게 시간이 동작한게 아닌경우를 가정한다면

이전 job의 thread가 쌓여 있는 경우도 확인해보셔야 할 것 같습니다.



thread 갯수를 설정하지 않으면 기본으로 10개(5개?)의 thread를 생성하여 job을 실행하게 됩니다.

옵션에 concurrent가 true면 해당 시간마다 job이 생성되어 쓰레드에 담기고 실행되며

false면 앞의 job이 종료되면 다음 thread를 실행합니다.

결국 false의 경우 정확한 시간에 해당 job이 수행되는 것을 보장하지는 않습니다. (수행 번호표를 뽑고 앞의 thread에 담긴 job이 모두 끝나기를 기다립니다..)

true로 하면 동시 수행에 대한 무결성 체크를 별도로 구현을 해야하구요.


각 job의 수행시간과 thread가 쌓이는 경우에 대한 모니터링을 해보셔야 좀더 명확한 해답을 얻을 수 있지 않을까 싶습니다.


도움이 될런지 모르겠네요;;;

(이래 답변해드리고 진짜1초마다 실행하는 거면 대략 난감이네요.-ㅅ-;;)


좋은하루되세요. (__)


--------- 원본 메일 ---------
보낸사람: 규우 <lng...@gmail.com>
받는사람 : Korea Spring User Group <ks...@googlegroups.com>
날짜: 2011년 5월 18일 수요일, 21시 19분 44초 +0900
제목: [KSUG] spring batch 관련 질문
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+unsub...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.






이남규

unread,
May 18, 2011, 12:43:31 PM5/18/11
to ks...@googlegroups.com
음. 잘 이해가 안 가는 부분이 있습니다.
concurrent false 인 상태에서 현재 매 시 30분에 배치가 돌고 있고, 해당 배치는 3초 정도의 시간이 소요되고 종료됩니다.
즉, 쓰레드가 생성되어 배치를 처리한 후, 해당 쓰레드는 종료되고 있습니다.

위의 근거를 토대로 답변 달아주신 내용을 보면  false면 앞의 job이 종료되면 다음 thread를 실행합니다 라고 하셨는데요.
해당 내용에 대해 잘 이해가 되지 않습니다. 배치 job이 끝났는데 왜 또 다음 thread를 실행하나요?


2011년 5월 18일 오후 10:21, 파란하늘 <luve...@hanmail.net>님의 말:
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.

Sanghyuk Jung

unread,
May 18, 2011, 8:49:35 PM5/18/11
to ks...@googlegroups.com
안녕하세요, 먼저 위의 질문은 Spring Batch와는 관련이 없습니다.
Spring Batch는 Spring portfolio의 하위 프로젝트 이름으로, Quartz와는 직접적인 의존관계가 없습니다.
질문하신 코드는 Spring의 Quartz 지원 클래스인 SchedulerFactoryBean에 대한 내용이네요

'매시30분'구동한다고 하셨는데, CronExpression은 "* 30 * * * ?"으로 되어 있습니다.

이 표현식은 매시 30분의 매1초마다 실행됩니다. 첨부한 파일에 있는 아래 테스트 코드를 실행해보면 확인이 됩니다.

30분 1초, 30분 2초, 30분 3초 이렇게 해서 1시간에 60번씩 실행되는 것이죠

@Test
public void jobShouldBeLaunchedEverySecondsOf30min()
throws ParseException {
new CronTrigger();
CronTrigger trigger = new CronTrigger();
trigger.setCronExpression("* 30 * * * ?");
String initialTime = "2010/09/01 09:00:00";
List<String> expectedTimeList = Arrays.asList(
"2010/09/01 09:30:00",
"2010/09/01 09:30:01", 
"2010/09/01 09:30:02",
"2010/09/01 09:30:03");
assertSchedule(trigger, initialTime, expectedTimeList, DATE_PATTERN);
}

한시간 당 한번에 실행되는 의도라는 '0 30 * * * ?'로 하셔야 합니다.

@Test public void jobShouldBeLaunchedEvery30min() throws ParseException { CronTrigger trigger = new CronTrigger(); trigger.setCronExpression("0 30 * * * ?"); String initialTime = "2010/09/01 09:00:00"; List<String> expectedTimeList = Arrays.asList( "2010/09/01 09:30:00", "2010/09/01 10:30:00", "2010/09/01 11:30:00", "2010/09/01 12:30:00"); assertSchedule(trigger, initialTime, expectedTimeList, DATE_PATTERN); }

CronExpresion은 혼동되기 쉽기 때문에 테스트 코드로 의도한 표현이 맞는지 확인해보는 것이 좋습니다. 아니면 그 시간까지 기다려야 잘 실행되는지 알수 있으니까요.

 위의 문제에 비하면 Concurrent 옵션은 부차적이긴 한데, 3초 걸리는 Job이고 1시간에 한번 돈다면 concurrent에 별로 신경을 안 쓰셔도 됩니다. 그런데,  2~4초 걸리는 job이 3초마다 실행된다고 할 때처럼 실행시간이 실행간격을 넘어설 가능성이 있다면 job의 특성에 따라서 앞의 주기에 실행한 job이 끝나기를 기다려야 할지, 아니면 앞의 일정이 안 끝났어도 동시에 실행해도 될지를 concurrent속성으로 지정하면 됩니다.

 그리고 참고로, Spring 3.0부터는 Qaurtz에 의존하지 않는 자체 스케쥴링이 있고, SchedulerFactoryBean보다 훨씬 간편하게 설정이 가능합니다. 꼭 Quartz를 써야지 해결되는 상황이 아니라면 Spring 3.0의 자체 Scheduling을 검토해볼만도 합니다.

아래와 같이 annotation으로도 설정이 가능합니다.
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
    // something that should execute on weekdays only
}



2011년 5월 19일 오전 1:43, 이남규 <lng...@gmail.com>님의 말:
QuartzCronExpTest.java

파란하늘

unread,
May 18, 2011, 9:38:50 PM5/18/11
to ks...@googlegroups.com, ks...@googlegroups.com

헐... cronExpression의 문제일줄 몰랐네요.-ㅅ-;;;

자주 쓰면서도 무심코 지나쳐버렸는데

환기해주셔서 감사합니다. (__)


--------- 원본 메일 ---------
보낸사람: Sanghyuk Jung <ben...@gmail.com>
받는사람 : ks...@googlegroups.com
날짜: 2011년 5월 19일 목요일, 09시 49분 35초 +0900
제목: Re: [KSUG] spring batch 관련 질문


규우

unread,
May 18, 2011, 11:31:56 PM5/18/11
to Korea Spring User Group
감사합니다.
답변 달아주신 내용을 토대로 테스트 해보니 잘 되네요 ^^

> @Scheduled(cron="*/5 * * * * MON-FRI")public void doSomething() {


> // something that should execute on weekdays only
>
> }
>

> 자세한 내용은 레퍼런스 메뉴얼에 있습니다.http://static.springsource.org/spring/docs/current/spring-framework-r...
>
> 2011년 5월 19일 오전 1:43, 이남규 <lng1...@gmail.com>님의 말:


>
>
>
>
>
>
>
> > 음. 잘 이해가 안 가는 부분이 있습니다.
> > concurrent false 인 상태에서 현재 매 시 30분에 배치가 돌고 있고, 해당 배치는 3초 정도의 시간이 소요되고
> > 종료됩니다.
> > 즉, 쓰레드가 생성되어 배치를 처리한 후, 해당 쓰레드는 종료되고 있습니다.
>
> > 위의 근거를 토대로 답변 달아주신 내용을 보면 false면 앞의 job이 종료되면 다음 thread를 실행합니다 라고 하셨는데요.
> > 해당 내용에 대해 잘 이해가 되지 않습니다. 배치 job이 끝났는데 왜 또 다음 thread를 실행하나요?
>

> > 2011년 5월 18일 오후 10:21, 파란하늘 <luver...@hanmail.net>님의 말:


>
> >> 설정과 다르게 시간이 동작한게 아닌경우를 가정한다면
>
> >> 이전 job의 thread가 쌓여 있는 경우도 확인해보셔야 할 것 같습니다.
>
> >> thread 갯수를 설정하지 않으면 기본으로 10개(5개?)의 thread를 생성하여 job을 실행하게 됩니다.
>
> >> 옵션에 concurrent가 true면 해당 시간마다 job이 생성되어 쓰레드에 담기고 실행되며
>
> >> false면 앞의 job이 종료되면 다음 thread를 실행합니다.
>
> >> 결국 false의 경우 정확한 시간에 해당 job이 수행되는 것을 보장하지는 않습니다. (수행 번호표를 뽑고 앞의 thread에 담긴
> >> job이 모두 끝나기를 기다립니다..)
>
> >> true로 하면 동시 수행에 대한 무결성 체크를 별도로 구현을 해야하구요.
>
> >> 각 job의 수행시간과 thread가 쌓이는 경우에 대한 모니터링을 해보셔야 좀더 명확한 해답을 얻을 수 있지 않을까 싶습니다.
>
> >> 도움이 될런지 모르겠네요;;;
>
> >> (이래 답변해드리고 진짜1초마다 실행하는 거면 대략 난감이네요.-ㅅ-;;)
>
> >> 좋은하루되세요. (__)
>
> >> --------- 원본 메일 ---------
>

> >> *보낸사람*: 규우 <lng1...@gmail.com>
> >> *받는사람* : Korea Spring User Group <ks...@googlegroups.com>
> >> *날짜*: 2011년 5월 18일 수요일, 21시 19분 44초 +0900
> >> *제목*: [KSUG] spring batch 관련 질문

> >> 이 그룹에 게시하려면 ks...@googlegroups.com<http://hanmail/mail/MailComposeFrame.daum?TO=ks...@googlegroups.com>(으)로
> >> 이메일을 보내세요.
> >> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com<http://hanmail/mail/MailComposeFrame.daum?TO=unsubscribe@googlegroups...>로


> >> 이메일을 보내주세요.
> >> 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
>

> >> <luver...@hanmail.net>


>
> >> --
> >> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> >> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> >> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.

> >> 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


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

> QuartzCronExpTest.java
> 2K보기다운로드

Reply all
Reply to author
Forward
0 new messages