소개

macchina.io는 유닉스 플랫폼에서 이용가능한 잘 알려진 cron job 스케줄러와 유사한 잘 알려진 방식으로 스크립트를 구동하고 멈추는 책임을 하는 자바스크립트를 위한 스크립트 스케줄러를 포함한다. 설치된 스크립트들은 특정 시간 또는 연속적으로 유지되며 매일 시작될 수 있다. 멀티플 스크립트들도 병렬로 시작될 수 있다.

스케줄 지정

스크립트 실행 스케줄을 지정하기 위한 형식은 몇몇 확장된 것을 제외하고 cron에서 사용되는 형식과 거의 동일하다. 스크립트를 위한 스케줄은 com.appinf.osp.js.schedule 확장 포인트 엘레먼트의 스케줄 속성을 사용하여 지정한다.

속성 값의 일반적인 형식은 다음과 같다:

"* * * * *"
 │ │ │ │ │
 │ │ │ │ │
 │ │ │ │ └─── 요일 (0 – 7, 0/7 = 일요일, 1 = 월요일, 6 = 토요일)
 │ │ │ └───── 달 (1 - 12)
 │ │ └─────── 일 (1 - 31)
 │ └───────── 시 (0 - 23)
 └─────────── 분 (0 - 59)

cron 표현에서의 단일 필드는 아래와 같이 명시하며, 특정 값을 가질 수 있다:

필드 명         허용되는 값                             허용되는 특수 문자
---------------------------------------------------------------------------
Minute         0 – 59                                 * , - /
Hour           0 – 23                                 * , - /
Day of Month   1 – 31                                 * , -
Month          1 – 12 or JAN, FEB, ... DEC            * , -
Day of Week    0 – 7 or SUN, MON, TUE, ... SAT, SUN   * , -

콤마(",")는 리스트의 아이템을 분리하기 위해서 사용된다. 예를 들어, week 필드의 day에 "MON, WED FRI"를 사용하는 것은 월요일, 수요일, 금요일을 의미한다. 하이픈("-")은 범위를 정의한다. 예를 들어, week 필드의 day에 "MON-FRI" 또는 "1-5"는 월, 화, 수, 목,금요일을 의미한다. 슬래쉬("/")는 단계 값을 명시하기 위해서 범위내에서 조합될 수 있다. 예를 들어, minute 필드에서 */5는 매 5분을 나타낸다. 좀 더 자세한 형식 5,10,15,20,25,30,35,40,45,50,55,00의 약어이다. 여러 개의 독립적인 일정은 여러 개의 확장 포인트 원소를 사용해서 명시될 수 있다.

시간은 현지 시간(local time)을 나타낸다.

예제: 매일 22:00 (오후 10:00)에 스크립트 nightly.js를 구동하라:

<extension point="com.appinf.osp.js.schedule" 
    script="nightly.js" schedule="0 22 * * *"/>

뒤에 붙는 별표(asterisk)는 생략할 수 있으므로, 다음과 같이 작성될 수 있다:

<extension point="com.appinf.osp.js.schedule" 
    script="nightly.js" schedule="0 22"/>

표준 cron 표기법에 추가로, 다음의 특별한 값도 사용될 수 있다:

@yearly: Run once a year at midnight of January 1 (0 0 1 1 *)

@monthly: Run once a month at midnight of the first day of the month (0 0 1 * *)

@weekly: Run once a week at midnight on Sunday morning (0 0 * * 0)

@daily: Run once a day at midnight (0 0 * * *)

@hourly: Run once an hour at the beginning of the hour (0 * * * *)

@start: Run the script when the bundle containing it is started.

@stop: Run the script when the bundle containing it is stopped.

@once: Run the script at most once, when the bundle containing it is started the first time.

스크립트가 스케줄러에 의해 시작되면, 종료할 때까지 구동이 계속된다. @start 스케줄을 명시하여, 스크립트는 계속적으로 구동할 수 있다. 스크립트는 또한 내부적으로 작업을 스케줄하기 위해서 macchina.io 플랫폼에서 제공하는 setTimeout()과 setInterval() 함수를 사용할 수 있다. 예를 들어, setInterval()을 사용해서, 스크립트는 매 정확한 30초 마다 수행할 수 있따:

setInterval(function() { 
        logger.information("30 seconds passed."); 
    }, 30000);

이 방법은 cron 표기법으로는 표현할 수 없는 작업을 스케줄하는 것이 가능하다.

만약 스크립트가 새로운 시도(invocation)가 스케줄될 때, 이전에 스케줄된 시도가 여전히 구동중이라면, 새로운 시도는 이전의 것이 완료될때까지 지연될 것이다.

스크립트 실행이 스케줄되어질 때 날짜와 시간 범위는 확장 포인트에서의 2가지 추가적인 속성을 갖고 제약될 수 있다. notBefore 속성은 스크립트가 스케줄되어지는 첫번째 date/time을 명시하는 것을 허용한다. notAfter 속성은 스크립트의 가장최신의 가능한 실행을 명시하는 것을 허용한다. 날짜와 시간은 ISO8601 형식으로 주어진다. 예제: 2016년 1월 5일에 시작해서 2016년 1월 10일까지 매일 22:00에 nightly.js 스크립트를 실행하라:

<extension point="com.appinf.osp.js.schedule" 
    script="nightly.js" schedule="0 22 * * *"
    notBefore="2016-01-05T00:00:00"
    notAfter="2016-01-10T23:59:59" />

2016년 1월을 시작으로 매월 5일에 스크립트를 실행:

<extension point="com.appinf.osp.js.schedule" 
    script="nightly.js" schedule="0 0 5 * *"
    notBefore="2016-01-01" />

2015년 12월 1일을 시작으로, 2016년 12월 25일까지 매일 오전 10시:

<extension point="com.appinf.osp.js.schedule" 
    script="nightly.js" schedule="10 0 * * *"
    notBefore="2015-12-01"
    notAfter="2016-12-26" />

매일 수요일과 일요일 22:00에 실행:

<extension point="com.appinf.osp.js.schedule" 
    script="nightly.js" schedule="22 0 * * WED,SAT" />

스크립트 파일들

스케줄러를 위한 스크립트는 start()를 export하는 모듈로 작성되어야 하며, stop() 함수는 옵션이다. 모듈은 스케줄러 스크립트를 포함하는 번들이 로드될 떄, 초기화된다. stat() 함수는 스크립트가 실행하기 위해 스케줄될 때 호출된다. 옵션인 stop() 함수는 번들이 스크립트가 멈춰지는 것을 포함할 때 호출된다. 이것은 cleanup 작업을 수행하기 위해서 사용될 수 있다. 일반적으로, 스케줄러를 위한 스크립트는 다음의 구조를 따라야 한다:

logger.debug("Initializing Script");

// Perform initialization tasks (called once when bundle is started).

module.exports = {
    start: function() {
        logger.debug("Script execution triggered by scheduler.");

        // Perform periodic tasks at the scheduled times.
    },

    stop: function() {
        logger.debug("Script terminating.");

        // Perform cleanup tasks when the bundle is stopped.
    }
};

macchina.io 0.7.0

Copyright © 2017, Applied Informatics Software Engineering GmbH(CC BY 3.0)

results matching ""

    No results matching ""