본문 바로가기
Java/Spring

[Spring]Quartz 로 scheduler구현해보기

by 인포썸 2021. 4. 9.

이벤트 기간이 지난 상품들을 등록대기 상태로 바꾸는 기능을 추가해야 했습니다.

 

스케줄러를 해본 적이 없어서 사용자가 상품페이지로 들어갈 때마다

이벤트 날짜를 체크해서 update하는 방법도 생각했었지만, 그건 좀 아닌 거 같아서 scheduler를 구현하기로 했습니다.

 

Spring에서 Spring Scheduler와 Spring Quartz라는 2가지 방식으로 제공됩니다.

저는 Quartz 방법을 사용하기로 했습니다.

 

1. Quartz라이브러리 추가

 

pom.xml

 

<!-- Scheduling -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.3.0</version>
        </dependency>
        <!-- Scheduling end-->

 

2.Service 설정

 

GoodsEventSchdule.java

 

@Service("goodsEventScheduler")
public class GoodsEventSchedule {

    @Resource(name = "goodsEventMapper")
    GoodsEventMapper goodsEventMapper;

    @Resource(name = "goodsMapper")
    GoodsMapper goodsMapper;
    /**
     * 스케줄러(이벤트 기간 지난 상품 '등록대기'변환 )
     */
    public void updateEventGoodsRegisterStats(){
        List<EgovMap> goodsList =  goodsEventMapper.selectEndEventGoods();
        if(goodsList.size()>0){
            for(EgovMap ele : goodsList){
                GoodsVO vo = new GoodsVO();
                vo.setGoodsId((String)ele.get("goodsId"));
                vo.setRegistSttusCode("R");
                goodsMapper.updateGoodsRegistSttus(vo);
            }
        }

    }
}

 

3.Quartz bean 설정

 

context-scheduling.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

	<!-- 이벤트 상품 수정 job 설정 -->
	<bean id="updateEventGoodsStatsJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="goodsEventScheduler" /><!--실행할 서비스 설정-->
		<property name="targetMethod" value="updateEventGoodsRegisterStats" /><!--실행할 메소드 설정-->
		<property name="concurrent" value="false" />
	</bean>

	<!-- 이벤트 상품 수정 트리거 -->
	<bean id="eventGoodsStatsTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="updateEventGoodsStatsJob"/>
		<!--매일 자정마다 실행-->
		<property name="cronExpression">
		 <value>0 0 0 * * ?</value>
		</property>
	</bean>

	<!-- 스케줄러 실행 -->
	<bean id="eventGoodsStatsScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="eventGoodsStatsTrigger" />
			</list>
		</property>
	</bean>
	
</beans>

 

cron방식으로 매일 자정 마다 실행하게 하였다. 스케줄러 되게 복잡하고 어려울거라구 생각했는데

생각보다 간단하게 구현한 거 같습니다.

'Java > Spring' 카테고리의 다른 글

[eGovFramework] 폼 검증(Form validation)하기  (0) 2020.06.15
Math 클래스  (0) 2020.05.25
String, StringBuffer  (0) 2020.05.25
[JSTL] import  (0) 2020.05.22
제네릭(Generic)  (0) 2020.05.20

댓글