Quartz는 먼저 이전글(자바기반 스케줄링 프로그래밍(3) - java.util.java)의 맛집 예와 비교해보겠다.


지금 시간이 오후 2시이고 7시에 맛집에서 식사를 하려고 한다면,

1. 지금부터 5시간후에 가겠다고 맛집에 예약을 해놓는다.(음식도 주문한다)

2. 5시간후에 맛집에 가면 거의 기다리지 않고 바로 먹을 수 있다.


Quartz 의 공식 사이트와 다운로드 할 수 있는 주소는 아래와 같다.

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

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>


quartz를 사용하기 위해서는 몇가지 알아야되는 것들이 있는데,

그중 Trigger 라는 것이 있다.


이론적인 설명은 구글링을 통하여 각자 알아보길 바란다.


우선 이번 글에서는 Trigger 중 SimpleTrigger 를 설명하고 

CronTrigger 에 대한것은 다음글에 설명하도록 하겠다.


SimpleTrigger : 사용이 간단하며 interval, delay, repeat times등을 설정 할 수 있다.



output



거의 일정한 시간간격으로 실행된다.

Posted by 빨강토끼
,

public void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)

Parameters: 

task - 스케줄링 되어 실행될 task. 

firstTime - 실행될  task의 처음시각. 

period - task가 실행될 주기(millisecond). 




output


java.util.Timer 는 단점이 있다.

output 을 보면 0.001~0.002초씩 로그시간이 지연이 발생되는것을 알수있다.


자바의 특성과 다양한 플랫폼에서의 구현때문에, 각각의 JVM에서의 Thread 스케줄링의 구현은 일치하지 않는다.

Task는 Runnable 객체로 구현되어 있고 일정시간동안 sleep상태가 된다. 그러면 Timer가 규정된 순간에 task를 깨운다. 그러나 정확한 실행시간은 JVM 의 스케줄링 정책과 현재 얼마나 많은 Thread가 프로세서를 기다리고 있냐에 따라 달라진다.

Task가 지연되는 경우는 크게 2가지이다.

- 많은 수의 쓰레드가 실행되기를 기다리고 있는 경우

- GC 에 의한 지연

각 Timer 객체는 쓰레드를 백그라운드로 시작한다.

이러한 방식은 J2EE 애플리케이션 서버와 같은 환경에서는 바람직하지 않을 것이다.

왜냐하면 이러한 쓰레드들이 컨테이너 영역 내에 있지 않기 때문이다.



예를 들어 

지금 시간이 오후 2시이고 7시에 맛집에서 식사하려고 한다면,

1.지금부터 5시간후에 맛집에가서 식사를 하겠다고 계획을 세운다.

2.5시간후에 맛집에 도착한다.

3.하지만. 이미 손님들이 줄을 서있어서 기다려서 먹어야한다….


이해하기 쉽게 하기 위하여 예를 든것이므로 혹시 잘못 이해하지 않길 바란다.

그럼 나름 정확한 시간간격으로 실행되거나 특정한 날이나 요일등의 달력기반의 스케줄링을 하려면 
어떻게 해야할까?

다음에 설명할 Quartz를 사용하면 된다.


Posted by 빨강토끼
,

cron 은 오랬동안 사용되어오며 스케줄링 성능의 입증되어온 유닉스의 툴이다.


cron 명령어는 OS마다 다소의 차이가 있지만 리눅스 기준으로


$crontab -e [엔터]


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


순으로 입력하고, 명령어란에 여러분이 만든 어플이나 실행스크립트를 넣어서 사용한다.


예를 들어 아래와 같은 명령이 있다고 하면

#date time sync

0 5 * * * root /usr/bin/rdate -s time.bora.net && /sbin/hwclock -w



매일 , 오전 5시 0분에 시스템의 기준시를 맞추는 동작(/usr/bin/rdate -s time.bora.net && /sbin/hwclock -w)을 하게 된다.


다른 예로는 OS X 에서 아래와 같은 명령은 매1분마다 date.txt 라는 파일에 현재시간을 기록하는 cron 명령이다. 

0/1 * * * * date >> /Users/red/date.txt



0/1 같이 다양한 특수문자를 사용할수 있다.


* : 모든 값을 의미.

? : 특정 값을 정하지 않음.

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


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



Posted by 빨강토끼
,