티스토리 뷰

728x90

전자정부프레임워크에서 스케쥴러 사용이 필요해 1번방법으로 구현했다가, 스케쥴러 시간 설정을 설정파일로 빼달라는 요청이 있어서 2번 방법으로 다시 구현했다. 사실 이 요청은 시간을 Globals.properties로 빼달라는 것인것 같았지만..

1번 방법에서 단순히 값을 가져와서 넣는건 "attribute value must be constant"오류가 났다. 뭔가 해결하는 방법이 있겠지만, 시간이 없어서 2번방식으로 했다! (단순히 static final을 붙여주는건 안됐다 ㅠㅠ)

1. @Scheduled 어노테이션 방식

어노테이션 방식은 아주 간단하다.

1️⃣ 설정파일 (context-scheduler.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:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	   http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
    <task:annotation-driven />
</beans>

2️⃣ 스케쥴러로 실행 할 메서드

2-1. @Component 어노테이션으로 bean 등록

2-2. 실행 할 메서드 위에 @Scheduled 어노테이션 붙여주기

package scheduler;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component //@Component 어노테이션으로 bean등록
public class LoginScheduler {
    @Scheduled(cron = "* * * * *") //스케쥴러 시간 설정
    public void test () {
        System.out.println("스케쥴러 테스트");
        //스케쥴러 로직 작성
    }
}

2. 설정파일에서 스케쥴러 설정

1️⃣ maven dependency 추가

<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.1.7</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.2.1</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>4.3.4.RELEASE</version>
</dependency>

2️⃣ 스케쥴러를 실행할 메서드

- 클래스를 @Service 어노테이션을 사용하여 testScheduler라는 이름으로 bean에 등록해준다.

- 스케쥴러로 실행할 메서드 작성

package scheduler;

import org.springframework.stereotype.Service;

@Service("🌱testScheduler🌱")
public class TestScheduler {
    public void 💕test💕() {
        System.out.println("스케쥴러 테스트");
   		//스케쥴러 실행 로직
    }
}

3️⃣ 설정파일 (context-scheduler.xml)

3-1. 스케쥴러를 돌릴 서비스와 메서드를 설정해준다.(2️⃣에서 등록한 bean이름과 method명을 기입한다)

(맨 처음 참고자료를 대충봐서 ref를 value로 보고 왜 안돼...라고 시간을 허비했다...🥲 )

3-2. 스케쥴러 시간 등록 (3-1에서 설정한 bean를 참조한다)

3-3. 스케쥴러 등록(3-2에서 작성한 bean 아이디를 참조하여 등록해준다)

* 스케쥴러를 여러개 등록하기 하려면 1번과 2번을 각각 다른 아이디로 작성해 준후 3번에 등록해주면 된다!

<?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">
	
    <!-- 1️⃣ 스케쥴러를 돌릴 서비스와 메서드 설정-->
   <bean id="✨schedulerEvent✨" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
       <property name="targetObject" ref="🌱testScheduler🌱"/>
       <property name="targetMethod" value="💕test💕"/>
       <property name="concurrent" value="false"/> <!--동시에 실행되지 않도록 false-->
   </bean>
   <!-- 2️⃣ 스케쥴러 시간 설정-->
    <bean id="💙schedulerEventTrigger💙" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="✨schedulerEvent✨" />
		<property name="cronExpression" value="0/10 * * * * ?" /> <!--10초마다 -->
    </bean>
	<!-- 3️⃣ 스케쥴러 등록-->
    <bean id="Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="💙schedulerEventTrigger💙" />
            </list>
        </property>
    </bean>
</beans>

4️⃣ Globals.properties에 시간 빼기

4-1. 시간 작성

Globals.scheduler.time=0 00 3 ? * *

4-2. 3-2의 시간을 변수로 정해주면 된다.

<property name="cronExpression" value="${Globals.scheduler.time}" />
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함