scheduling

Kang JaeHyeon·2024년 8월 8일

spring에서 특정한 시간에 등록된 작업을 자동으로 실행할 때 사용

Task

특징

  • Spring 프레임워크 내에서 간단한 작업 스케줄링을 제공
  • 주로 간단한 작업을 지원
    • 작업 우선순위 설정과 같은 작업은 불가
    • Ex) 단순 반복, 정해진 시간에만 실행 등
  • XML 또는 어노테이션 기반으로 간단하게 설정 가능
  • 스레드 풀을 사용하여 동시에 실행할 수 있는 작업 수를 제어

사용

beans 설정
http://www.springframework.org/schema/task

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:quartz="http://www.springframework.org/schema/quartz"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/quartz http://www.springframework.org/schema/quartz/spring-quartz.xsd">

spring-context의 org.springframework.scheduling.concurrent 패키지 안에 있는
ThreadPoolTaskScheduler 클래스를 scheduler라는 이름의 Bean으로 등록

<task:scheduler id="scheduler" pool-size="3"/>

사용할 클래스를 빈으로 등록

<bean id="schedulingJob" class="com.example.project.scheduling.SchedulingJob" />

scheduling 설정

<task:scheduled-tasks scheduler="scheduler"> <!-- scheduled job list -->
    <task:scheduled ref="schedulingJob" method="executeJob1" cron="* * * * * ?"/>
    <task:scheduled ref="schedulingJob" method="executeJob2" cron="* * * * * ?"/>
</task:scheduled-tasks>

task cron 표현식

cron = "* * * * * ?"
기본적으로 6개의 필드
초 / 분 / 시 / 일 / 월 / 요일

ex)
cron = "0 * * * * ?"
-> 1분마다 실행(0초가 되는 순간 실행)

cron = "0 0 */4 * * ?"
-> 매 4시간 간격으로 실행

cron = "0 0 5 * * SUN"
-> 일요일 05시에만 실행 (SUN:0 or 7, MON:1, TUE:2, WED:3, THU:4, FRI:5, SAT:6)

cron = "0 5/10 * * * ?"
-> 5에 첫번째 작업 시작 (5, 15, 25, 35, 45, 55) 실행

quartz

특징

  • 복잡한 스케줄링 요구 사항을 처리할 수 있음
    • 작업 우선순위 설정, 작업의 동시 실행 제어 등 상위 기능 지원
  • Job과 Trigger를 기반으로 작업을 스케줄링
    • Job은 실제로 실행할 작업을 정의
    • Trigger는 언제 작업이 실행될지를 정의
  • 클러스터링 기능을 제공

사용

beans 설정
http://www.springframework.org/schema/quartz

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:quartz="http://www.springframework.org/schema/quartz"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/quartz http://www.springframework.org/schema/quartz/spring-quartz.xsd">

라이브러리 의존성 추가

implementation 'org.quartz-scheduler:quartz:2.3.2'

사용할 클래스를 빈으로 등록

<bean id="schedulingJob" class="com.example.project.scheduling.SchedulingJob" />

MethodInvokingJobDetailFactoryBean을 사용하여 JobDetail Bean 등록

<bean id="job1Detail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="schedulingJob"/>
    <property name="targetMethod" value="executeJob1"/>
</bean>

<bean id="job2Detail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="schedulingJob"/>
    <property name="targetMethod" value="executeJob2"/>
</bean>

Cron Trigger Bean 등록

<bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="job1Detail"/>
    <property name="cronExpression" value="* * * * * ?"/>
</bean>

<bean id="trigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="job2Detail"/>
    <property name="cronExpression" value="* * * * * ?"/>
</bean>

Quartz Scheduler 설정

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="trigger1"/>
            <ref bean="trigger2"/>
        </list>
    </property>
</bean>

quartz cron 표현식

task cron 식보다 디테일한 설정이 가능

범위 지정이 가능
ex)
cron = "00* 0-30/5 * * ?"
-> 0분부터 30분까지 5분 간격으로 실행

cron = "0 0 10 * * MON-FRI"
-> 월-금 10시마다 실행

0개의 댓글