Scheduler 설정

본 장에서는 JEUS 설정 파일이나 Deployment Descriptor(DD)에 JEUS Scheduler를 설정하는 방법에 대해서 설명한다.

1. 개요

JEUS Scheduler Service를 사용하기 위해서는 각 서비스별로 필요한 내용을 설정해야 한다.

  • JEUS 서버에 Scheduler Service 설정

    원격에서 JEUS 서버 Scheduler Service에 접근하거나, Job-list를 이용하여 JEUS 서버에서 주기적인 작업을 수행하려면 Scheduler Service를 활성화시켜야 한다. Scheduler Service를 활성화하려면 domain.xml 설정 파일을 직접 편집하여 Scheduler Service를 사용하겠다는 설정을 해야 한다. 이 설정이 되어 있어야 서버가 부팅할 때 Scheduler Service를 시작한다. 설정하여야 하는 내용을 간단히 요약하면 아래와 같다.

    • Scheduler Service를 사용하도록 설정한다.

    • Scheduler Service에서 사용할 Thread Pool을 설정한다.

    • 서버에서 scheduling되어 수행할 Job-list에 대해서 설정한다.

  • 클라이언트 컨테이너에 Scheduler Service 설정

    • Deployment Descriptor(DD)에서 위의 내용을 설정한다.

즉, Scheduler를 사용하려면 서비스를 활성화시키는 설정과 Thread Pool 설정 그리고 실제 작업을 수행할 Job-list 설정을 해야 한다.

2. 서버 스케줄러 설정

본 절에서는 domain.xml 직접 편집을 통해 실제 서버에 Scheduler를 설정하는 방법에 대해서 설명한다.

원격에서 JEUS 서버 Scheduler Service에 접근하거나 Job-list를 이용하여 JEUS 서버에서 주기적인 작업을 수행하려면 서버에서 Scheduler Service를 활성화해야 한다. 이를 위해 domain.xml에 Scheduler Service 사용 설정을 추가해야 하며, 해당 설정이 되어 있어야 서버가 부팅할 때 Scheduler Service를 시작된다.

다음은 Schedule 클래스 상속에서 작성한 예제를 domain.xml 설정을 통해 서버에 Job으로 추가하는 방법이다.

JEUS domain 설정
...
<server>
    ...
    <scheduler>
        <enabled>true</enabled>
        <pooling>
            <dedicated>
                <min>0</min>
                <max>10</max>
                <keep-alive-time>60000</keep-alive-time>
                <queue-size>4096</queue-size>
                <stuck-thread-handling>
                    <max-stuck-thread-time>3600000</max-stuck-thread-time>
                    <action-on-stuck-thread>None</action-on-stuck-thread>
                    <stuck-thread-check-period>300000</stuck-thread-check-period>
                </stuck-thread-handling>
            </dedicated>
        </pooling>
        <job-list>
            <job>
                <name>SimpleTask</name>
                <class-name>java.sample.scheduler.SimpleTask</class-name>
                <begin-time>2024-08-26T10:30:00</begin-time>
                <end-time>2024-08-27T10:30:00</end-time>
                <interval>
                    <hourly>1</hourly>
                </interval>
                <count>10</count>
            </job>
        </job-list>
    </scheduler>
    ...
</server>
...

위 domain.xml 설정 항목 중, <pooling> 항목에 대한 자세한 내용은 JEUS Server 안내서의 Thread Pool 설정을 참고한다.

또한 <job-list> 항목에 대한 설명은 아래 Job-list 설정을 참고한다.

운영 중인 서버에 Scheduler를 추가하거나 변경하는 작업은 동적으로 반영되지 않는다. 설정만 저장해 두었다가 서버가 재기동될 때 반영된다.

서버를 재기동하면 추가한 Job이 수행되면서 서버 로그에 로깅된 결과를 조회할 수 있다.

##### waked on Mon Aug 26 10:30:00 KST 2024
##### waked on Mon Aug 26 11:30:00 KST 2024

3. Job-list 설정

본 절에서는 실제 작업을 수행할 Job을 등록하는 방법에 대해 설명한다.

프로그램 코드에서 작업을 등록하는 것 외에 JEUS 설정 파일에 작업을 등록하면 JEUS 서버가 구동될 때 작업이 자동으로 scheduling된다. Job은 scheduling될 하나의 작업 단위를 의미한다. Job에 해당하는 클래스는 반드시 jeus.schedule.ScheduleListener를 구현해야 하며 해당 클래스와 관련 클래스를 JAR 파일로 묶어 다음의 경로에 위치시켜야 한다.

  • 아래 디렉터리는 Master Server와 원격에 위치한 Managed Server(이하 MS) 사이에 동기화되지 않기 때문에 사용자가 Scheduler Service를 사용할 서버 장비마다 수동으로 동기화해야 한다.

    DOMAIN_HOME/lib/application
  • 아래 디렉터리는 JEUS를 설치했을 때 생성되는 디렉터리가 아니므로 사용자가 직접 생성해서 위치시켜야 한다.

    SERVER_HOME/lib/application

Job은 서버에 설정하면 JEUS Scheduler Service에서 작업이 수행된다.

다음은 Job을 설정할 때 작성해야 할 항목에 대한 설명이다.

항목 설명

Name

Job의 이름을 지정한다.

Class Name

Job을 수행하는 클래스의 Fully Qualified Name을 설정한다.

Description

Job의 설명을 입력한다.

Begin Time

작업이 최초로 수행될 시간을 지정한다. 설정하지 않을 경우 JEUS 서버가 기동할 때 시작한다.

  • 타입: XML dateTime type

  • 형식: yyyy-mm-ddThh:mm:ss (예: 2024-08-26T10:30:00)

만약 등록한 작업의 Begin Time이 과거이면 주기적으로 현재 시간 이후에 최초의 수행되어야 할 시간에 최초 수행되도록 조정된다.

End Time

작업이 끝날 시간을 지정한다. 설정되지 않을 경우 종료하지 않는다.

  • 타입: XML dateTime type

  • 형식: yyyy-mm-ddThh:mm:ss (예: 2024-08-27T10:30:00)

End Time이 과거인 경우에 작업은 한 번도 수행되지 않는다.

Interval

Job이 수행되는 주기를 지정한다. 아래 중에서 선택하여 지정할 수 있다.

  • millisecond

  • minutely

  • hourly

  • daily

Count

작업의 최대 수행 횟수를 지정한다. 설정되지 않거나 -1인 경우 최대 수행 횟수에 제한이 없다.

Job-list 방식으로 등록된 작업은 Fixed-rate 방식으로 반복된다. 따라서 비교적 정확한 시간에 호출되지만 작업 수행시간이 오래 걸릴 때는 작업이 동시에 진행될 수 있기 때문에 작업이 Thread-safe하도록 고려해야 한다.

4. Thread Pool 설정

Scheduler Service는 Thread Pool을 설정하여 Scheduler Service를 수행하는 데 필요한 Thread의 개수를 조절한다. Thread Pool은 System Thread Pool을 공유해서 사용하는 공용 Thread Pool과 별도의 Thread Pool을 설정하는 전용 Thread Pool로 나뉜다.

본 절에서는 콘솔 툴을 사용해서 Thread Pool을 설정하는 방법에 대해서 설명한다. 항목에 대한 자세한 내용은 JEUS Server 안내서의 Thread Pool 설정을 참고한다.

4.1. 공용 Thread Pool

Scheduler Service에서 공용 Thread Pool을 사용할 경우는 Thread 개수만 미리 할당해 놓으면 된다.

콘솔 툴 사용

다음은 콘솔 툴(jeusadmin)을 통해 Scheduler의 Thread Pool을 설정하는 방법이다.

[MASTER]domain1.adminServer>modify-system-thread-pool server1 -service scheduler -r 10
Successfully performed the MODIFY operation for The scheduler thread pool of the server (server1).,
but all changes were non-dynamic. They will be applied after restarting.
Check the results using "show-system-thread-pool server1 -service scheduler or modify-system-thread-pool server1 -service scheduler".

[MASTER]domain1.adminServer>show-system-thread-pool server1 -service scheduler
Shows the current configuration.
the system thread pool of the server (server1)
================================================================================
+---------------------------------------------------------+--------------------+
| Min                                                     | 0                  |
| Max                                                     | 100                |
| Keep-Alive Time                                         | 300000             |
| Queue Size                                              | 4096               |
| Max Stuck Thread Time                                   | 3600000            |
| Action On Stuck Thread                                  | IGNORE_AND_REPLACE |
| Stuck Thread Check Period                               | 300000             |
| Reserved Threads for the Service transaction            | 0                  |
| Reserved Threads for the Service scheduler              | 10                 |
| Reserved Threads for the Service namingserver           | 0                  |
+---------------------------------------------------------+--------------------+
================================================================================

4.2. 전용 Thread Pool

Scheduler Service에서 전용 Thread Pool을 사용할 경우 콘솔 툴(jeusadmin)을 통해 설정할 수 있다.

Scheduler Service의 Thread Pool 설정을 수정하는 것은 동적 반영 가능하기 때문에 서버를 재기동하지 않아도 된다. 하지만 공용 Thread Pool을 사용하다가 전용 Thread Pool을 사용하도록 Thread Pool의 타입을 변경하는 경우 동적 반영되지 않기 때문에 서버를 재기동해야 한다.

콘솔 툴 사용

다음은 콘솔 툴(jeusadmin)을 통해 Scheduler의 Thread Pool을 설정하는 방법이다.

[MASTER]domain1.adminServer>show-service-thread-pool server1 -service scheduler
Shows the current configuration.
==================================================
+------+-----------------------------------------+
(No data available)
==================================================

[MASTER]domain1.adminServer>modify-service-thread-pool server1 -service scheduler -min 0 -max 20
Successfully performed the MODIFY operation for The scheduler thread pool of the server (server1).,
but all changes were non-dynamic. They will be applied after restarting.
Check the results using "show-service-thread-pool server1 -service scheduler or modify-service-thread-pool server1 -service scheduler".

[MASTER]domain1.adminServer>show-service-thread-pool server1 -service scheduler
Shows the current configuration.
=====================================================================
+---------------------------------------------------------+---------+
| Min                                                     | 0       |
| Max                                                     | 20      |
| Keep-Alive Time                                         | 60000   |
| Queue Size                                              | 4096    |
| Max Stuck Thread Time                                   | 3600000 |
| Action On Stuck Thread                                  | NONE    |
| Stuck Thread Check Period                               | 300000  |
+---------------------------------------------------------+---------+
=====================================================================

5. 클라이언트 컨테이너 설정

Jakarta EE 애플리케이션을 사용하는 경우 클라이언트 컨테이너에서 구동되는 JEUS Scheduler에 대해 설정한다. 애플리케이션 클라이언트를 위한 JEUS DD인 jeus-client-dd.xml 파일에 다음과 같이 <scheduler> 설정을 추가한다.

클라이언트 컨테이너 설정 : <jeus-client-dd.xml>
<?xml version="1.0"?>
<jeus-client-dd>
    <module-info>
        ...
    </module-info>
    ...
    <scheduler>
        <enabled>true</enabled>
        <!-- Scheduler Thread-pool settings -->
        <pooling>
            <dedicated>
                <min>2</max>
                <max>10</max>
                <keep-alive-time>60000</keep-alive-time>
                <queue-size>4096</queue-size>
                <stuck-thread-handler>
                    <max-stuck-thread-time>3600000</max-stuck-thread-time>
                    <action-on-stuck-thread>None</action-on-stuck-thread>
                </stuck-thread-handler>
            </dedicated>
        </pooling>
    </scheduler>
  ...
</jeus-client-dd>

위의 설정 파일을 수정한 후에 JEUS 서버를 재기동할 필요는 없지만, 클라이언트 모듈과 클라이언트 컨테이너는 재기동해야 수정한 설정 내용이 반영된다.

  1. 클라이언트 컨테이너에서 Scheduler Service를 사용할 때는 공용 Thread Pool은 사용할 수 없다.

  2. 클라이언트 컨테이너와 애플리케이션 클라이언트에 대해서는 JEUS Application Client 안내서를 참고한다.

다음은 클라이언트 컨테이너에서 수행할 Job 설정 예제이다.

Job-list 설정 : <jeus-client-dd.xml>
<scheduler>
    ...
    <job-list>
        <job>
            <class-name>samples.ScheduleJob</class-name>
            <name>ScheduleJob</name>
            <description>This is a sample for scheduler service</description>
            <begin-time>2024-08-26T00:00:00</begin-time>
            <end-time>2024-08-27T00:00:00</end-time>
            <interval>
                <minutely>30</minutely>
            </interval>
            <count>-1</count>
        </job>
    </job-list>
</scheduler>