[JAVA 프로젝트] 배치 스케줄러

ooweat·2023년 2월 20일
1

프로젝트

목록 보기
1/2
post-thumbnail

1. 개 요

운영중인 프로세스에 대한 주기적인 모니터링 및 알림을 위해 개발

1-1. 구현 목표

  • 프로젝트 설정
  1. 데이터베이스 연동

    • Oracle
    • PostgreSQL
    • ETC..
  2. 알림 연동

    • 기존에 만들어놓은 카카오 알림톡 발송 API 와 연동 설정
    • Gmail 의 SMTP 기능을 구현하여 연동

1-2. 구현 기능

  • application.properties 설정에 따른 scheduler 동작
  • 자주 사용하는 주기(매일/특정시간/5분단위 등..) 설정
  • Galera 로 운영중인 MariaDB의 Node 카운트 설정이 3개가 아닐 경우 알림
  • 운영중인 알림톡 프로세스 기능이 동작하지 않을 경우(오픈된 포트가 존재하지 않을 경우) 알림
  • 그 외 확장..

2. 실제 기능 구현 과정

2-1. 초기 설정

  • application.properties
project.name=taskScheduler
server.port=11011

#Use Flag
smtp.use.flag=y
kakao.use.flag=y

#Schedule
# 5분마다
batch.5min.crond=0 */5 * * * ?
# 30분마다
batch.halfHours.crond=0 */30 * * * ?
# 업무시간 30분마다
batch.workHalfHours.crond=0 */30 9-18/1 * * ?
# 업무시간 1시간 마다
batch.workHours.crond=0 0 9-18/1 * * ?
# 아침 아홉시에 한 번
batch.morning.oneOff.crond=0 0 9 * * ?
# 오전 07:40 - 09:40 분까지 1시간마다
batch.morning.crond=0 40 7-9/1 * * ?

2-2. Controller 구현

- Annotation 설정

@CrossOrigin("*")

  • CORS 설정

@EnableAutoConfiguration

  • 자동 설정

- 초기설정

application.properties 에서 설정한 Schedule 를 호출.

${batch.5min.crond}


import javax.mail.MessagingException;
import java.io.UnsupportedEncodingException;

@Slf4j
@CrossOrigin("*")
@EnableAutoConfiguration
@RestController
public class BatchController {

	@Autowired
	private BatchService batchService;

	@Autowired
	private ManagerMapper managerMapper;
	//HINT: workDayCheck() - Oracle DB 기준으로 작업일(오늘)이 영업일이면 진행
    
	/**
	 * 스케쥴러
	 * 1. 매일 00 시 00 분 05초에 조건에 따라 충전하는 스케쥴러
	 *     1: 초(0-59)
	 *     2: 분(0-59)
	 *     3: 시(0-23)
	 *     4: 일(1-31)
	 *     5: 월(1-12)
	 *     6: 요일(0-7) 0, 7 : 일요일 / 1: 월요일 / 6:토요일
	* */

	@Scheduled(cron="${batch.5min.crond}") // 5분마다
	public void t5minCheck() throws UnsupportedEncodingException, MessagingException {
		log.info("Path: {}", Util.pathUtils().methodName());
		log.info("[{}]",Util.dateUtils().now());
		batchService.processAliveCheck();
	}

	@Scheduled(cron="${batch.halfHours.crond}") // 30분마다
	public void halfHoursCheck() throws UnsupportedEncodingException, MessagingException {
		log.info("Path: {}", Util.pathUtils().methodName());
		log.info("[{}]",Util.dateUtils().now());
		if(workDayCheck()){	

		}
	}

	@Scheduled(cron="${batch.workHours.crond}") // 1시간마다(영업일)
	public void workHoursCheck(){
		log.info("Path: {}", Util.pathUtils().methodName());
		log.info("[{}]",Util.dateUtils().now());
		if(workDayCheck()){	

		}
	}

	@Scheduled(cron="${batch.morning.crond}") // 07시 40분 부터 09시 40분까지 1시간 간격(영업일)
	public void halfOf7to9Check() throws UnsupportedEncodingException, MessagingException {
		log.info("Path: {}", Util.pathUtils().methodName());
		log.info("[{}]",Util.dateUtils().now());
		if(workDayCheck()){	

		}
	}

	@Scheduled(cron="${batch.workHalfHours.crond}") // 9시부터 30분마다(영업일)
	public void workHalfHoursCheck() throws UnsupportedEncodingException, MessagingException {
		log.info("Path: {}", Util.pathUtils().methodName());
		log.info("[{}]",Util.dateUtils().now());
		if(workDayCheck()){	

		}
	}

	@Scheduled(cron="${batch.morning.oneOff.crond}") // 아침 9시 한 번
	public void oneOffOnMorning() throws UnsupportedEncodingException, MessagingException {
		log.info("Path: {}", Util.pathUtils().methodName());
		log.info("[{}]",Util.dateUtils().now());
		if(workDayCheck()){	

		}
	}

	private boolean workDayCheck(){
		return managerMapper.workDayCheck() == 1 ? true : false;
	}
}

3. 결과

3-1. 활용

아래와 같은 비동기 처리를 진행할 수 있다.

  1. 무결성 검사
  2. 주기적 데이터 삭제 (로그, tmp 파일)
  3. 서버 재시작
  4. 캐시 리로드
    .
    .
    .

3-2. 적용사례

DevOps 를 위해 스케줄러 주기에 맞추어 시스템 리포트를 발송하도록 하였다.
SMTP 와 약간의 Linux CMD 를 조합하여 운영에서 사용중이다.

이렇게 누적된 데이터는 모니터링 을 위해 차트 또는 그리드 를 그려

profile
모든 실패 테스트를 구현해서 성공 테스트가 필요 없는 개발자가 되고 싶어요 : ) 💻

0개의 댓글