Schedule

ICE4에서 배치작업은 Schedule Task 데이터를 이용하여 실행 및 관리 할 수 있다.

Schedule Task

ScheduleTask는 다음과 같은 속성으로 정의되어 있다.

pid

valueType

description

pid

valueType

description

id

STRING

스케쥴의 아이디

name

STRING

이름

scheduleType

CODE

스케쥴 실행 시간 관련 유형

config

STRING

실행 시간 관련 설정 데이터
- delay, rate의 경우 밀리세컨드
- cron의 경우 cron 구문

enable

BOOLEAN

사용 여부

executeType

CODE

다중 서버에서의 실행 유형

  • sync : 다중 서버에서 동기화를 하면서 실행

  • server : Maser-Slave를 지정하여 실행

  • parallel : 다중 서버에서 동시 실행

microservice

REFERENCES

해당 스케쥴이 실행될 마이크로서비스 지정

masterServer

REFERENCE

executeType이 server인 경우의 마스터 서버 지정

slaveServer

REFERENCE

executeType이 server인 경우의 슬래이브 서버 지정

syncTime

INT

sync나 server일때 동기화를 위해서 대기하는 시간 지정

actionType

CODE

스케쥴 실행 유형

  • service: Java 코드 실행

  • update: SQL 실행

  • call: Callable Statement 실행

datasource

STRING

actionType이 update 또는 call인 경우 대상 DB의 datasource 지정

actionBody

STRING

실행 구문 지정 (EventAction 참조)

actionParam

STRING

스케줄 실행에 필요한 파라미터 정의

loggingType

CODE

스케줄 로그 저장 유형

  • error : 에러 발생시만 저장

  • execute : 실행하면 모두 저장

logs

REFERENCED

해당 스케쥴의 스케줄 로그

동작환경에 따른 설정 CASE

다중 서버에서 구동할경우에 스케쥴 설정은 다음과 같은 case로 구분할 수 있다.

모든 서버에서 독립적으로 동작

예를들어 각 서버의 로그 파일을 주기적으로 삭제해야하는 스케쥴 작업이 있다면, 이런 작업은 모드 서버에서 독립적으로 실행하면 된다. 이런 경우는 다음과 같이 설정한다.

{ "typeId": "scheduleTask", "id": "cleanupLog", "name": "Cleanup old logging - 30 days", "scheduleType": "delay", "config": "3600000", "executeType": "parallel", "microservice": "core", "enable": true, "actionType": "service", "actionBody": "logService.cleanup", "actionParam": "30" }

해당 설정은 1시간마다(config: 3600000) 독립적(executeType: parallel)으로 모든서버(microservice: core)에서 동작한다.

모든 서버에서 동기화하여 동작

각 서버의 로그 파일을 주기적으로 읽어서 통계 데이터를 만드는 스케쥴 작업이 있다면, 이런 작업은 모든 서버에서 동작하지만 DB나 캐시 Lock을 피하기 위해서 동시에 실행하지 않도록 해야 하는데, 이런 경우는 다음과 같이 설정한다.

{ "typeId": "scheduleTask", "id": "dataArchive", "name": "Execute Data Archive", "scheduleType": "cron", "config": "0 10 * * * *", "executeType": "sync", "microservice": "core", "enable": true, "actionType": "service", "actionBody": "dataArchiveService.archiveSchedule" }

해당 설정은 매시간 10분에(0 10 * * * *) 서버들간 동기화하여(executeType: sync)으로 모든서버(microservice: core)에서 동작한다. 즉, 한서버에서 동작하고 있는 동안에 다른 서버는 대기하고 있다가 동작하던 서버 작업이 완료된 후에 다른 서버에서 실행하게 된다.

한서버에서만 동작

외부 API를 호출하여 데이터를 주기적으로 수집하는 경우와 같은 스케쥴은 특정 시점에 한대의 서버에서만 동작해야 한다. 또한, 이중화 구성인 경우 한대의 서버가 동작하지 않을때에도 실행가능한 서버에서 동작해야하는 경우에는 syncTime을 설정하여 동작 방식을 결정할 수 있다.

{ "typeId": "scheduleTask", "id": "testSync", "name": "Test Sync", "scheduleType": "cron", "config": "0 0 1 * * *", "enable": true, "executeType": "sync", "syncTime": "360", "microservice": "test", "actionType": "service",, "actionBody": "basicSampleService.schedule" }

해당 설정은 매일 새벽 1시(0 0 1 * * *) test 마이크로서비스를 포함하고 있는 서버(microservice: test, ym 설정 참조) 중에서 하나의 서버에서 먼저 실행이 되면 다른 서버는 대기하다가 실행한 서버의 실행시간이 30분 이내(syncTime: 1800)면 실행하지 않고 30분 이상이면 해당 서버에서 스케줄을 실행한다. 여기서 syncTime의 역할은 두 대의 서버가 있는 경우에 한서버에서 스케줄이 먼저 실행한 경우 다른 서버는 대기를 하게 되는데, 만약 먼저 실행한 서버가 스케줄 실행을 정상적으로 완료하지 못하고 동작중에 다운된 경우에 다른 서버에서 이를 인식하여 동작하게 하기위한 설정으로 일반적으로 해당 스케줄 작업이 정상적으로 실행되었을 경우의 최대 실행 시간을 설정 하면 된다.