관리 메뉴

ふたりで

springboot2.3.X SchedulerConfig 본문

Spring

springboot2.3.X SchedulerConfig

graykang 2020. 12. 21. 12:37
728x90
반응형
SMALL

Scheduler사용 시 Thread Pool을 설정하려면 config를 설정해야 한다.

다음과 같이 설정용 클래스 파일을 작성 하여 설정할 수 있다.

package com.xxxx.xxxx.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

@Configuration
public class SchedulerConfig implements SchedulingConfigurer{
	private final int POOL_SIZE = 10;
	
	@Override
	public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
		ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
		
		threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
		threadPoolTaskScheduler.setThreadNamePrefix("xxxx-ScheduledTask-Pool:");
		threadPoolTaskScheduler.initialize();
		
		scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
		
	}

}

나의 경우 springboot2.3.1 버전을 사용 하며, war 파일로 Tomcat8.5.X버전에 배포하는 환경인데 배포 반영시

, 서비스만 재반영시 ThreadPool 관련 에러가 발생 하여 아는분의 조언을 얻어 아래와 같이 설정 부분을 수정 하여

사용중이다.

import org.springframework.boot.task.TaskExecutorBuilder;
import org.springframework.boot.task.TaskSchedulerBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
@EnableScheduling
public class SchedulerConfig{
	/*ThreadPool은 기본 8개로 자동 설정 된다.*/
	  @Bean
	  public ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) {
	    return builder.build();
	  }

	  @Bean
	  public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
	    return builder.build();
	  }

}

 

아래는  Service 에서 스케줄 사용한 부분이다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import com.XXXXXXXX.XXXXXXXX.common.mapper.suporder.ScheduledTaskMapper;
import com.XXXXXXXX.XXXXXXXX.common.model.ScheduleTaskVO;


@Service
public class ScheduleTaskService {
	
		@Value("${scheduler.enabled}")
		private boolean isEnabled;//스케줄 사용여부
		
		@Autowired
		ScheduledTaskMapper scheduledTaskMapper;
		
		private static Logger logger = LoggerFactory.getLogger(ScheduleTaskService.class);
	
		/**
		 * 2021-02-25: create dbkang test code.
		 
		@Scheduled(fixedDelay = 20000)//1000 = 1초
		public void testTask() {
			if(isEnabled) {
				logger.info("Current Thread:{}",Thread.currentThread().getName()+", fixedDelay_GetTime:"+LocalDateTime.now());
			}
		}
		*/
	
	  	/**
	  	 *	  	@Scheduled(cron = "0/30 * * * * *")//0초에 시작해서 이후 10초마다 실행.
	  	 *	  	@Scheduled(cron = "0 * * * * ?")//1분마다 실행.
	  	 */
	  	@Scheduled(cron = "0 30 0 * * ?")//매일 24:30 
		public void sDeleteYnTask() {
			if(isEnabled) {
				ScheduleTaskVO param = new ScheduleTaskVO();
				String baseDt = LocalDateTime.now().minusDays(15).toString().substring(0, 10);
				param.setBaseDt(baseDt);
				try {
					int queryResult= scheduledTaskMapper.updateSendDeleteYn(param);
					logger.info("Current Thread:{}",Thread.currentThread().getName()+", LinkSMS_TaskJob_queryResult:"+queryResult);
				} catch (Exception e) {
					//e.printStackTrace();
					logger.error("Current Thread:{}",Thread.currentThread().getName()+", Link SMS list YN update fail, E.Message:"+e.getMessage());
				}
			}
		}
	  	
	  	/**
	  	 *	  	@Scheduled(cron = "0/30 * * * * *")//0초에 시작해서 이후 10초마다 실행.
	  	 *	  	@Scheduled(cron = "0 * * * * ?")//1분마다 실행.
	  	 */
	  	@Scheduled(cron = "0 0 * * * ?")//매일 24:00 
		public void sDeliveryNumTask() {
			if(isEnabled) {
				ScheduleTaskVO param = new ScheduleTaskVO();
				try {
					int queryResult= scheduledTaskMapper.updateUserConfigInfo(param);
					logger.info("Current Thread:{}",Thread.currentThread().getName()+", UserConfigInfo_TaskJob_queryResult:"+queryResult);
				} catch (Exception e) {
					//e.printStackTrace();
					logger.error("Current Thread:{}",Thread.currentThread().getName()+", UserConfigInfo table Delivery_num Col update Task Job Fail, E.Message:"+e.getMessage());
				}
			}
		}

}
728x90
반응형
LIST
Comments