스프링 프레임워크는 TaskExecutor 인터페이스와 TaskScheduler 인터페이스로 태스크의 비동기 시행과 스케줄링에 대한 추상화를 제공
요구사항
메일 8시에 특정 테이블에 하루동안 쌓인 데이타에 대한 처리.
Spring에서 제공하는 Sehcedul 기능은 Spring Batch만큼 순차작업이나 실패에 따른 복구등의 많은 기능을 가지고 있지 않지만, 간략한 설정과 어노테이션만으로 편리하게 설정이 가능한 장점을 가지고 있다. 최소한의 코드를 가진다는건 한눈에 파악할 수 있고, 빠르게 수정이 가능하다는 뜻이다.
1) 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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="50" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="1000" />
</bean>
<task:annotation-driven executor="taskExecutor" />
</beans>
2) task 생성
@scheduled annotation으로 Scheduler를 통한 Job을 실행하도록 설정
@Component
@TaskClientLogs
public class ClientLogsTask {
private static final Logger LOGGER = LoggerFactory.getLogger( ClientLogsTask.class );
@Autowired
ClientLogsService clientLogsService;
@Scheduled( cron = "0 0 23 * * *" )
public void ClientLogsTask() {
final long start = System.currentTimeMillis();
try {
LOGGER.info( "starting ClientLogsTask taskJob" );
this.clientLogsService.sendMailToDeveloper();
} catch ( final Exception e ) {
LOGGER.error( "ClientLogsTask error ", e );
} finally {
LOGGER.info( "end ClientLogs Send Mail To Developer taskJob {}(ms)", System.currentTimeMillis() - start );
}
}
}
PS > Cron Expression
왼쪽부터 오른쪽순으로 다음과 같은 의미가 있다.
Seconds |
0 ~ 59 |
Minutes |
0 ~ 59 |
Hours |
0 ~ 23 |
Day of Month |
1 ~ 31 |
Month |
1 ~ 12 |
Day of Week |
1 ~ 7 (1 => 일요일, 7=> 토요일 / MON,SUN...) |
Years(optional) |
1970 ~ 2099 |
사용 특수문자의 사용은 아래와 같은 의미가 있다.
* |
모든수를 의미, Minutes 위치에 사용될 경우 매분마다 라는 뜻 |
? |
Day of Month, Day of Week에만 사용 가능, 특별한 값이 없다는 뜻 |
- |
기간을 설정, Hour 위치에 10 - 12 라고 쓰면 10, 11, 12dp 동작하라는 뜻 |
, |
특정 시간을 설정. Day of Week 위치에 2, 4, 6 이라고 쓰면 월, 수, 금에만 동작하라는 뜻 |
/ |
증가를 표현, Seconds 위치에 0/15로 설정되어 있으면, 0초에 시작해서 15초 간격으로 동작 하라는 뜻 |
L |
Day Of Month 에서만 사용하며, 마지막 날의 의미 Day of Month 에 L로 설정되어 있으면 그달 의 마지막날에 실행하라는 의미 |
W |
Day of Month 에만 사용하며, 가장 가까운 평일을 의미. 15W로 설정되어 있고 15일이 토요일 이며, 가장 가까운 평일인 14일 금요일에 실행, 15일이 일요일이면 16일 월요일에 실행된다. 15일이 평일이면 그날 그대로 실행됨 |
LW |
L과 W를 결합하여 사용, 그달의 마지막 평일의 의미 |
# |
Day of Week에 사용, 6#3 의 경우 3번째 주 금요일에 실행된다. |
사용 예
0 0 12 * * * ==> 매일 12시에 실행
0 15 10 * * * ==> 매일 10시 15분에 실행
0 * 14 * * * ==> 매일 14시에 실행
0 0/5 14 18 * * * ==> 매일 14시, 18시에 시작해서 5분간격으로 실행
0 0-5 14 * * * ==> 매일 14시에 시작해서 0분동안 실행
출처: https://javafactory.tistory.com/1386[FreeLife의 저장소]
+ 특정 프로파일에서만 실행하도록 설정하기
TaskClientLogs annotation 생성
@Target( {
ElementType.TYPE
} )
@Retention( RetentionPolicy.RUNTIME )
@Profile( {
ApplicationDefine.PROFILE_AWS
} )
public @interface TaskClientLogs {
}
'Spring > Spring Framework' 카테고리의 다른 글
다국어 처리하기 (0) | 2020.03.07 |
---|---|
Rest API (0) | 2019.12.16 |
Spring Scheduling (0) | 2019.09.27 |
IoC (0) | 2019.09.21 |
HttpMessageConverter (0) | 2019.08.02 |