Jenkins 을 스케줄링용도로 사용시 장점

  • Job 추가/삭제/목록 등의 UI를 통해서 쉽게 관리 가능
  • Job 순서에 대한 개런티를 보장함
    (즉 선행된 동일 Job이 끝날때 까지 대기)
  • 다양한 플러기인 제공
  • 클러스터링을 통한 중앙 집중 관리
  • 심플한 Job Flow를 제공
  • 실행 Job 앞뒤로 before, after 처리 가능
  • Java 외에 모든 언어 및 shell를 지원
  • Job 실패 와 성공 유뮤를 UI를 통해서 확인 가능
  • 실행 중인 Job을 취소 할 수 있음.
  • Job 시작/종료 시간을 알 수 있음.


Jenkins 을 스케줄링용도로 사용시 단점

  • 매번 Job를 hard하게  run (java -jar ….)하기 때문에세밀한 스케줄러 타이밍 어려움 (스프링으로 된 Job일 경우 10 ~ 15초 정도 delay)
  • 초 단위 Batch를 정확하게 스케줄링 하기 어려움
  • 비즈니스 로직에 의한 스케줄러 실행 유무가 어려움

하지만 개인적인 생각으로는 특별한 경우를 제외하고는 Quartz 기반으로 다른 기능들을 조합해서 

구현 및 운영하는 것이 좋다고 생각한다.


Jenkins 는 지속적인 통합빌트(C.I) 를 위한 툴의 성격이 강한 이유이다.


Jenkins의 장점으로 거론되는 기능들은 Spring Batch 나 DB 를 이용하여 Job을 관리하는 JDBCJobStore 를 사용하면 구현 가능하다.  


오히려 일반적인 경우 단점이 너무 크다.


Posted by 빨강토끼
,

spring 을 사용하여 quartz 를 사용하려면 아래와 같은 구조를 흔히 사용하게 된다.




Hello : 개발자가 직접 작성할 비즈니스 컴포넌트.


JobDetailBean : Job과 Job 속성 및 파라미터 정보를 모아놓은 컴포넌트.


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


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


그리고 각 bean 들을 FactoryBean 을 사용하여 생성한다.


일단 먼저 spring framework 를 설정해야된다.


중요 모듈은 아래와 같다.


모듈 : 설명 

spring-core.jar : 스프링코어 

spring-context-support.jar : Quartz 지원


Maven 으로 설정하기(pom.xml)

<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>



그리고 당연히 quartz 도 설정해야된다.

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


모듈 : 설명

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>




output



Posted by 빨강토끼
,

CronTrigger는 앞에서 살펴본 "cron 표현법"을 사용하여 스케줄링 기능을 제공한다.


작업(Job) 실행이 달력 개념을 기반으로 반복된다면  SimpleTrigger보다 CronTrigger가 더 유용하게 사용될 수 있다.


"매주 월요일부터 금요일까지 아침8시” 

"매달 마지막 금요일 새벽1시30분” 


하지만 cron 표현법 보다는 좀 더 자세한 설정이 가능한데 "초(seconds)" 와 "년(year)" 이다.

 필드

 필수

허용  

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)를 의미. 날짜와 같이 쓰면 그 날짜가 주중인 날을 의미. 


아래는 몇가지 예를 들어본것이다.



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



output




소스 : https://github.com/redrebel/Scheduling

Posted by 빨강토끼
,