SlideShare uma empresa Scribd logo
1 de 37
cjred77@gmail.com
2
3 
어떤 프로젝트에서 , 특정 시각이나 일정시간 간격 
으로 
job 이 실행되어야 하는 경우. 
매일 혹은 매월 통계데이터를 만들어야 되는 배치성 
업무나, 
일정 주기별로 서비스의 상태나 변경사항을 관리자 
에게 
알려줘야되는 업무. 
일반적으로 Java Timer API 나 
Crontab, Quartz로 구현. 
(그 외에도 다수의 job scheduler library 가 
존재.)
4 
PG(Payment Gateway) 개발/운영의 배치성 업무 
• 매일 새벽에 그전날 결제건에 대한 통계생성 
• 외부 PG업체에서 전날의 결제정보를 받아와 
우리시스템과의 대사작업 수행 
• 매월 초 이전달 결제에 대한 정산작업 
• 매월 말 이전달 결제에 대한 청구작업 
각 업무의 특성에 맞게 crontab 과 quartz 를 선택하여 사용 중.
5 
cron 명령어
6 
유닉스에서 오래전부터 사용. 
오랜시간동안 스케줄링의 성능이 입증. 
$ [1 2 3 4 5 사용아이디 명령어] 
1: minute (0-59) 
2: hour (0-23) 
3: day of the month(1-31) 
4: month of the year(1-12) 
OR jan, feb, mar, apr ... 5: day of the week (0- 
6)(Sunday=0 or 7) 
OR sun, mon, tue, wed, thu, fri, sat
7 
예) 
#date time sync 
0 5 * * * root /usr/bin/rdate -s time.bora.net && /sbin/hwclock –w 
0/1 * * * * date >> /Users/red/date.txt 
로그 파일 백업이나 주기적으로 간단한 동작을 하는 명령이나 프로세 
스에 적당함.
8 
java.util.Timer
9 
import java.util.Timer 
import java.util.TimerTask 
public void java.util.Timer.schedule(TimerTask task, 
Date firstTime, 
long period) 
Parameters: 
task - 스케줄링 되어 실행될 task. 
firstTime - 실행될 task의 처음시각. 
period - task가 실행될 주기(millisecond).
10
11
12
13 
단점 
자바의 특성과 다양한 플랫폼에서의 구현때문에, 각각의 JVM에서의 Thread 
스케줄링의 구현은 일치하지 않는다. 
Task는 Runnable 객체로 구현되어 있고 일정시간동안 sleep상태가 된다. 그러 
면 Timer가 규정된 순간에 task를 깨운다. 그러나 정확한 실행시간은 JVM 의 
스케줄링 정책과 현재 얼마나 많은 Thread가 프로세서를 기다리고 있냐에 따 
라 달라진다. 
Task가 지연되는 경우는 크게 2가지이다. 
•많은 수의 쓰레드가 실행되기를 기다리고 있는 경우 
•GC 에 의한 지연 
각 Timer 객체는 쓰레드를 백그라운드로 시작한다. 
이러한 방식은 J2EE 애플리케이션 서버와 같은 환경에서는 바람직하지 않을 
것이다. 
왜냐하면 이러한 쓰레드들이 컨테이너 영역 내에 있지 않기 때문이다.
14 
예) 맛집에서 식사하기 
2시간후에 식사를 하러간다. 
줄을 서서 차례를 기다린다. 
음식을 주문한다. 
식사시간이 늦어졌다.
15 
Quartz
16 
예) 맛집에서 식사하기 
2시간후에 식사를 하러간다. 
2시간후로 예약을 해놓자! 
음식도 주문해 놓자! 
2시간후에 가면 바로 먹을 수 있다. 
http://www.quartz-scheduler.org/ 
http://www.quartz-scheduler.org/downloads
17 
모듈 : 설명 
quartz-2.2.1.jar : Quartz 코어 
quartz-jobs-2.2.1.jar : Quartz Job 지원 
Maven 
<dependency> 
<groupId>org.quartz-scheduler</groupId> 
<artifactId>quartz</artifactId> 
<version>2.2.1</version> 
</dependency> 
<dependency> 
<groupId>org.quartz-scheduler</groupId> 
<artifactId>quartz-jobs</artifactId> 
<version>2.2.1</version> 
</dependency>
18 
Quartz + SimpleTrigger
19 
SimpleTrigger : 간단하며 interval, delay, repeat times등을 설정 하여 사용.
20 
SimpleTrigger : 간단하며 interval, delay, repeat times등을 설정 하여 사용. 
MyJob.java 
Hello.java
21 
거의 일정한 시간간격으로 실행된다.
22 
Quartz + CronTrigger
23 
CronTrigger는 "cron 표현법"을 사용하여 스케줄링 기능을 제공. 
작업(Job) 실행이 달력 개념을 기반으로 반복된다면 
SimpleTrigger보다 CronTrigger가 더 유용하게 사용. 
"매주 월요일부터 금요일까지 아침8시” 
"매달 마지막 금요일 새벽1시30분”
24 
필드 명 필수 허용 값 Special characters 
초(seconds) Yes 0-59 , - * / 
분(minutes) Yes 0-59 , - * / 
시(hours) Yes 0-23 , - * / 
날짜(day of month) Yes 1-31 , - * / ? L W 
월(month) Yes 1-12 or JAN-DEC , - * / 
요일(day of week) Yes 1-7 or SUN-SAT , - * / ? L # 
년(year) No empty, 1979-2099 , - * / 
특수문자 설명 
* : 모든 값을 의미. 
? : 특정 값을 정하지 않음. 
- : 범위를 의미. 예) 0-10이면 0부터 10까지. 
, : 값을 추가. 0-10,20-30은 0부터 10까지, 그리고 20부터 30까지. 
/ : 증분을 의미. 예) 초에 0/15를 사용하면 15초마다(0, 15, 30, 45) . 
L : 마지막을 의미. 날짜에 사용하면 월의 마지막 날을 의미. 
31, 30 또는 28(윤달에는 29). 
W : 주중(weekday)를 의미. 날짜와 같이 쓰면 그 날짜가 주중인 날을 의미.
25 
Expression Meaning 
0 0 12 * * ? 매일 12시(정오) 
0 15 10 ? * * 매일 오전 10시 15분 
0 15 10 * * ? 매일 오전 10시 15분 
0 15 10 * * ? * 매일 오전 10시 15분 
0 15 10 * * ? 2005 2005년에 매일 아침 10시 15분 
0 * 14 * * ? 매일 오후 2시 0분 ~ 59분 
0 0/5 14 * * ? 매일 오후 2시부터 2시 55분까지 5분마다 
0 0/5 14,18 * * ? 매일 오후 2시부터 2시 55분까지 5분마다, 6시부터 6시 55분까지 5분 
마다 
0 0-5 14 * * ? 매일 오후 2시부터 2시 5분까지 매분 
0 10,44 14 ? 3 WED 매년 3월의 수요일마다 오후 2시 10분과 2시 44분 
0 15 10 ? * MON-FRI 월요일부터 금요일까지 오전 10시 15분 
0 15 10 15 * ? 매달 15일 오전 10시 15분 
0 15 10 L * ? 매달 마지막 날 오전 10시 15분 
0 15 10 ? * 6L 매달 마지막 금요일 오전 10시 15분 
0 15 10 ? * 6L 2002-2005 2002년부터 2005년까지 매달 마지막 금요일 오전 10시 15분 
0 15 10 ? * 6#3 매달 3번째 금요일 오전 10시 15분 
0 0 12 1/5 * ? 매달 첫날부터 5일마다 12시(정오) 
0 11 11 11 11 ? 매년 11월 11일 오전 11시 11분
26 
QuartzCronTrigger.java
27 
MyJob.java 
Hello.java
28 
거의 일정한 시간간격으로 실행된다.
29 
Quartz + Spring
30 
Hello JobDetailBean TriggerBean SchedulerBean 
Hello : 개발자가 직접 작성할 비즈니스 컴포넌트. 
JobDetailBean : Job과 Job 속성 및 파라미터 정보를 모아놓은 컴포넌트. 
TriggerBean : Job 실행 시작, 주기등을 설정하는 컴포넌트. 
SchedulerBean : 모든 Job 설정 정보를 갖고 Manager Thread를 생성해서 해 
당 시간에 Job을 실행하는 컴포넌트.
31 
모듈 : 설명 
spring-core.jar : 스프링코어 
spring-context-support.jar : Quartz 지원 
Maven 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-core</artifactId> 
<version>4.1.1.RELEASE</version> 
</dependency> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-context-support</artifactId> 
<version>4.1.1.RELEASE</version> 
</dependency>
32 
quartz2.2.1.xml
33 
MyJobBean.java 
Hello.java
34
35 
Jenkins의 장점 Jenkins의 단점 
Job 추가/삭제/목록 등을 UI를 통해서 쉽게 관리 
가능 
Job 순서에 대한 개런티를 보장함 
(즉 선행된 동일 Job이 끝날때 까지 대기) 
다양한 플러그인 제공 
클러스터링을 통한 중앙 집중 관리 
심플한 Job Flow를 제공 
실행 Job 앞뒤로 before, after 처리 가능 
Java 외에 모든 언어 및 shell를 지원 
Job 실패 와 성공 유무를 UI를 통해서 확인 가능 
실행 중인 Job를 취소 할 수 있음. 
Job 시작/종료 시간을 알 수 있음. 
매번 Job를 hard하게 run ( java -jar ….)하기 때문 
에 
세밀한 스케줄러 타이밍 어려움 
(스프링으로 된 Job일 경우 10 ~ 15초 정도 
delay) 
초 단위 Batch를 정확하게 스케줄링 하기 어려움 
비즈니스 로직에 의한 스케줄러 실행 유무가 어 
려움 
http://geekery.freecharge.in/2013/04/19/ 
3/
36 
http://java-source.net/open-source/job-schedulers 
http://blog.dreamcss.com/tools/java-based-job-scheduler/ 
http://www.java-opensource.com/open-source/job-schedulers.html 
http://toppersworld.com/top-10-open-source-java-job-schedulers/
37 
블로그 : http://blog.cjred.net/tag/자바스케줄링 
소스 : https://github.com/redrebel/Scheduling 
요한계시록 21장 6절

Mais conteúdo relacionado

Semelhante a 자바기반 스케줄링 프로그래밍

멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면Byeongsu Kang
 
DevOps는 원격근무를 추구하면 안되는 걸까?
DevOps는 원격근무를 추구하면 안되는 걸까?DevOps는 원격근무를 추구하면 안되는 걸까?
DevOps는 원격근무를 추구하면 안되는 걸까?Jesang Yoon
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
Intro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, OperatorIntro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, OperatorJeongbae Oh
 
github actions kubernetes 설치&운영하기
github actions kubernetes 설치&운영하기github actions kubernetes 설치&운영하기
github actions kubernetes 설치&운영하기newdeal2
 
Azure function 활용한 파이썬 크롤링 스케줄링
Azure function 활용한 파이썬 크롤링 스케줄링Azure function 활용한 파이썬 크롤링 스케줄링
Azure function 활용한 파이썬 크롤링 스케줄링Chinseok Lee
 
Celery의 빛과 그림자
Celery의 빛과 그림자Celery의 빛과 그림자
Celery의 빛과 그림자Minyoung Jeong
 
Dropbox와 같은 시스템은 파일을 어떻게 저장할까?
Dropbox와 같은 시스템은 파일을 어떻게 저장할까?Dropbox와 같은 시스템은 파일을 어떻게 저장할까?
Dropbox와 같은 시스템은 파일을 어떻게 저장할까?nexusz99
 
03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)Hankyo
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축Juhong Park
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In ProductionMooYeol Lee
 
TenforFlow Internals
TenforFlow InternalsTenforFlow Internals
TenforFlow InternalsKiho Hong
 
Python3 11장 날짜이야기
Python3 11장 날짜이야기Python3 11장 날짜이야기
Python3 11장 날짜이야기Jihoon Kong
 
2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기Jay Park
 
2020년 4월 25일 개발 이야기 정리
2020년 4월 25일 개발 이야기 정리2020년 4월 25일 개발 이야기 정리
2020년 4월 25일 개발 이야기 정리Jay Park
 
추천서비스고군분투기 On Aws - 박진우 (레코벨)
추천서비스고군분투기 On Aws - 박진우 (레코벨)추천서비스고군분투기 On Aws - 박진우 (레코벨)
추천서비스고군분투기 On Aws - 박진우 (레코벨)AWSKRUG - AWS한국사용자모임
 
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅Youngmin Koo
 

Semelhante a 자바기반 스케줄링 프로그래밍 (20)

멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
 
DevOps는 원격근무를 추구하면 안되는 걸까?
DevOps는 원격근무를 추구하면 안되는 걸까?DevOps는 원격근무를 추구하면 안되는 걸까?
DevOps는 원격근무를 추구하면 안되는 걸까?
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Intro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, OperatorIntro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, Operator
 
github actions kubernetes 설치&운영하기
github actions kubernetes 설치&운영하기github actions kubernetes 설치&운영하기
github actions kubernetes 설치&운영하기
 
Azure function 활용한 파이썬 크롤링 스케줄링
Azure function 활용한 파이썬 크롤링 스케줄링Azure function 활용한 파이썬 크롤링 스케줄링
Azure function 활용한 파이썬 크롤링 스케줄링
 
12books
12books12books
12books
 
Celery의 빛과 그림자
Celery의 빛과 그림자Celery의 빛과 그림자
Celery의 빛과 그림자
 
Dropbox와 같은 시스템은 파일을 어떻게 저장할까?
Dropbox와 같은 시스템은 파일을 어떻게 저장할까?Dropbox와 같은 시스템은 파일을 어떻게 저장할까?
Dropbox와 같은 시스템은 파일을 어떻게 저장할까?
 
03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
TenforFlow Internals
TenforFlow InternalsTenforFlow Internals
TenforFlow Internals
 
Spring Boot 1
Spring Boot 1Spring Boot 1
Spring Boot 1
 
Python3 11장 날짜이야기
Python3 11장 날짜이야기Python3 11장 날짜이야기
Python3 11장 날짜이야기
 
2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기
 
Rx java essentials
Rx java essentialsRx java essentials
Rx java essentials
 
2020년 4월 25일 개발 이야기 정리
2020년 4월 25일 개발 이야기 정리2020년 4월 25일 개발 이야기 정리
2020년 4월 25일 개발 이야기 정리
 
추천서비스고군분투기 On Aws - 박진우 (레코벨)
추천서비스고군분투기 On Aws - 박진우 (레코벨)추천서비스고군분투기 On Aws - 박진우 (레코벨)
추천서비스고군분투기 On Aws - 박진우 (레코벨)
 
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
 

Mais de JungGeun Lee

Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)JungGeun Lee
 
20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)
20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)
20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)JungGeun Lee
 
20160409 microsoft 세미나 머신러닝관련 발표자료
20160409 microsoft 세미나 머신러닝관련 발표자료20160409 microsoft 세미나 머신러닝관련 발표자료
20160409 microsoft 세미나 머신러닝관련 발표자료JungGeun Lee
 
2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝
2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝
2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝JungGeun Lee
 
logback 세미나 발표자료
logback 세미나 발표자료logback 세미나 발표자료
logback 세미나 발표자료JungGeun Lee
 
개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지JungGeun Lee
 

Mais de JungGeun Lee (6)

Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)
 
20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)
20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)
20160409 microsoft 세미나 머신러닝관련 발표자료(축약본)
 
20160409 microsoft 세미나 머신러닝관련 발표자료
20160409 microsoft 세미나 머신러닝관련 발표자료20160409 microsoft 세미나 머신러닝관련 발표자료
20160409 microsoft 세미나 머신러닝관련 발표자료
 
2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝
2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝
2016 kcd 세미나 발표자료. 구글포토로 바라본 인공지능과 머신러닝
 
logback 세미나 발표자료
logback 세미나 발표자료logback 세미나 발표자료
logback 세미나 발표자료
 
개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지
 

Último

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 

Último (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 

자바기반 스케줄링 프로그래밍

  • 2. 2
  • 3. 3 어떤 프로젝트에서 , 특정 시각이나 일정시간 간격 으로 job 이 실행되어야 하는 경우. 매일 혹은 매월 통계데이터를 만들어야 되는 배치성 업무나, 일정 주기별로 서비스의 상태나 변경사항을 관리자 에게 알려줘야되는 업무. 일반적으로 Java Timer API 나 Crontab, Quartz로 구현. (그 외에도 다수의 job scheduler library 가 존재.)
  • 4. 4 PG(Payment Gateway) 개발/운영의 배치성 업무 • 매일 새벽에 그전날 결제건에 대한 통계생성 • 외부 PG업체에서 전날의 결제정보를 받아와 우리시스템과의 대사작업 수행 • 매월 초 이전달 결제에 대한 정산작업 • 매월 말 이전달 결제에 대한 청구작업 각 업무의 특성에 맞게 crontab 과 quartz 를 선택하여 사용 중.
  • 6. 6 유닉스에서 오래전부터 사용. 오랜시간동안 스케줄링의 성능이 입증. $ [1 2 3 4 5 사용아이디 명령어] 1: minute (0-59) 2: hour (0-23) 3: day of the month(1-31) 4: month of the year(1-12) OR jan, feb, mar, apr ... 5: day of the week (0- 6)(Sunday=0 or 7) OR sun, mon, tue, wed, thu, fri, sat
  • 7. 7 예) #date time sync 0 5 * * * root /usr/bin/rdate -s time.bora.net && /sbin/hwclock –w 0/1 * * * * date >> /Users/red/date.txt 로그 파일 백업이나 주기적으로 간단한 동작을 하는 명령이나 프로세 스에 적당함.
  • 9. 9 import java.util.Timer import java.util.TimerTask public void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) Parameters: task - 스케줄링 되어 실행될 task. firstTime - 실행될 task의 처음시각. period - task가 실행될 주기(millisecond).
  • 10. 10
  • 11. 11
  • 12. 12
  • 13. 13 단점 자바의 특성과 다양한 플랫폼에서의 구현때문에, 각각의 JVM에서의 Thread 스케줄링의 구현은 일치하지 않는다. Task는 Runnable 객체로 구현되어 있고 일정시간동안 sleep상태가 된다. 그러 면 Timer가 규정된 순간에 task를 깨운다. 그러나 정확한 실행시간은 JVM 의 스케줄링 정책과 현재 얼마나 많은 Thread가 프로세서를 기다리고 있냐에 따 라 달라진다. Task가 지연되는 경우는 크게 2가지이다. •많은 수의 쓰레드가 실행되기를 기다리고 있는 경우 •GC 에 의한 지연 각 Timer 객체는 쓰레드를 백그라운드로 시작한다. 이러한 방식은 J2EE 애플리케이션 서버와 같은 환경에서는 바람직하지 않을 것이다. 왜냐하면 이러한 쓰레드들이 컨테이너 영역 내에 있지 않기 때문이다.
  • 14. 14 예) 맛집에서 식사하기 2시간후에 식사를 하러간다. 줄을 서서 차례를 기다린다. 음식을 주문한다. 식사시간이 늦어졌다.
  • 16. 16 예) 맛집에서 식사하기 2시간후에 식사를 하러간다. 2시간후로 예약을 해놓자! 음식도 주문해 놓자! 2시간후에 가면 바로 먹을 수 있다. http://www.quartz-scheduler.org/ http://www.quartz-scheduler.org/downloads
  • 17. 17 모듈 : 설명 quartz-2.2.1.jar : Quartz 코어 quartz-jobs-2.2.1.jar : Quartz Job 지원 Maven <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency>
  • 18. 18 Quartz + SimpleTrigger
  • 19. 19 SimpleTrigger : 간단하며 interval, delay, repeat times등을 설정 하여 사용.
  • 20. 20 SimpleTrigger : 간단하며 interval, delay, repeat times등을 설정 하여 사용. MyJob.java Hello.java
  • 21. 21 거의 일정한 시간간격으로 실행된다.
  • 22. 22 Quartz + CronTrigger
  • 23. 23 CronTrigger는 "cron 표현법"을 사용하여 스케줄링 기능을 제공. 작업(Job) 실행이 달력 개념을 기반으로 반복된다면 SimpleTrigger보다 CronTrigger가 더 유용하게 사용. "매주 월요일부터 금요일까지 아침8시” "매달 마지막 금요일 새벽1시30분”
  • 24. 24 필드 명 필수 허용 값 Special characters 초(seconds) Yes 0-59 , - * / 분(minutes) Yes 0-59 , - * / 시(hours) Yes 0-23 , - * / 날짜(day of month) Yes 1-31 , - * / ? L W 월(month) Yes 1-12 or JAN-DEC , - * / 요일(day of week) Yes 1-7 or SUN-SAT , - * / ? L # 년(year) No empty, 1979-2099 , - * / 특수문자 설명 * : 모든 값을 의미. ? : 특정 값을 정하지 않음. - : 범위를 의미. 예) 0-10이면 0부터 10까지. , : 값을 추가. 0-10,20-30은 0부터 10까지, 그리고 20부터 30까지. / : 증분을 의미. 예) 초에 0/15를 사용하면 15초마다(0, 15, 30, 45) . L : 마지막을 의미. 날짜에 사용하면 월의 마지막 날을 의미. 31, 30 또는 28(윤달에는 29). W : 주중(weekday)를 의미. 날짜와 같이 쓰면 그 날짜가 주중인 날을 의미.
  • 25. 25 Expression Meaning 0 0 12 * * ? 매일 12시(정오) 0 15 10 ? * * 매일 오전 10시 15분 0 15 10 * * ? 매일 오전 10시 15분 0 15 10 * * ? * 매일 오전 10시 15분 0 15 10 * * ? 2005 2005년에 매일 아침 10시 15분 0 * 14 * * ? 매일 오후 2시 0분 ~ 59분 0 0/5 14 * * ? 매일 오후 2시부터 2시 55분까지 5분마다 0 0/5 14,18 * * ? 매일 오후 2시부터 2시 55분까지 5분마다, 6시부터 6시 55분까지 5분 마다 0 0-5 14 * * ? 매일 오후 2시부터 2시 5분까지 매분 0 10,44 14 ? 3 WED 매년 3월의 수요일마다 오후 2시 10분과 2시 44분 0 15 10 ? * MON-FRI 월요일부터 금요일까지 오전 10시 15분 0 15 10 15 * ? 매달 15일 오전 10시 15분 0 15 10 L * ? 매달 마지막 날 오전 10시 15분 0 15 10 ? * 6L 매달 마지막 금요일 오전 10시 15분 0 15 10 ? * 6L 2002-2005 2002년부터 2005년까지 매달 마지막 금요일 오전 10시 15분 0 15 10 ? * 6#3 매달 3번째 금요일 오전 10시 15분 0 0 12 1/5 * ? 매달 첫날부터 5일마다 12시(정오) 0 11 11 11 11 ? 매년 11월 11일 오전 11시 11분
  • 28. 28 거의 일정한 시간간격으로 실행된다.
  • 29. 29 Quartz + Spring
  • 30. 30 Hello JobDetailBean TriggerBean SchedulerBean Hello : 개발자가 직접 작성할 비즈니스 컴포넌트. JobDetailBean : Job과 Job 속성 및 파라미터 정보를 모아놓은 컴포넌트. TriggerBean : Job 실행 시작, 주기등을 설정하는 컴포넌트. SchedulerBean : 모든 Job 설정 정보를 갖고 Manager Thread를 생성해서 해 당 시간에 Job을 실행하는 컴포넌트.
  • 31. 31 모듈 : 설명 spring-core.jar : 스프링코어 spring-context-support.jar : Quartz 지원 Maven <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.1.RELEASE</version> </dependency>
  • 34. 34
  • 35. 35 Jenkins의 장점 Jenkins의 단점 Job 추가/삭제/목록 등을 UI를 통해서 쉽게 관리 가능 Job 순서에 대한 개런티를 보장함 (즉 선행된 동일 Job이 끝날때 까지 대기) 다양한 플러그인 제공 클러스터링을 통한 중앙 집중 관리 심플한 Job Flow를 제공 실행 Job 앞뒤로 before, after 처리 가능 Java 외에 모든 언어 및 shell를 지원 Job 실패 와 성공 유무를 UI를 통해서 확인 가능 실행 중인 Job를 취소 할 수 있음. Job 시작/종료 시간을 알 수 있음. 매번 Job를 hard하게 run ( java -jar ….)하기 때문 에 세밀한 스케줄러 타이밍 어려움 (스프링으로 된 Job일 경우 10 ~ 15초 정도 delay) 초 단위 Batch를 정확하게 스케줄링 하기 어려움 비즈니스 로직에 의한 스케줄러 실행 유무가 어 려움 http://geekery.freecharge.in/2013/04/19/ 3/
  • 36. 36 http://java-source.net/open-source/job-schedulers http://blog.dreamcss.com/tools/java-based-job-scheduler/ http://www.java-opensource.com/open-source/job-schedulers.html http://toppersworld.com/top-10-open-source-java-job-schedulers/
  • 37. 37 블로그 : http://blog.cjred.net/tag/자바스케줄링 소스 : https://github.com/redrebel/Scheduling 요한계시록 21장 6절

Notas do Editor

  1. 어떤 프로젝트에서 , 특정 시각이나 일정시간 간격으로 job 이 실행되어야 하는 경우가 있습니다. 매일 혹은 매월 통계데이터를 만들어야 되는 배치성 업무나, 일정 주기별로 서비스의 상태나 변경사항을 관리자에게 알려줘야되는 업무가 그 예입니다. 일반적으로 Java Timer API 나 Crontab, Quartz로 구현합니다.(그 외에도 다수의 job scheduler library 가 존재합니다.)
  2. 어떤 프로젝트에서 , 특정 시각이나 일정시간 간격으로 job 이 실행되어야 하는 경우가 있습니다. 매일 혹은 매월 통계데이터를 만들어야 되는 배치성 업무나, 일정 주기별로 서비스의 상태나 변경사항을 관리자에게 알려줘야되는 업무가 그 예입니다. 일반적으로 Java Timer API 나 Crontab, Quartz로 구현합니다.(그 외에도 다수의 job scheduler library 가 존재합니다.)