본문 바로가기

카테고리 없음

Spring 14. Scheduler(2)-Quarts

 

▶ Spring Quarts 설정방법

1. <context:component-scan> 추가 => bean객체 등록시 필요
2. pom.xml에 quartz관련된 의존성 3개 추가

<!-- pom.xml -->

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- quartz Jobs -->
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

 

 

▶ Spring Quarts 작업단위(컴포넌트 3가지)

- Job : 실제로 작업할 작업단위(기능)
- Trigger : Job을 어떤 방식으로 실행시킬지 정의
- Scheduler : 만든 Trigger들을 등록해서 내가 원하는 시간에 작업이 이루어 지도록 스케쥴링하는 컴포넌트

 

<!-- quartz-context.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- 
		Job 객체 생성하기(bean객체형태)
		-> 메서드 단위로 실행되는 스케쥴러(MethodInvokingJobDeatilFactoryBean)
	 -->
	<context:component-scan base-package="com.kh.spring"></context:component-scan>

	<!-- 로그인시 사용자 pwd 변경 스케쥴러 -->
	<bean id="job2" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="jobClass" value="com.kh.spring.common.scheduling.ChangePwdScheduler"></property>
		<property name="jobDataAsMap">
			<map>
				<entry key="mService" value-ref="memberServiceImpl"></entry>
			</map>
		</property>
	</bean>
	
	
	<!-- Trigger 
		내가 만든 Job을 통해 동작의 실행방법을 정의
		(보통 표현식으로 사용함)
	-->
	<bean id="JobTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="job2"></property>
 		<property name="cronExpression" value="0 0 1 1/1 * ? *"></property>
	</bean>
	
	
	<!-- Scheduler 
		위에서 정의한 Trigger를 관리하고 정의해둔 Trigger를 실행시키는 역할을 하는 객체
		bean객체로 생성
	-->
	
	<bean id="jobScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	
		<!-- 현재 생성된 스케쥴러를 통해 작동시킬 트리거 목록 -->	
		<property name="triggers">
			<!-- list태그로 트리거들 추가 -->
			<list>
				<ref bean="JobTrigger2" />
			</list>
		</property>
	</bean>
</beans>

 

// ChangePwdScheduler.java
/* 
    매일 오전 1시에 회원정보를 확인하여 
    사용자가 비밀번호를 변경한지 3개월이 지났다면
    비밀번호를 변경할 수 있도록 DB상태값을 변경해줄 예정

    1) DB에 changePwd 칼럼 추가
    2) 사용자가 비밀번호변경을 안한지 3개월이 넘었다면 changePwd의 상태값을 변경해줌
    3) 사용자가 로그인 시도를 할 때 changePwd값이 바꿔져 있다면 비밀번호 변경페이지로 이동
    4) 비밀번호 변경하면 changePwd값은 원래 상태값으로 변경
*/
@Component
public class ChangePwdScheduler  extends QuartzJobBean{
	
	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

		// jobDataAsMap에서 등록한 bean객체 가져오기
		MemberService mService = (MemberService)context.getMergedJobDataMap().get("mService");
		
		mService.updateMemberChangePwd();
	}
}

 

public class MemberServiceImpl implements MemberService{

	@Override
	public void updateMemberChangePwd() {
		memberDao.updateMemberChangePwd();
	}
}

 

<!-- member-mapper.xml -->

<!-- pwd 변경한지 3개월이 경과됐다면 상태값 변경 -->
<update id="updateMemberChangePwd">
    UPDATE MEMBER
       SET CHANGE_PWD = 'Y'
     WHERE SYSDATE > ADD_MONTHS(MODIFY_DATE, 3)
</update>