블로그 들을 보면 다들 concurrent 를 false 로 한다고 나와있다.
다들 동시성을 없애고들 싶어하나 보다.
정작 동시에 작업하고 싶어서 찾아보니 도무지 나오지를 않는다.
할수 없이 일일이 삽질하면서 테스트 하기 시작...
1) @Scheduled 애너테이션 사용법
- 특이하다...
@Scheduled(fixedRate= ??) 이거를 쓰면 절대로 멀티스레드로 동작하지 않는다... 왜 ? 몰라...
샘플 코드 ------
@Scheduled(fixedRate=400)
protected void executeJob() {
long id = Thread.currentThread().getId();
for(int i=0; i<10; i++) {
logger.debug("[Scheduling Job " + id + "] start");
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
logger.debug("[Scheduling Job " + id + "] end"); }
- 두번째
@Scheduled(cron="* * * * * ?")
이러면 되겠지... 했으나... 역시나 한스레드가 멈추기 전까지 절대 다음 스레드가 동작하지 않는다.
왜?... 몰라... 블로그 뒤져보니 스레드풀에 다음 스레드가 기다리고 있다는 정보는 확인했다.
멀티스레드로도 동작한다... (오해없기를... 동시 진행이 아니고, 스레드 아이디가 달라졌다는 뜻이다.)
- 결론
@Scheduled 애너테이션 사용법으로는 동시성 지원을 할 수 없다!
2) quartz 원 라이브러리를 활용한 방법
- 어쩔수 없이 ?-context.xml 파일을 건드렸다...
<bean id="exam" class="com.xxx.JobDetailExam" />
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="exam"/>
<property name="targetMethod" value="execute" />
<property name="concurrent" value="true" />
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="startDelay" value="5000" />
<property name="repeatInterval" value="100"/>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0/1 * * * * ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
- 문제가 나기 시작했다.
SimpleTriggerBean, CronTriggerBean 의 프로퍼티 세팅에서 자꾸 에러가 나는 것이다.
이상하다...???
quartz 원래 라이브러리도 maven pom.xml 에 추가했다. 물론 최신으로...
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.0.2</version>
</dependency>
- 이때부터 삽질...
SimpleTriggerBean 을 SimpleTriggerFactoryBean 으로 바꿔도 보고... 삽질 삽질 삽질...
- 결국 quartz 최신버전이 문제였다는 결론
버전을 2.0.2 -> 1.8.5 로 변경하고 테스트...
두둥...
됐다 !
- 결론은 quartz 원 라이브러리 안정화 버전과 MethodInvokingJobDetailFactoryBean 을 이용해서 쓸 것 !
3) 추가적으로 스레드 풀 관리를 위해...
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.threadCount">5</prop>
</props>
</property>