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());
}
}'java > 배치 & Scheduling' 카테고리의 다른 글
| ScheduledExecutorService + db 저장업무 + 건마다 commit (0) | 2023.10.26 |
|---|---|
| ScheduledExecutorService + db 저장업무 (0) | 2023.10.25 |
| ScheduledExecutorService (0) | 2023.10.24 |
| ScheduledFuture 사용 (0) | 2023.10.18 |
| 배치 & Scheduling 관련 참조 (0) | 2023.10.06 |