본문 바로가기

Spring/Spring Framework

Spring Task

반응형

스프링 프레임워크는 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