Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,855 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. cjred77@gmail.com
  2. 2. 2
  3. 3. 3 어떤 프로젝트에서 , 특정 시각이나 일정시간 간격 으로 job 이 실행되어야 하는 경우. 매일 혹은 매월 통계데이터를 만들어야 되는 배치성 업무나, 일정 주기별로 서비스의 상태나 변경사항을 관리자 에게 알려줘야되는 업무. 일반적으로 Java Timer API 나 Crontab, Quartz로 구현. (그 외에도 다수의 job scheduler library 가 존재.)
  4. 4. 4 PG(Payment Gateway) 개발/운영의 배치성 업무 • 매일 새벽에 그전날 결제건에 대한 통계생성 • 외부 PG업체에서 전날의 결제정보를 받아와 우리시스템과의 대사작업 수행 • 매월 초 이전달 결제에 대한 정산작업 • 매월 말 이전달 결제에 대한 청구작업 각 업무의 특성에 맞게 crontab 과 quartz 를 선택하여 사용 중.
  5. 5. 5 cron 명령어
  6. 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. 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. 8. 8 java.util.Timer
  9. 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. 10
  11. 11. 11
  12. 12. 12
  13. 13. 13 단점 자바의 특성과 다양한 플랫폼에서의 구현때문에, 각각의 JVM에서의 Thread 스케줄링의 구현은 일치하지 않는다. Task는 Runnable 객체로 구현되어 있고 일정시간동안 sleep상태가 된다. 그러 면 Timer가 규정된 순간에 task를 깨운다. 그러나 정확한 실행시간은 JVM 의 스케줄링 정책과 현재 얼마나 많은 Thread가 프로세서를 기다리고 있냐에 따 라 달라진다. Task가 지연되는 경우는 크게 2가지이다. •많은 수의 쓰레드가 실행되기를 기다리고 있는 경우 •GC 에 의한 지연 각 Timer 객체는 쓰레드를 백그라운드로 시작한다. 이러한 방식은 J2EE 애플리케이션 서버와 같은 환경에서는 바람직하지 않을 것이다. 왜냐하면 이러한 쓰레드들이 컨테이너 영역 내에 있지 않기 때문이다.
  14. 14. 14 예) 맛집에서 식사하기 2시간후에 식사를 하러간다. 줄을 서서 차례를 기다린다. 음식을 주문한다. 식사시간이 늦어졌다.
  15. 15. 15 Quartz
  16. 16. 16 예) 맛집에서 식사하기 2시간후에 식사를 하러간다. 2시간후로 예약을 해놓자! 음식도 주문해 놓자! 2시간후에 가면 바로 먹을 수 있다. http://www.quartz-scheduler.org/ http://www.quartz-scheduler.org/downloads
  17. 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. 18 Quartz + SimpleTrigger
  19. 19. 19 SimpleTrigger : 간단하며 interval, delay, repeat times등을 설정 하여 사용.
  20. 20. 20 SimpleTrigger : 간단하며 interval, delay, repeat times등을 설정 하여 사용. MyJob.java Hello.java
  21. 21. 21 거의 일정한 시간간격으로 실행된다.
  22. 22. 22 Quartz + CronTrigger
  23. 23. 23 CronTrigger는 "cron 표현법"을 사용하여 스케줄링 기능을 제공. 작업(Job) 실행이 달력 개념을 기반으로 반복된다면 SimpleTrigger보다 CronTrigger가 더 유용하게 사용. "매주 월요일부터 금요일까지 아침8시” "매달 마지막 금요일 새벽1시30분”
  24. 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. 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. 26. 26 QuartzCronTrigger.java
  27. 27. 27 MyJob.java Hello.java
  28. 28. 28 거의 일정한 시간간격으로 실행된다.
  29. 29. 29 Quartz + Spring
  30. 30. 30 Hello JobDetailBean TriggerBean SchedulerBean Hello : 개발자가 직접 작성할 비즈니스 컴포넌트. JobDetailBean : Job과 Job 속성 및 파라미터 정보를 모아놓은 컴포넌트. TriggerBean : Job 실행 시작, 주기등을 설정하는 컴포넌트. SchedulerBean : 모든 Job 설정 정보를 갖고 Manager Thread를 생성해서 해 당 시간에 Job을 실행하는 컴포넌트.
  31. 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>
  32. 32. 32 quartz2.2.1.xml
  33. 33. 33 MyJobBean.java Hello.java
  34. 34. 34
  35. 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. 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. 37 블로그 : http://blog.cjred.net/tag/자바스케줄링 소스 : https://github.com/redrebel/Scheduling 요한계시록 21장 6절

×