java/배치 & Scheduling

@EnableScheduling 사용하여 설정

내가 만드는게 길이 된다 2023. 10. 17. 16:49

 

package com.twokimss.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
@EnableScheduling
@EnableAsync
public class ScheduledConfig {
	//스프링 부트에서 스케줄러 기능을 사용하기 위해 @EnableScheduling 설정
    
//	1. Component는 class level에 선언,
//	   Bean은 메소드 레벨에 선언
//	2. Bean을 사용시 Configuration 어노테이션을 꼭 사용
//	   또는 @SpringBootApplication 어노테이션이 들어간 스프링 실행부에 사용
//	3. Bean은 외부 라이브러리가 제공하는 객체를 사용할 때
//	   Component는 내부에서 직접 접근 가능한 클래스에 사용
//	4. Bean은 유연한 빈 등록이 필요할때 사용(환경파일읽어서 동적생성)
	
	@Bean
	public TaskScheduler scheduler() {
		ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
		scheduler.setPoolSize(4);
		return scheduler;
	}

}

제대로 이해한게 맞는지 알수없음.

 

package com.twokimss.web.batch.service;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class MyDateUtil {
	
	private Logger logger = LoggerFactory.getLogger(MyDateUtil.class);
	
	public static String getDateTime() {
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
		Date nowDate = new Date();
		String strDate = sdf.format(nowDate);		
		
		return strDate;
		
	}

}

 

package com.twokimss.web.batch.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

//	1. Component는 class level에 선언,
//	   Bean은 메소드 레벨에 선언
//	2. Bean을 사용시 Configuration 어노테이션을 꼭 사용
//	   또는 @SpringBootApplication 어노테이션이 들어간 스프링 실행부에 사용
//	3. Bean은 외부 라이브러리가 제공하는 객체를 사용할 때
//	   Component는 내부에서 직접 접근 가능한 클래스에 사용
//	4. Bean은 유연한 빈 등록이 필요할때 사용(환경파일읽어서 동적생성)

//@Service, @Controller, @Repository 등은 @Component를 상속 받음
//@Service 는 @Component 와 기능상의 차이는 없음
// 비즈니스 레이어를 구분하기 위해 사용

@Component
public class SchedulerServiceImpl {
	private Logger logger = LoggerFactory.getLogger(SchedulerServiceImpl.class);
	
	@Autowired
	private SchedulerBiz001 schedulerBiz001;
	
	@Autowired
	private SchedulerBiz002 schedulerBiz002;	
	
	//fixedDelay는 해당 작업이 끝난 시점부터 시간을 세고, fixedRate는 해당 작업의 시작 시점부터
	

	//cron  설정방법
	//첫 번째 * 부터 : 
	//@Scheduled(cron = "* * * * * *")
	//초(0-59)
	//분(0-59)
	//시간(0-23)
	//일(1-31)
	//월(1-12)
	//요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토)	
	
	//끝나고 10초 후 시작
	@Scheduled(fixedDelay = 1000 * 10)
	public void schedulerBiz001Exec() {

		logger.info("[schedulerBiz001Exec===>호출] : {}", MyDateUtil.getDateTime());
		
		schedulerBiz001.schedulerBiz001Exec(); //빨리 끝나는 업무 : 동기 <---- 이게 끝나고 10초 후에 다시 스케줄이 호출됨 : @Scheduled(fixedDelay = 1000 * 10)
		schedulerBiz002.schedulerBiz002Exec(); //오래걸리는 업무 : 비동기 <--- 비동기라 호출된후 20초동안 작업수행후 종료, next 스케쥴에 영향없음
		
		
		logger.info("[schedulerBiz001Exec===>종료] : {}", MyDateUtil.getDateTime());
	}
	
	//끝나고 30초 후 시작
	//끝나고 1초 후 시작
	//@Scheduled(fixedDelay = 1000 * 10)
	public void schedulerBiz002Exec() {
		
		//logger.info("[schedulerBiz002Exec===============>호출] : {}", MyDateUtil.getDateTime());
		
		schedulerBiz002.schedulerBiz002Exec();
		
		//logger.info("[schedulerBiz002Exec===============>종료] : {}", MyDateUtil.getDateTime());
	}	
}

 

 

package com.twokimss.web.batch.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service("schedulerBiz001")
public class SchedulerBiz001 {
	
	//빨리 끝나는 업무 : 동기
	
	private Logger logger = LoggerFactory.getLogger(SchedulerBiz001.class);

	

	//@Async
	public void schedulerBiz001Exec() {
		
		logger.info("[001===>실행 시작] : {}", MyDateUtil.getDateTime());
		
		
		try {
			Thread.sleep(1000 * 2); //2초 대기
		} catch (InterruptedException e) {
			e.printStackTrace();
		}		
		
		logger.info("[001===>실행 종료] : {}", MyDateUtil.getDateTime());
	}	
	
	

}

 

 


package com.twokimss.web.batch.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service("schedulerBiz002")
public class SchedulerBiz002 {
	
	//오래걸리는 업무 : 비동기 
	
	private Logger logger = LoggerFactory.getLogger(SchedulerBiz002.class);
	
	@Async
	public void schedulerBiz002Exec() {
		
		logger.info("[002==============>실행 시작] : {}", MyDateUtil.getDateTime());
		
		try {
			Thread.sleep(1000 * 20); //20초 대기
		} catch (InterruptedException e) {
			e.printStackTrace();
		}			
		
		logger.info("[002=============>실행 종료] : {}", MyDateUtil.getDateTime());
	}	

}