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

37

Upload: jeonggeun-lee

Post on 09-Jul-2015

722 views

Category:

Technology


6 download

DESCRIPTION

자바기반 스케줄링 프로그래밍 세미나 발표자료입니다. http://blog.cjred.net/tag/자바스케줄링

TRANSCRIPT

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 sync0 5 * * * root /usr/bin/rdate -s time.bora.net && /sbin/hwclock –w0/1 * * * * date >> /Users/red/date.txt

로그 파일 백업이나 주기적으로 간단한 동작을 하는 명령이나 프로세스에 적당함.

8

java.util.Timer

9

import java.util.Timerimport 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

http://www.quartz-scheduler.org/http://www.quartz-scheduler.org/downloads

예) 맛집에서 식사하기

2시간후에 식사를 하러간다.

2시간후로 예약을 해놓자!

음식도 주문해 놓자!

2시간후에 가면 바로 먹을 수 있다.

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 : Job과 Job 속성 및 파라미터 정보를 모아놓은 컴포넌트.

TriggerBean : Job 실행 시작, 주기등을 설정하는 컴포넌트.

SchedulerBean : 모든 Job 설정 정보를 갖고 Manager Thread를 생성해서 해당 시간에 Job을 실행하는 컴포넌트.

Hello JobDetailBean TriggerBean SchedulerBean

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-schedulershttp://blog.dreamcss.com/tools/java-based-job-scheduler/http://www.java-opensource.com/open-source/job-schedulers.htmlhttp://toppersworld.com/top-10-open-source-java-job-schedulers/

37

블로그 : http://blog.cjred.net/tag/자바스케줄링소스 : https://github.com/redrebel/Scheduling

요한계시록 21장 6절