JEUS Scheduler 안내서 JEUS v7.0 Fix#1 Copyright 2013 TmaxSoft Co., Ltd. All Rights Reserved.
Copyright Notice Copyright 2013 TmaxSoft Co., Ltd. All Rights Reserved. 대한민국경기도성남시분당구서현동 272-6 우 ) 463-824 Restricted Rights Legend All TmaxSoft Software (JEUS ) and documents are protected by copyright laws and international convention. TmaxSoft software and documents are made available under the terms of the TmaxSoft License Agreement and may only be used or copied in accordance with the terms of this agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any means, electronic, mechanical, or optical, without the prior written consent of TmaxSoft Co., Ltd. 이소프트웨어 (JEUS ) 사용설명서의내용과프로그램은저작권법과국제조약에의해서보호받고있습니다. 사용설명서의내용과여기에설명된프로그램은 TmaxSoft Co., Ltd. 와의사용권계약하에서만사용이가능하며, 사용권계약을준수하는경우에만사용또는복제할수있습니다. 이사용설명서의전부또는일부분을 TmaxSoft의사전서면동의없이전자, 기계, 녹음등의수단을사용하여전송, 복제, 배포, 2차적저작물작성등의행위를하여서는안됩니다. Trademarks JEUS is registered trademark of TmaxSoft Co., Ltd. Other products, titles or services may be registered trademarks of their respective companies. JEUS 는 TmaxSoft Co., Ltd. 의등록상표입니다. 기타모든제품들과회사이름은각각해당소유주의상표로서참조용으로만사용됩니다. Open Source Software Notice Some modules or files of this product are subject to the terms of the following licenses. : APACHE2.0, CDDL1.0, EDL1.0, OPEN SYMPHONY SOFTWARE1.1, TRILEAD-SSH2, Bouncy Castle, BSD, MIT, SIL OPEN FONT1.1 Detailed Information related to the license can be found in the following directory : ${INSTALL_PATH/lib/licenses 본제품의일부파일또는모듈은다음의라이선스를준수합니다. : APACHE2.0, CDDL1.0, EDL1.0, OPEN SYM PHONY SOFTWARE1.1, TRILEAD-SSH2, Bouncy Castle, BSD, MIT, SIL OPEN FONT1.1 관련상세한정보는제품의다음의디렉터리에기재된사항을참고해주십시오. : ${INSTALL_PATH/lib/licenses 안내서정보안내서제목 : JEUS Scheduler 안내서발행일 : 2013-04-30 소프트웨어버전 : JEUS v7.0 Fix#1 안내서버전 : v2.1.2
내용목차 안내서에대하여... ix 제1장 소개... 1 1.1. 개요... 1 1.2. Scheduler 컴포넌트구조... 2 1.3. Scheduler 서버... 2 제2장 Scheduler 프로그래밍... 5 2.1. 개요... 5 2.2. JEUS Scheduler 클래스... 6 2.3. 작업정의... 7 2.3.1. ScheduleListener 인터페이스구현... 7 2.3.2. Schedule 클래스상속... 8 2.3.3. RemoteSchedule 클래스상속... 9 2.4. Scheduler 객체얻기... 10 2.4.1. 로컬환경에서 Scheduler 객체얻기... 10 2.4.2. 원격환경에서 Scheduler 객체얻기... 10 2.5. 작업등록... 11 2.5.1. 한번수행되는작업등록... 11 2.5.2. 반복되는작업등록... 12 2.5.3. Schedule 작업객체등록... 13 2.6. 작업제어... 14 2.7. Scheduler 사용... 14 2.7.1. Standalone 환경에서사용... 14 2.7.2. JEUS 서버에서사용... 16 2.7.3. Java EE 컴포넌트에서사용... 18 2.8. Job-list 사용... 20 제3장 Scheduler 설정... 21 3.1. 개요... 21 3.2. Job-list 설정... 21 3.3. 서버 Scheduler 설정... 22 3.4. Thread Pool 설정... 29 3.4.1. 공용 Thread Pool... 30 3.4.2. 전용 Thread Pool... 33 3.5. 클라이언트컨테이너설정... 38 색인... 41 JEUS iii
그림목차 [ 그림 1.1] JEUS에서의 Scheduler 컴포넌트... 2 [ 그림 1.2] Scheduler 서버별수행방식... 2 [ 그림 2.1] Scheduler API 클래스... 6 [ 그림 3.1] WebAdmin 서버목록화면... 23 [ 그림 3.2] WebAdmin Scheduler 설정화면... 24 [ 그림 3.3] WebAdmin Scheduler 설정 - Lock 설정... 25 [ 그림 3.4] WebAdmin Scheduler 설정 - Scheduler 사용설정... 26 [ 그림 3.5] WebAdmin Scheduler 설정 - Job 추가... 27 [ 그림 3.6] WebAdmin Scheduler 설정 - Job 저장... 27 [ 그림 3.7] WebAdmin Scheduler 설정 - Job 추가확인... 28 [ 그림 3.8] WebAdmin Scheduler 설정 - 추가된 Job 반영... 29 [ 그림 3.9] WebAdmin Scheduler 설정 - Lock 설정... 30 [ 그림 3.10] WebAdmin Scheduler 설정 - 공용 Thread Pool 설정 (1)... 31 [ 그림 3.11] WebAdmin Scheduler 설정 - 공용 Thread Pool 설정 (2)... 32 [ 그림 3.12] WebAdmin Scheduler 설정 - Lock 설정... 34 [ 그림 3.13] WebAdmin Scheduler 설정 - 전용 Thread Pool 설정 (1)... 35 [ 그림 3.14] WebAdmin Scheduler 설정 - 전용 Thread Pool 설정 (2)... 36 JEUS v
예목차 [ 예 2.1] Task object example... 7 [ 예 2.2] Schedule object example... 8 [ 예 2.3] RemoteSchedule object example... 9 [ 예 2.4] 반복되는작업등록... 13 [ 예 2.5] Schedule 작업객체등록... 13 [ 예 2.6] ScheduleController.cancel 메소드사용... 14 [ 예 2.7] Standalone 클라이언트에서 Scheduler 사용... 15 [ 예 2.8] 리모트클라이언트에서 Scheduler 사용... 17 [ 예 2.9] EJB에서 JEUS Scheduler 사용... 18 [ 예 3.1] jeusadmin에서공용 Thread Pool 설정... 33 [ 예 3.2] jeusadmin을통해 Scheduler Service 공용 Thread Pool 설정... 37 [ 예 3.3] 클라이언트컨테이너설정 : <<jeus-client-dd.xml>>... 38 [ 예 3.4] Job-list 설정 : <<jeus-client-dd.xml>>... 39 JEUS vii
안내서에대하여 안내서의대상 본안내서는 JEUS Scheduler 기능을사용하고자하는관리자나프로그래머를대상으로한다. 안내서의전제조건 본안내서는 JEUS 시스템에대한전반적인이해와 JEUS 시스템이제공하는각종기능및특성에대한습득을위한기본서이다. 본안내서를원활하게이해하기위해서는다음과같은사항을미리알고있어야한다. RMI 및 JNDI에대한이해 JEUS의기본개념이해 Java에대한기본적인이해 안내서의제한조건 본안내서는제품특성상언급되는 Java EE나 Java 스펙에대해서자세히다루지않는다. 따라서해당내용은 Java 관련문서를참고한다. 실무에서의구체적인사용방법이나관리및운용에관한사항은각제품의안내서를참고한다. 참고 JEUS 시스템에대한기본적인내용은 "JEUS 소개 " 나 "JEUS 설치및시작하기 " 를참고한다. 안내서에대하여 ix
안내서구성 본안내서는총 3개의장으로구성되어있다. 제1장소개 JEUS Scheduler의기능과사용가능한환경, 수행방식에대해설명한다. 제2장 Scheduler 프로그래밍 JEUS Scheduler 프로그래밍에필요한기본지식과사용방법에대해서설명한다. 제3장 Scheduler 설정 JEUS Scheduler를설정하는방법에대해서설명한다. x JEUS Scheduler 안내서
안내서규약 표기 <<AaBbCc123>> <Ctrl>+C [Button] 진하게 " "( 따옴표 ) ' 입력항목 ' 하이퍼링크 > +---- ---- 참고주의 [ 그림 1.1] [ 표 1.1] AaBbCc123 의미프로그램소스코드의파일명 Ctrl과 C를동시에누름 GUI의버튼또는메뉴이름강조다른관련안내서또는안내서내의다른장및절언급화면 UI에서입력항목에대한설명메일계정, 웹사이트메뉴의진행순서하위디렉터리또는파일있음하위디렉터리또는파일없음참고또는주의사항주의할사항그림이름표이름 Java 코드, XML 문서 [ command argument ] < xyz > 옵션파라미터 < 와 > 사이의내용이실제값으로변경됨선택사항. 예 ) A B: A나 B 중하나파라미터등이반복되어서나옴 안내서에대하여 xi
시스템사용환경 본안내서의모든예제와환경구성은 UNIX의스타일에준하여작성되어 Microsoft Windows ( 이하 Windows) 와같이다른환경에서작업하는경우몇가지사항을고려해야한다. 예를들어경로구분자의경우 UNIX 스타일인 / 를 Windows 스타일인 \ 로바꿔서사용한다. 또한환경변수도 Windows 스타일로변경해서사용하면된다. 문서의내용은 Java 표준을고려해서작성했기때문에대부분의내용은동일하게적용된다. 관련안내서 안내서 JEUS 소개 JEUS 설치및시작하기 JEUS Server 안내서 JEUS Application Client 안내서 JEUS WebAdmin 안내서 설명 JEUS 7 서버에대한전반적인소개와 JEUS의아키텍처를포함하여각구성요소들에대해설명한안내서이다. JEUS에대한소개와설치및시작방법에대해기술한안내서이다. JEUS 시스템과서버의개요와시스템관리를위한안내서이다. Java EE 클라이언트와 JEUS 사이의상호운용에대해기술한안내서이다. JEUS의웹관리툴인 WebAdmin을사용한 JEUS 의설정및제어, 모니터링, 클러스터링, 리소스설정및관리에대해기술한안내서이다. 참고자료 Javadoc JEUS API JEUS_HOME/docs/api/jeus-api/index.html xii JEUS Scheduler 안내서
연락처 Korea TmaxSoft Co., Ltd 272-6, Seohyeon-dong, Bundang-gu, Seongnam-si, Gyeonggi-do, 463-824 South Korea Tel: +82-31-8018-1000 Fax: +82-31-8018-1115 Email: info@tmax.co.kr Web (Korean): http://www.tmax.co.kr 기술지원 : http://technet.tmaxsoft.com USA TmaxSoft, Inc. 560 Sylvan Avenue Englewood Cliffs, NJ 07632 U.S.A Tel: +1-201-567-8266 Fax: +1-201-567-7339 Email: info@tmaxsoft.com Web (English): http://www.tmaxsoft.com Japan TmaxSoft Japan Co., Ltd. 5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073 Japan Tel: +81-3-5765-2550 Fax: +81-3-5765-2567 Email: info@tmaxsoft.co.jp Web (Japanese): http://www.tmaxsoft.co.jp 안내서에대하여 xiii
China TmaxSoft China Co., Ltd. Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan, Chaoyang District, Beijing, China, 100027 China Tel: +86-10-6410-6145~8 Fax: +86-10-6410-6144 Email: info.cn@tmaxsoft.com Web (Chinese): http://www.tmaxsoft.com.cn xiv JEUS Scheduler 안내서
제 1 장소개 본장에서는 JEUS Scheduler 의기능과사용가능한환경, 수행방식에대해설명한다. 1.1. 개요 JEUS Scheduler는정해진시간에수행되거나반복적으로수행되는작업을 Scheduling할수있는기능을제공한다. Scheduler는 JEUS의확장된기능으로정해진시간에혹은주기적으로작업을수행해야할때사용할수있다. EJB의경우 Timer Service와같은기능을제공하는데이와유사한목적을지니고있으며 EJB 환경이아니더라도사용할수있다. 예를들어주기적으로임시파일을삭제한다거나, 주기적으로데이터베이스커넥션을체크하는등의시스템관리에사용할수도있다. Java EE 환경에서 Timer Service를이용하고자할때 Java SE Timer(java.util.Timer) 를직접사용할수없으므로 EJB Timer Service를사용하거나 JEUS에서제공하는 JEUS Scheduler를사용해야한다. EJB Timer Service는 EJB 환경에서만사용할수있는데반하여 JEUS Scheduler는모든 Java EE 환경에서사용할수있고일반 Java SE 애플리케이션에서도사용이가능하다. JEUS Scheduler는 Java SE Timer(java.util.Timer) 와유사하기때문에 Java SE Timer에익숙하다면 JEUS Scheduler를쉽게사용할수있다. 또한 Java SE Timer에는없는작업종료시점 (end time) 과최대수행횟수 (max count) 를지정할수있는기능도제공한다. JEUS Scheduler는다음과같이다양한환경에서사용이가능하다. Java SE 애플리케이션에서 Standalone Scheduler 사용 Java EE 애플리케이션클라이언트에서 Standalone Scheduler 사용 JEUS 서버 Scheduler Service를원격에서접속하여사용 JEUS 서버설정파일에 Job을등록해서사용 JEUS 서버 Scheduler Service를 Java EE 컴포넌트에서사용 제 1 장소개 1
1.2. Scheduler 컴포넌트구조 JEUS Scheduler는사용자애플리케이션내에서사용할수도있고 JEUS 서버에서사용할수도있다. JEUS 서버는원격에서접속할수있는 Scheduler Service를구동시킬수있으며설정파일을통해 Scheduling될작업을등록할수도있다. JEUS Scheduler의컴포넌트는다음과같은구조를갖는다. [ 그림 1.1] JEUS에서의 Scheduler 컴포넌트 Managed Server (one or more) Engines EJB Engine Servlet Engine JMS Engine Configuration Manager Agent Group Management Service External Resource Service JNDI Service Security Service Management (JMX) Service Deployment Service Class FTP Service Transaction Service Logging Service DataSource Service Session Service Scheduler Service ThreadPool Management Service Console Admin Service 1.3. Scheduler 서버 Scheduler 서버의종류에따라 Scheduler의수행방식이달라지고, Scheduler Service가구분된다. 다음은 Scheduler 서버의종류에따른수행방식을나타낸다. [ 그림 1.2] Scheduler 서버별수행방식 Client VM Scheduler Server Client App Server VM Scheduler Service Client VM Client App Server VM Scheduler Service Servlet EJB 1. use in Client container 2. use in Server 3. use in application deployed in Server 다음은각각의 Scheduler Service 를사용하는경우에대한설명이다. 서버 Scheduler Service 2 JEUS Scheduler 안내서
항상주기적으로수행되어야할작업을 scheduling할때사용한다. 서버에서항상수행되어야할주기적인작업이있다면 Job-list에미리등록하여서버가구동할때수행되도록할수도있다. Java EE 컴포넌트들 (Servlet, JSP, EJB 등 ) 이주기적으로수행되는작업을 Scheduling할때주로사용을 scheduling할때주로사용한다. 또한 JNDI 저장소에등록되어서원격클라이언트에서도사용할수있다. 클라이언트 Scheduler Service 애플리케이션클라이언트에서 Standalone 방식으로구동되는 JEUS Scheduler Service는애플리케이션클라이언트내부에서어떠한작업을주기적으로수행하는경우주로사용한다. 또한애플리케이션클라이언트가종료되면더이상수행될필요가없는작업인경우에사용한다. 제 1 장소개 3
제 2 장 Scheduler 프로그래밍 본장에서는 JEUS Scheduler 프로그래밍에필요한기본지식과사용방법에대해서설명한다. 2.1. 개요 JEUS 5 이후버전에서는이전 (4.x) 에사용되던방식과비교하여다음과같이몇가지사항이변경및추가되었다. 하지만 JEUS 5.0 Scheduler는기존버전과호환성을유지하고있기때문에기존에작성된프로그램도별도의수정없이운영이가능하다. SchedulerListener 인터페이스추가작업을정의하기위한인터페이스로 ScheduleListener 인터페이스가추가되었다. ScheduleListener 인터페이스는최상위작업인터페이스로모든작업은이인터페이스를구현 (imple ments) 해야한다. 기존에존재하던 Schedule 작업클래스도 ScheduleListener에서구현하고있다. 따라서 Schedule 작업클래스를상속해서작업을정의하지않아도 ScheduleListener를구현해서작업을정의할수있다. SchedulerFactory 클래스추가기존에사용되던클라이언트와서버용 SchedulerManager는더이상사용되지않으며 (deprecated), 새롭게 SchedulerFactory 클래스가추가되었다. SchedulerFactory는 Scheduler 객체를얻는데사용되며 Scheduler 객체를통해클라이언트환경, 서버환경, 리모트클라이언트환경의구별없이작업을등록할수있다. 다양한메소드추가 Scheduler 인터페이스에는작업을등록하는다양한메소드들이추가되었다. 이제작업을등록할때시작시간, 주기, 종료시간, 최대수행횟수를지정할수있다. Thread Pool을이용한멀티스레드방식으로변경기존의 JEUS Scheduler는기본적으로싱글스레드방식으로작업을수행했지만새로운 JEUS Scheduler 는 Thread Pool을이용하여각작업을별도의스레드로동작시킨다. 따라서어떤한작업이수행중에블록되더라도다른작업수행에영향이없다. Job-list 기능추가프로그래밍방식으로작업을등록하지않고 JEUS 서버설정에작업을등록할수있는 Job-list 기능이추가되었다. JEUS Scheduler 프로그래밍을이해하기위해먼저 JEUS Scheduler를구성하고있는클래스들을살펴보고, Scheduling 작업을정의하는방법, 작업을등록하는방법, 등록된작업을제어하는방법에대해설명한다. 이후에 JEUS Scheduler를어떤경우에사용할수있는지를알아본다. 본장에서설명하는모든예제파일들은 JEUS_HOME/samples/scheduler 디렉터리에서찾아볼수있다. 제 2 장 Scheduler 프로그래밍 5
2.2. JEUS Scheduler 클래스 기본적으로 JEUS Scheduler는 J2SE Timer와개념적인부분뿐만아니라유사한인터페이스를가지고있다. 작업을나타내는 java.util.timertask 클래스는 JEUS Scheduler의 jeus.schedule.schedulelistener 인터페이스와동일하고, 작업을등록하는 java.util.timer 클래스는 JEUS Scheduler의 jeus.schedule.scheduler 인터페이스와동일하다. 따라서이러한유사성을고려하여 JEUS Scheduler를사용한다면좀더쉽게익숙해질수있을것이다. 다음은각 Scheduler API 클래스에대한설명이다. [ 그림 2.1] Scheduler API 클래스 SchedulerFactory get instances ScheduleListener registered Scheduler implements Schedule extends RemoteSchedule returns ScheduleController JeusScheduler Exception API 클래스 설명 package jeus.schedule interface ScheduleListener abstract class Schedule JEUS Scheduler의모든클래스와인터페이스는 jeus.schedule 패키지와그하위패키지에소속되어있다. 정해진시간에수행되어야할작업은 ScheduleListener 인터페이스를구현 (implements) 하여클래스로정의된다. ScheduleLis tener는하나의 Callback 메소드인 ontime() 을가지고있어해당시간이되었을때이메소드가호출된다. ScheduleListener를구현한추상클래스로 JEUS 5 이전에사용하던작업클래스이다. 이클래스는 ontime() 이외에도 nexttime() Callback 메소드가있어서작업을등록할때호출될시간을예약 6 JEUS Scheduler 안내서
API 클래스 설명 하는것이아니라작업을등록한후에동적으로다음호출될시 간을결정할수있다. abstract class RemoteSchedule class SchedulerFactory interface Scheduler interface ScheduleController exception JeusSchedulerException 특수한 Schedule 클래스로 initialize() Callbak 메소드를가지고있어객체를생성할때초기화파라미터값을받을수있다. 실제 (concrete) Scheduler 객체를얻어오기위해사용된다. JEUS Scheduler에작업을등록하기위한핵심인터페이스로다양한 registerschedule() 메소드를정의하고있다. Scheduler에작업을등록하면 ScheduleController 인터페이스를구현한객체를리턴받는다. 이핸들객체는작업에대한정보를얻거나작업을취소할때사용된다. JEUS Scheduler에작업등록하거나취소할때에내부적으로문제가발생하는경우 JeusSchedulerException이발생할수있다. 참고 각인터페이스나클래스에대한자세한설명은 JEUS Scheduler Javadoc API 를참고한다. 2.3. 작업정의 작업을수행하기위해서는작업클래스를정의하고작업의수행시간및주기에따라알맞은방법으로작 업을정의해야한다. 2.3.1. ScheduleListener 인터페이스구현 정해진시간에수행되어야할작업은 ScheduleListener 인터페이스를구현 (implements) 하여클래스로정의된다. ScheduleListener는하나의 Callback 메소드인 ontime() 을가지고있어해당시간이되었을때이메소드가호출된다. 따라서작업클래스를정의하기위해서는 ontime() 메소드를구현하고메소드내에서작업을수행하도록프로그램을작성한다. [ 예 2.1] Task object example public class SimpleTask implements ScheduleListener { private String name; private int count; // no-arg constructor is required if classname is used for task registration public SimpleTask() { 제 2 장 Scheduler 프로그래밍 7
public SimpleTask(String name) { this.name = name;... public void ontime() { count++; echo("##### " + name + " is waked on " + new Date()); 2.3.2. Schedule 클래스상속 ScheduleListener를바로구현하지않고 Schedule 클래스나 RemoteSchedule 클래스를상속하여작업클래스를정의할수있다. Schedule 클래스나 RemoteSchedule 클래스는 JEUS 5 이전 Scheduler에서사용되던작업클래스이다. JEUS 5에서는일반적인작업을정의할때는 ScheduleListener를구현하도록하고있지만하위호환성을위해기존작업클래스를그대로제공하고있다. Schedule 추상클래스는 ontime() 이외에도 nexttime() 이라는 Callback 메소드가있어서작업을등록할때호출될시간을예약하지않고작업클래스내에서다음호출될시간을결정하도록한다. 따라서고정적인주기를갖는작업보다는가변적인주기를갖는작업의경우에좀더효휼적으로사용된다. JEUS Scheduler는 Schedule 작업객체의처음수행시간을결정하기위해작업객체를등록한후에먼저 nexttime() 을호출하여처음수행시간을정한다. 그런다음해당시간이되면 ontime() 을호출하여작업을수행하고 ontime() 이종료되면다시 nexttime() 을호출하여다음수행시간을정하게된다. nexttime() 은다음에작업이수행될절대시간을 Milli-Second(ms) 값으로넘겨주어야한다. 이때 0을리턴하면작업이더이상수행되지않게된다. Schedule 작업객체는 ontime() 이수행된후에 nexttime() 을호출하기때문에 ontime() 에서작업을수행한시간만큼 nexttime() 호출이지체된다. 따라서정확한간격으로작업을호출하도록프로그래밍하기가쉽지않다. 그렇기때문에되도록작업내에서 nexttime() 을통해반복주기를구현하기보다는작업을등록할때반복주기를설정하는것이좋다. [ 예 2.2] Schedule object example public class SimpleSchedule extends Schedule { private String name; private int count; private long period = 2000; // 2 seconds // no-arg constructor is required if classname is used for task registration public SimpleSchedule() { 8 JEUS Scheduler 안내서
public SimpleSchedule(String name) { this.name = name; public void ontime() { count++; echo("##### " + name + " is waked on " + new Date());... public long nexttime(long currenttime) { return currenttime + period; 2.3.3. RemoteSchedule 클래스상속 RemoteSchedule 클래스는원격으로작업을등록할때초기화변수를지정할수있는 Schedule 객체이다. 주로원격에서클래스이름을통해작업객체를등록할때사용한다. 이클래스는 initialize() Callback 메소드를가지고있는데작업등록후에초기화파라미터로이메소드가한번호출된다. 따라서원격에서클래스이름으로작업을등록할때초기화값을설정하고싶을경우사용할수있다. initialize() Callback은 Scheduler.registerSchedule(classname, hashtable, daemon_flag) 메소드를이용하여 RemoteSchedule 작업객체를등록하는경우에만호출된다. [ 예 2.3] RemoteSchedule object example public class SimpleRemoteSchedule extends RemoteSchedule { private String name; private int count; private long period; // no-arg constructor is required if classname is used for task registration public SimpleRemoteSchedule() { // this is called by scheduler after creation public void initialize(hashtable parameters) { name = (String) parameters.get("name"); Long interval = (Long) parameters.get("interval"); if (interval!= null) period = interval.longvalue(); else period = 2000; 제 2 장 Scheduler 프로그래밍 9
public void ontime() { count++; echo("##### " + name + " is waked on " + new Date());... public long nexttime(long currenttime) { return currenttime + period; 참고작업을 Job-list를사용하여등록하거나 classname을사용하는 API를통해등록하는경우에는컨터이너가해당클래스를초기화하기때문에작업클래스에는 no-arg(default) 생성자 (constructor) 가반드시필요하다. 2.4. Scheduler 객체얻기 본절에서는 Scheduler 객체를얻는방법에대해서알아본다. JEUS Scheduler 는로컬환경과원격환경 에서모두구동된다. 2.4.1. 로컬환경에서 Scheduler 객체얻기 로컬환경에서구동된다는것은프로그램이구동되고있는로컬 JVM 내에 Scheduler 인스턴스가생성되며, 등록된모든작업이같은 JVM 내에서구동된다는것을의미한다. JEUS Scheduler는 JVM 내에서현재하나의인스턴스만생성되며이인스턴스를 Default Scheduler라고한다. 따라서현재는 JVM 내에모든클라이언트들은 Default Scheduler를공유하게된다. 로컬환경의 JEUS Scheduler는일반 J2SE 애플리케이션이나 Java EE 애플리케이션클라이언트, Java EE 컴포넌트등에서사용된다. 로컬환경의 JEUS Scheduler를사용하기위해서 SchedulerFactory를이용한다. 다음과같이간단하게 Default Scheduler 인스턴스를얻을수있다. // Get the default scheduler Scheduler scheduler = SchedulerFactory.getDefaultScheduler(); 2.4.2. 원격환경에서 Scheduler 객체얻기 원격환경에서구동된다는것은프로그램이구동되고있는 JVM 이아닌원격의다른 JVM 에서 Scheduler 인스턴스가생성되고, 등록된모든작업이원격 JVM 내에서구동된다는것을의미한다. 10 JEUS Scheduler 안내서
원격 Scheduler는 RMI 객체형태로나타나기때문에클라이언트는 RMI Call을통해 JEUS Scheduler를사용하게된다. JEUS 환경에서는 JEUS 서버에원격 Scheduler Service가기동된다. 원격환경의 JEUS Scheduler는원격클라이언트가 JEUS 서버에작업을등록할때사용된다. JEUS 서버에있는원격 JEUS Scheduler를사용하기위해서 JNDI Lookup을이용한다. 다음과같이 JEUS 서버 Scheduler 인스턴스 (Stub) 를얻을수있다. // Get the remote scheduler InitialContext ic = new InitialContext(); Scheduler scheduler = (Scheduler)ic.lookup( Scheduler.SERVER_SCHEDULER_NAME); 참고 JEUS 5 이전에사용되던 jeus.schedule.server.schedulermanager와 jeus.schedule.client.scheduler Manager는더이상사용되지않는다 (deprecated). 대신 SchedulerFactory를통해 Scheduler 객체를얻어서사용하기를권장한다. 하지만하위호환성을유지하기위해위클래스들은그대로제공된다. 2.5. 작업등록 본절에서는 Scheduler 인터페이스를이용하여작업을등록하는방법에대해서알아본다. 로컬환경이나원격환경에서 Scheduler 인스턴스를얻어왔다면작업을등록하는방법은동일하다. 단, 원격 JEUS Scheduler는작업객체가원격으로전송 (serialization) 되어원격으로운용된다. 2.5.1. 한번수행되는작업등록 단지특정시간에한번만수행되어야할작업의경우에는하나의수행시간만설정하여작업을등록할수있다. 이때수행시간은 java.util.date 객체로절대시간을설정하거나, Milli-Second(ms) 값으로현재시간을기준으로얼마의시간이지난후에수행되어야하는지설정할수있다. 다음의메소드를이용하여작업을등록한다. registerschedule(schedulelistener task, Date time, boolean isdaemon) registerschedule(schedulelistener task, long delay, boolean isdaemon) 다음은메소드사용에대한예이다. SimpleTask task1 = new SimpleTask("task1"); Date firsttime1 = new Date(System.currentTimeMillis() + 2000); ScheduleController handle1 = scheduler.registerschedule(task1, firsttime1, false); 참고 메소드의파라미터에대한설명은 2.5.2. 반복되는작업등록 을참고한다. 제 2 장 Scheduler 프로그래밍 11
2.5.2. 반복되는작업등록 반복되는작업의경우첫수행시간, 주기, 종료시간, 최대수행횟수등을주어작업을등록할수있다. 반복되는작업의특성에따라반복주기를 Fixed-delay 방식이나 Fixed-rate 방식으로결정해야한다. Fixed-delay 방식작업이수행되는간격이일정하게유지된다. 작업의다음수행시간은이전수행시간과주기에의해서결정된다. 만약작업의수행이지체 ( 작업수행시간이오래걸리거나 garbage collection과같은외부이유에의해서지체되는경우 ) 되어다음작업이수행되어야할시기가지난경우에다음작업은바로수행되며, 그이후에수행되는작업들은그만큼지체된다. 따라서장기적으로는작업의수행시간이조금씩뒤쳐질수있다. Fixed-rate 방식작업이수행되는비율이일정하게유지된다. 작업의다음수행시간은첫수행시간과주기에의해서결정된다. 작업의수행이지체되더라도다음작업은바로뒤따라수행되며, 시간당수행되는비율을유지한다. 장기적으로작업의수행시간이초기에지정한주기에따라계속유지된다. 참고 JEUS Scheduler는 Fixed-rate 방식으로작업을등록하면비교적정확한호출시간을보장해주기위해작업수행이지체되더라도시간이되면다른스레드에의해작업을호출한다. 따라서작업수행이지체되는경우에같은작업이동시에 (concurrently) 수행된다. 따라서이러한경우에는작업객체가 Thread-safe한지고려해야한다. 다음의메소드를이용하여작업을등록한다. registerschedule(schedulelistener task, Date firsttime, long period, Date endtime, long maxcount, boolean isdaemon) registerschedule(schedulelistener task, long delay, long period, Date endtime, long maxcount, boolean isdaemon) registerscheduleatfixedrate(schedulelistener task, Date firsttime, long period, Date endtime, long maxcount, boolean isdaemon) registerscheduleatfixedrate(schedulelistener task, long delay, long period, Date endtime, long maxcount, boolean isdaemon) 작업을등록할때사용하는파라미터들은다음과같다. 파라미터 Date firsttime long delay long period 의미시작시간으로처음수행될시간을지정한다. 시작시간이다. 현재이후에처음수행될시간을지정한다. ( 단위 : ms) 반복수행주기를지정한다. ( 단위 : ms) 12 JEUS Scheduler 안내서
파라미터 Date endtime long maxcount boolean isdaemon 의미종료시간이다. 이시간이후에는작업이더이상수행되지않고 null인경우에는종료시간의제약이없다. 최대수행횟수이다. Scheduler.UNLIMITED인경우에는제한이없다. 원격으로 Schedule을등록하는경우에만의미가있으며 true 값으로설정하면클라이언트와의연결이종료되었을때작업이종료된다. 현재 RMI Runtime의 DGC(Distrubuted Garbage Collection) 정책에의해클라이언트가연결이종료되었음을판단하기때문에실제로클라이언트의연결이종료되고 15분정도가지나야종료되었음을탐지하게되어 Scheduling 이취소된다. boolean isthreaded 더이상사용되지않는다 (deprecated). 다음은작업을등록하는예제이다. [ 예 2.4] 반복되는작업등록 SimpleTask task2 = new SimpleTask("task2"); ScheduleController handle2 = scheduler.registerschedule(task2, 2000, 2000, null, Scheduler.UNLIMITED, false); SimpleTask task3 = new SimpleTask("task3"); Date firsttime3 = new Date(System.currentTimeMillis() + 2000); Date endtime3 = new Date(System.currentTimeMillis() + 10 * 1000); ScheduleController handle3 = scheduler.registerscheduleatfixedrate(task3, firsttime3, 2000, endtime3, 10, false); 2.5.3. Schedule 작업객체등록 Schedule이나 RemoteSchedule 작업객체를등록하는것은하위호환성을유지하기위해제공된다. 작업의처음수행시간과이후에반복되는수행시간은 Schedule 작업객체의 nexttime() 메소드를이용하기때문에등록할때는별도의파라미터를줄필요가없다. 이경우다음메소드를이용하여작업을등록한다. registerschedule(schedule task, boolean isdaemon) registerschedule(string classname, Hashtable params, boolean isdaemon) 다음은작업을등록하는예제이다. [ 예 2.5] Schedule 작업객체등록 Hashtable params = new Hashtable(); params.put("name", "task3"); 제 2 장 Scheduler 프로그래밍 13
params.put("interval", new Long(3000)); ScheduleController handle3 = scheduler.registerschedule( "samples.scheduler.simpleremoteschedule", params, true); SimpleSchedule task4 = new SimpleSchedule("task4"); ScheduleController handle4 = scheduler.registerschedule(task4, true); 주의 Scheduler 는 Managed Server(MS) 에서제공하는서비스이므로설정에주의한다. 만약설정이잘못 되어 Scheduler 를생성할수없다면, MS 는에러메시지를표시하고기동에실패한다. 2.6. 작업제어 JEUS Scheduler에작업을등록하면핸들 (handle) 인 ScheduleController 객체를리턴한다. 이객체는등록된작업하나당만들어지는데등록된작업을제어하기위해사용한다. 이핸들을이용하여작업에대한정보를얻어오거나작업을취소할수있다. 다음은 ScheduleController.cancel() 메소드를호출하여작업을취소하는예제이다. [ 예 2.6] ScheduleController.cancel 메소드사용 SimpleTask task2 = new SimpleTask("task2"); ScheduleController handle2 = scheduler.registerschedule(task2, 2000, 2000, null, Scheduler.UNLIMITED, false); Thread.sleep(10 * 1000); handle2.cancel(); 2.7. Scheduler 사용 작업정의, Scheduler 객체얻기, 작업등록, 작업제어까지완료하였다면 JEUS Scheduler를사용할준비가모두되었다. 본절에서는환경에따른 Schduler의사용방법에대해설명한다. 2.7.1. Standalone 환경에서사용 일반 J2SE 애플리케이션이나 Java EE 애플리케이션클라이언트에서 JEUS Scheduler를사용할수있다. 이경우에는 JEUS 서버와별개로 JEUS Scheduler를 J2SE Timer와같이라이브러리처럼사용할수있다. Scheduler 객체를얻기위해서는 SchedulerFactory 클래스를이용한다. 또한로컬환경에서작업을등록할때 daemon flag는사용되지않으므로어떤값을넣어도무방하다. 다음은 Standalone 클라이언트예제이다. 14 JEUS Scheduler 안내서
[ 예 2.7] Standalone 클라이언트에서 Scheduler 사용 public class StandAloneClient { public static void main(string args[]) { try { // Get the default scheduler Scheduler scheduler = SchedulerFactory.getDefaultScheduler(); // Register SimpleTask which runs just one time echo("register task1 which runs just one time..."); SimpleTask task1 = new SimpleTask("task1"); Date firsttime1 = new Date(System.currentTimeMillis() + 2000); ScheduleController handle1 = scheduler.registerschedule(task1, firsttime1, false); Thread.sleep(5 * 1000); echo(""); // Register SimpleTask which is repeated // with fixed-delay echo("register task2 which is repeated " + "until it is canceled..."); SimpleTask task2 = new SimpleTask("task2"); ScheduleController handle2 = scheduler.registerschedule(task2, 2000, 2000, null, Scheduler.UNLIMITED, false); Thread.sleep(10 * 1000); handle2.cancel(); echo(""); // Register SimpleTask which is repeated // with fixed-rate echo("register task3 which is repeated " + "for 10 seconds..."); SimpleTask task3 = new SimpleTask("task3"); Date firsttime3 = new Date(System.currentTimeMillis() + 2000); Date endtime3 = new Date(System.currentTimeMillis() + 10 * 1000); ScheduleController handle3 = scheduler.registerscheduleatfixedrate( task3, firsttime3, 2000, endtime3, 10, false); Thread.sleep(12 * 1000); echo(""); // Register SimpleSchedule which is repeated // every 2 seconds echo("register task4 which is repeated " + "every 2 seconds..."); SimpleSchedule task4 = new SimpleSchedule("task4"); ScheduleController handle4 = scheduler.registerschedule(task4, false); 제 2 장 Scheduler 프로그래밍 15
Thread.sleep(10 * 1000); echo(""); // Cancel all tasks echo("cancel all tasks registerd on the scheduler..."); scheduler.cancel(); Thread.sleep(5 * 1000); System.out.println("Program terminated."); catch (Exception e) { e.printstacktrace(); private static void echo(string s) { System.out.println(s); Java EE 애플리케이션클라이언트에서 JEUS Scheduler 를사용하는경우에는 DD(jeus-client-dd.xml) 에 JEUS Scheduler 의 Thread Pool 에관련된설정을할수있다. 참고 1. Scheduler의 Thread Pool과관련된설정은 JEUS Reference Book 의 4.2.5. Thread Management 관련명령어 을참고한다. 2. Scheduler를사용한코드를컴파일하거나기동시키기위해서는 JEUS 관련클래스 (jeus.jar 등 ) 가클래스패스에지정되어있어야한다. 2.7.2. JEUS 서버에서사용 JEUS 서버에 Scheduler Service가기동되어있다면원격클라이언트가이것을사용할수있는다. 그전에먼저 JEUS 서버에 Scheduler Service가기동되도록설정되어있어야한다. JEUS 서버 Scheduler Service는 RMI Scheduler 객체를 JNDI에등록한다. 따라서클라이언트에서는 JNDI Lookup을통해서원격 Scheduler 객체 ( 실제로는 Stub 객체 ) 를얻을수있다. 이객체의 JNDI 이름은 jeus_service/scheduler 로 Scheduler.SERVER_SCHEDULER_NAME 상수을사용한다. 일단 Scheduler 객체를얻으면작업을등록하는방법은동일하다. 단, 등록된작업객체는전송 (Serialization) 되어원격 Scheduler에서실제로운용된다. 즉, JEUS 서버에서수행된다. 이경우등록할때 daemon flag는의미가있으며, daemon flag를 true로등록하면원격클라이언트가종료되었을때원격작업도종료된다. 16 JEUS Scheduler 안내서
참고 JEUS 서버에 Scheduler Service 가기동되도록설정하는방법은 JEUS Reference Book 의 4.2.5. Thread Management 관련명령어 을참고한다. 다음은리모트클라이언트예제이다. [ 예 2.8] 리모트클라이언트에서 Scheduler 사용 public class RemoteClient { public static void main(string args[]) { try { // Get the remote scheduler InitialContext ic = new InitialContext(); Scheduler scheduler = (Scheduler)ic.lookup( Scheduler.SERVER_SCHEDULER_NAME); // Register SimpleTask which runs just one time echo("register task1 which runs just one time..."); SimpleTask task1 = new SimpleTask("task1"); Date firsttime1 = new Date(System.currentTimeMillis() + 2000); ScheduleController handle1 = scheduler.registerschedule(task1, firsttime1, true); Thread.sleep(5 * 1000); echo(""); // Register SimpleTask which is repeated // with fixed-delay echo("register task2 which is repeated " + "until it is canceled..."); SimpleTask task2 = new SimpleTask("task2"); ScheduleController handle2 = scheduler.registerschedule(task2, 2000, 2000, null, Scheduler.UNLIMITED, true); Thread.sleep(10 * 1000); handle2.cancel(); echo(""); // Register SimpleRemoteSchedule which is repeated // every 3 seconds echo("register task3 which is repeated " + "every 3 seconds..."); Hashtable params = new Hashtable(); params.put("name", "task3"); params.put("interval", new Long(3000)); ScheduleController handle3 = scheduler.registerschedule( "samples.scheduler.simpleremoteschedule", params, true); 제 2 장 Scheduler 프로그래밍 17
Thread.sleep(10 * 1000); echo(""); // Cancel all tasks echo("cancel all tasks registerd on the scheduler..."); scheduler.cancel(); Thread.sleep(5 * 1000); System.out.println("Program terminated."); catch (Exception ex) { ex.printstacktrace(); private static void echo(string s) { System.out.println(s); 주의위예제를실행하려면해당작업클래스파일을 JAR 파일로묶어서 DOMAIN_HOME/lib/application 또는 SERVER_HOME/lib/application에복사하여위치시켜야한다. JEUS 서버가해당작업을수행하기위해서는해당클래스를로딩해야하기때문에 JEUS가이미기동되어있는상태라면반드시재기동해야한다. 2.7.3. Java EE 컴포넌트에서사용 EJB나서블릿과같은 Java EE 컴포넌트에서 JEUS Scheduler를사용할수있다. 이때 JEUS Scheduler 는 JEUS 서버에서기동된다. EJB 2.1 표준에는 EJB Timer Service를명시하고있으며, JEUS 5에서도 EJB Timer Service를제공하고있다. 따라서 EJB 컴포넌트의경우 Java EE 표준을준수하려면 JEUS Scheduler 보다는 EJB Timer Service 를사용할것을권장한다. 하지만 EJB 외의 Java EE 컴포넌트에서는 EJB Timer Service를사용할수없으므로 JEUS Scheduler를사용해야한다. Java EE 컴포넌트에서 JEUS Scheduler를사용하는것은 Standalone JEUS Scheduler를사용하는방식과동일하다. SchedulerFactory 클래스를이용하여서버에서기동되는 Scheduler 객체를얻어온후에필요한등록메소드를호출하여작업을등록한다. 다음은 EJB에서 JEUS Scheduler 사용예제이다. [ 예 2.9] EJB에서 JEUS Scheduler 사용 public class HelloEJB implements SessionBean { private SimpleTask task; 18 JEUS Scheduler 안내서
private ScheduleController taskhandler; private boolean isstarted; public HelloEJB() { public void ejbcreate() { task = new SimpleTask("HelloTask"); isstarted = false; public void trigger() throws RemoteException { if (!isstarted) { Scheduler scheduler = SchedulerFactory.getDefaultScheduler(); taskhandler = scheduler.registerschedule( task, 2000, 2000, null, Scheduler.UNLIMITED, false); isstarted = true; public void ejbremove() throws RemoteException { if (isstarted) { taskhandler.cancel(); isstarted = false; public void setsessioncontext(sessioncontext sc) { public void ejbactivate() { public void ejbpassivate() { public class HelloClient { public static void main(string args[]) { try { InitialContext ctx = new InitialContext(); HelloHome home = (HelloHome) ctx.lookup("helloapp"); Hello hello = (Hello) home.create(); hello.trigger(); catch (Exception e) { 제 2 장 Scheduler 프로그래밍 19
e.printstacktrace(); 참고 JEUS 서버에서동작하는 JEUS Scheduler 에대해 Thread Pool 을설정할수있다. 설정하는방법에 대해서는 3.4. Thread Pool 설정 를참고한다. 2.8. Job-list 사용 Job-list는 JEUS 서버에프로그래밍방식으로작업을등록하지않고설정파일을이용하여작업을등록하는것이다. Job-list는 JEUS 서버 Scheduler에등록할수있다. Job-list로작업을등록하면작업은 Fixedrate 방식으로반복수행된다. 참고 JEUS 서버에서동작하는 JEUS Scheduler 에대해 Job-list 를설정할수있다. 설정하는방법에대해 서는 3.2. Job-list 설정 를참고한다. 20 JEUS Scheduler 안내서
제 3 장 Scheduler 설정 본장에서는 JEUS 설정파일이나 Deployment Descriptor(DD) 에 JEUS Scheduler 를설정하는방법에대 해서설명한다. 3.1. 개요 JEUS Scheduler Service를사용하기위해서는각서비스별로필요한내용을설정해야한다. JEUS 서버에 Scheduler Service 설정원격에서 JEUS 서버 Scheduler Service에접근하는경우나 Job-list를이용하여 JEUS 서버에서주기적인작업을수행할서버에 Scheduler Service를활성화시켜야한다. Scheduler Service를활성화하려면 WebAdmin에서 Scheduler Service를사용하겠다는설정을해야한다. 이설정이되어있어야서버가부팅할때 Scheduler Service를시작시킨다. Scheduler Service를사용하도록설정한다. Scheduler Service에서사용할 Thread Pool 설정한다. 서버에서 scheduling되어수행할 Job-list에대해서설정한다. 클라이언트컨테이너에 Scheduler Service 설정 Deployment Descriptor(DD) 에서설정한다. Scheduler를사용하려면서비스를활성화시키는설정과 Thread Pool 설정그리고실제작업을수행할 Job-list 설정을해야한다. 3.2. Job-list 설정 본절에서는실제작업을수행할 Job 을등록하는방법에대해설명한다. 프로그램코드에서작업을등록하는것외에 JEUS 설정파일에작업을등록하면 JEUS 서버가구동될때작업이자동으로 scheduling된다. Job은 scheduling될하나의작업단위를의미한다. Job에해당하는클래스는반드시 jeus.schedule.schedulelistener를구현해야하며해당클래스와관련클래스를 JAR 파일로묶어다음의경로에위치시켜야한다. 아래디렉터리는 Domain Administration Server( 이하 DAS) 와 Managed Server( 이하 MS) 사이에동기화 되지않기때문에사용자가수동으로동기화시켜주어야한다. DOMAIN_HOME/lib/application 제 3 장 Scheduler 설정 21
아래디렉터리는 JEUS를설치했을때생성되는디렉터리가아니므로사용자가직접생성해서위치시켜야한다. SERVER_HOME/lib/application Job은서버에설정하면 JEUS Scheduler Service에서작업이수행된다. 다음은 Job 을설정할때주의해서작성해야할항목에대한설명이다. 항목 Begin Time 설명 작업이최초로수행될시간을지정한다. 설정하지않을경우 JEUS 서버가기동할때 시작한다. 타입 : XML datetime type 형식 : yyyy-mm-ddthh:mm:ss.sss 만약등록한작업의 Begin Time이과거이면주기적으로현재시간이후에최초의수행되어야할시간에최초수행되도록조정된다. End Time 작업이끝날시간을지정한다. 설정되지않을경우종료하지않는다. 타입 : XML datetime type 형식 : yyyy-mm-ddthh:mm:ss.sss End Time 이과거인경우에작업은한번도수행되지않는다. Count 작업의최대수행횟수를지정한다. 설정되지않거나 -1 인경우최대수행횟수에제한이없다. 참고 Job-list 방식으로등록된작업은 Fixed-rate 방식으로반복된다. 따라서비교적정확한시간에호출되지만작업수행시간이오래걸릴때는작업이동시에진행될수있기때문에작업이 Thread-safe 하도록고려해야한다. 3.3. 서버 Scheduler 설정 본절에서는 WebAdmin 을통해실제서버에 Scheduler 를설정하는방법에대해서설명한다. 원격에서 JEUS 서버 Scheduler Service에접근하거나 Job-list를이용하여 JEUS 서버에서주기적인작업을수행하려면서버에 Scheduler Service를활성화시켜야한다. Scheduler Service를활성화하려면다음과같이 WebAdmin에서 Scheduler Service를사용하겠다는설정을해야한다. 이설정이되어있어야서버가부팅할때 Scheduler Service를시작시킨다. 다음은 2.3.2. Schedule 클래스상속 에서작성한예제를서버에 Job으로추가하는과정이다. 22 JEUS Scheduler 안내서
1. WebAdmin 의왼쪽메뉴에서 [Servers] 를선택하면, 서버목록조회화면으로이동한다. 서버목록에서 Scheduler 설정을변경할서버 (server1) 을선택한다. [ 그림 3.1] WebAdmin 서버목록화면 제 3 장 Scheduler 설정 23
2. Server 설정화면에서 [Resource] > [Scheduler] 메뉴를선택하면 Scheduler 설정화면으로이동한다. [ 그림 3.2] WebAdmin Scheduler 설정화면 24 JEUS Scheduler 안내서
3. WebAdmin 왼쪽메뉴하단에위치한 [LOCK & EDIT] 버튼을클릭하여 Scheduler 설정변경을위한 Lock을가져와야한다. Lock 설정변경에대한자세한설명은 JEUS WebAdmin 안내서 의 2.4.4. Lock 기능 을참고한다. Lock을설정한후에 Scheduler 설정을변경할수있다. [ 그림 3.3] WebAdmin Scheduler 설정 - Lock 설정 제 3 장 Scheduler 설정 25
4. 'Enabled' 항목이체크하고고급선택사항영역에서 Scheduler에서사용할 Thread Pool 정보를설정한다. Scheduler의 Thread Pool에관한내용은 3.4. Thread Pool 설정 을참고한다. 설정이완료되면 [ 확인 ] 버튼을클릭한다. 저장이완료되면화면상단에는설정변경저장에대한결과메시지가나타난다. 'Enabled' 항목이체크되어있는상태라면이과정은생략한다. [ 그림 3.4] WebAdmin Scheduler 설정 - Scheduler 사용설정 26 JEUS Scheduler 안내서
5. Job 을추가하기위해서는화면하단에 Job 목록에서 [Add] 버튼을클릭한다. [ 그림 3.5] WebAdmin Scheduler 설정 - Job 추가 6. Job 설정화면에서 Job 의이름과 Job 을수행할클래스이름, Job 이수행될주기를입력하고 [ 확인 ] 버 튼을클릭한다. [ 그림 3.6] WebAdmin Scheduler 설정 - Job 저장 제 3 장 Scheduler 설정 27
7. 다음은 [ 확인 ] 버튼을클릭하여변경한내용이임시저장된후의결과화면이다. 화면상단에서임시저 장결과에대한메시지와 Job 목록에서추가한 Job 을확인할수있다. [ 그림 3.7] WebAdmin Scheduler 설정 - Job 추가확인 8. [Activate changes] 버튼을클릭해서 Scheduler 를추가한내용을반영한다. 참고 운영중인서버에 Scheduler 를추가하거나변경하는작업은동적으로반영되지않는다. 설정만저장 해두었다가서버가재기동될때반영된다. 28 JEUS Scheduler 안내서
[ 그림 3.8] WebAdmin Scheduler 설정 - 추가된 Job 반영 9. 서버를재기동하면추가한 Job 이수행되면서서버로그에로깅된결과를조회할수있다. ##### waked on Tue Apr 23 14:50:19 KST 2013 ##### waked on Tue Apr 01 15:20:19 KST 2013 3.4. Thread Pool 설정 Scheduler Service는 Thread Pool을설정하여 Scheduler Service를수행하는데필요한 Thread의개수를조절한다. Thread Pool은 System Thread Pool을공유해서사용하는공용 Thread Pool과별도의 Thread Pool을설정하는전용 Thread Pool로나뉜다. 제 3 장 Scheduler 설정 29
본절에서는 WebAdmin 과콘솔툴을사용해서 Thread Pool 을설정하는방법에대해서설명한다. 항목에 대한자세한내용은 JEUS Server 안내서 의 2.3.3. Thread Pool 설정 을참고한다. 3.4.1. 공용 Thread Pool Scheduler Service 에서공용 Thread Pool 을사용할경우는 Thread 개수만미리할당해놓으면된다. WebAdmin 사용 다음은 WebAdmin을사용해서 Thread Pool을설정하는과정에대한설명이다. Thread Pool을설정하기전에 Lock 설정을변경해야한다. 1. Scheduler 설정화면에서고급선택사항에서 Thread Pool 설정을변경할수있다. [ 그림 3.9] WebAdmin Scheduler 설정 - Lock 설정 30 JEUS Scheduler 안내서
2. 고급선택사항의 Pooling 설정에서 'Shared' 항목을선택하고, 'Reserved Thread Num' 의개수를 10 으로설정한다. [ 확인 ] 버튼을클릭하면변경한설정이임시저장되고, 화면상단에서저장결과에대한메시지를확인할수있다. [ 그림 3.10] WebAdmin Scheduler 설정 - 공용 Thread Pool 설정 (1) 제 3 장 Scheduler 설정 31
3. [Activate Changes] 버튼을클릭해서서버에반영한다. 서버에 Activate가완료되면설정한 Scheduler 의 Thread Pool 설정이서버에반영되고, 반영에대한결과를 WebAdmin 화면상단에자세한메시지로보여준다. Thread Pool 설정은동적반영가능한항목이므로운영중인서버에변경된설정이적용된다. [ 그림 3.11] WebAdmin Scheduler 설정 - 공용 Thread Pool 설정 (2) 32 JEUS Scheduler 안내서
콘솔툴사용 다음은콘솔툴 (jeusadmin) 을통해 Scheduler의 Thread Pool을설정하는방법이다. [ 예 3.1] jeusadmin에서공용 Thread Pool 설정 [DAS]domain1.adminServer>modify-system-thread-pool server1 -service scheduler -r 10 Performed to MODIFY scheduler thread pool of a server (server1) successfully. You can check the results using "show-system-thread-pool server1 -service scheduler or modify-system-thread-pool server1 -service scheduler" [DAS]domain1.adminServer>show-system-thread-pool server1 -service scheduler show the current configuration scheduler thread pool of a server (server1) ================================================================================ +---------------------------------------------------------------------+--------+ Reserved Threads of the service scheduler 10 +---------------------------------------------------------------------+--------+ ================================================================================ 3.4.2. 전용 Thread Pool Scheduler Service에서전용 Thread Pool을사용할경우 WebAdmin과콘솔툴 (jeusadmin) 을통해설정할수있다. 본절에서는 WebAdmin과콘솔툴을사용하여전용 Thread Pool을설정하는방법에대해설명한다. WebAdmin 사용 다음은 WebAdmin을사용해서 Thread Pool을설정하는과정에대한설명이다. Thread Pool을설정하기전에 Lock 설정을변경해야한다. 1. WebAdmin의왼쪽메뉴에서 [Servers] 를선택하면, 서버목록조회화면으로이동한다. ([ 그림 3.1]) 서버목록에서설정할서버 (server1) 를선택하고, [Resource] > [Scheduler] 메뉴를선택해서 Scheduler 화면으로이동한다. 2. WebAdmin의왼쪽메뉴에서 [LOCK & EDIT] 버튼을클릭해서설정변경모드로전환한후에고급선택사항에서 Thread Pool 설정을변경할수있다. Lock 설정변경모드에대한자세한설명은 JEUS We badmin 안내서 의 2.4.4. Lock 기능 을참고한다. 제 3 장 Scheduler 설정 33
[ 그림 3.12] WebAdmin Scheduler 설정 - Lock 설정 34 JEUS Scheduler 안내서
3. 고급선택사항에서 'Pooling' 을체크하고 'Dedicated' 항목을선택한다. 'Min' 에 0, 'Max' 를 20으로설정하고 [ 확인 ] 버튼을클릭한다. [ 확인 ] 버튼을클릭하면변경한설정이임시저장되고, 화면상단에서저장결과에대한메시지를확인할수있다. [ 그림 3.13] WebAdmin Scheduler 설정 - 전용 Thread Pool 설정 (1) 제 3 장 Scheduler 설정 35
4. [Activate Changes] 버튼을클릭해서서버에반영한다. 서버에 Activate가완료되면설정한 Scheduler 의 Thread Pool 설정이서버에반영되고, 반영에대한결과를 WebAdmin 화면상단에자세한메시지로보여준다. Thread Pool 설정은동적반영가능한항목이므로운영중인서버에변경된설정이적용된다. [ 그림 3.14] WebAdmin Scheduler 설정 - 전용 Thread Pool 설정 (2) 36 JEUS Scheduler 안내서
콘솔툴사용 다음은콘솔툴 (jeusadmin) 을통해 Scheduler의 Thread Pool을설정하는방법이다. [ 예 3.2] jeusadmin을통해 Scheduler Service 공용 Thread Pool 설정 [DAS]domain1.adminServer>show-service-thread-pool server1 -service scheduler Shows the current configuration ================================================== +------+-----------------------------------------+ Name Value +------+-----------------------------------------+ (No data available) ================================================== [DAS]domain1.adminServer>modify-service-thread-pool server1 -service scheduler -min 0 -max 20 Performed to MODIFY scheduler thread pool of server (server1) successfully. But ALL changes are non-dynamic. They must be applied after RESTART. you can check out the results using "show-service-thread-pool server1 -service scheduler or modify-service-thread-pool server1 -service scheduler" [DAS]domain1.adminServer>show-service-thread-pool server1 -service scheduler show the current configuration ==================================================================== +--------------------------------------------------------+---------+ Name Value +--------------------------------------------------------+---------+ Min 0 Max 20 Keep alive Time 60000 Queue Size 4096 Max Stuck Thread Time 3600000 Action on Stuck Thread NONE +--------------------------------------------------------+---------+ ==================================================================== 참고 Scheduler Service의 Thread Pool 설정을수정하는것은동적반영가능하기때문에서버를재기동하지않아도된다. 하지만공용 Thread Pool을사용하다가전용 Thread Pool을사용하도록 Thread Pool의타입을변경하는경우동적반영되지않기때문에서버를재기동해야한다. 제 3 장 Scheduler 설정 37
3.5. 클라이언트컨테이너설정 Java EE 애플리케이션을사용하는경우클라이언트컨테이너에서구동되는 JEUS Scheduler에대해설정한다. 애플리케이션클라이언트를위한 JEUS DD인 jeus-client-dd.xml 파일에다음과같이 <scheduler> 설정을추가한다. [ 예 3.3] 클라이언트컨테이너설정 : <<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 서버를재기동할필요는없지만, 클라이언트모듈과클라이언트컨 테이너는재기동해야수정한설정내용이반영된다. 주의클라이언트컨테이너에서 Scheduler Service를사용할때는공용 Thread Pool은사용할수없다. 클라이언트컨테이너와애플리케이션클라이언트에대해서는 "JEUS Application Client 안내서 " 를참고한다. 38 JEUS Scheduler 안내서
다음은클라이언트컨테이너에서수행할 Job 설정예제이다. [ 예 3.4] 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>2011-02-01t00:00:00</begin-time> <end-time>2011-03-01t00:00:00</end-time> <interval> <minutely>30</minutely> </interval> <count>-1</count> </job> </job-list> </scheduler> 제 3 장 Scheduler 설정 39
색인 O ontime, 6, 7, 8 P package jeus.schedule, A abstract class RemoteSchedule, 7 abstract class Schedule, 6 C cancel, 14 class SchedulerFactory, 7 D daemon, 9, 14, 16 E EJB Timer Service, 1, 18 exception JeusSchedulerException, 7 F Fixed-delay 방식, 12 Fixed-rate 방식, 12 I initialize() Callback, 9 interface ScheduleController, 7 interface ScheduleListener, 6 interface Scheduler, 7 R registerschedule, 12 registerscheduleatfixedrate, 12 boolean isdaemon, 13 boolean isthreaded, 13 Date endtime, 13 Date firsttime, 12 long delay, 12 long maxcount, 13 long period, 12 RemoteSchedule, 7, 8, 9 S ScheduleFactory, 14 SchedulerFactory, 5, 7, 10, 11, 18 SERVER_SCHEDULER_NAME, 11, 16 Standalone Scheduler, 18 ㅋ 클라이언트컨테이너, 38 J JEUS Scheduler, 1 Job-list, 5, 20, 21, 22 L Lookup, 11 N nexttime, 7, 8 색인 41