토요일, 12월 22, 2007

Mule

작성자 : 김재탁(gagboy@gmail.com)

The Basics

Container 혹은 Mule Model 이라 불리는 mule 은 한마디로 말해 분배가능한 object 중계자이다.

Container 는 운영되는 object 들 혹은 Universal Message Objects TM 들을 관리한다.

짧게는 UMO 라고 불리는 이런 object 들은 자기자신들과 도는 외부 어플리케이션과 통신을 한다.

여기서 통신 포인트를 "Endpoints" 라고 부른다.

아래 다이어그램은 mule server 콤포넌트들을 간단하게 그려본 것이다.


The Mule Manager

Mule Manager 는 Mule 서버 인스턴스(Node 또는 Mule Node 라고 알려진)의 중심이다.

이것의 가장 중요한 역할은 Mule 인스턴스를 위해 connector, endpoint, transformer 와 같은 다양한 object 들을 관리 하는데 있다.

이러한 object 들은 service/component 들 간의 메세지를 컨트롤 하고, 이 object 들이 다루는 Model 과 Component 들에게 서비스를 제공하는데 사용된다.


The Model

Model 은 component 들이 관리되어지고 실행되어지는 컨테이너이다.

이것은 component 들 간의 메세지의 흐름을 컨트롤하고 threading, lifecycle 그리고 pooling 을 관리한다.

디폴트 MuleModel 은 퍼포먼스와 처리량을 최대로 끌어올릴 수 있는 효율적인 event 기반의 큐잉 모델인 SEDA 기반이다.

이 컨테이너는 transaction 관리, transformation(변환) 이벤트, routing(라우팅), 이벤트 상관 관계, 로깅, 감시 그리고 관리 등의 UMO component 들을 위해 서비스 범위를 제공한다.

Mule 는 object 생성을 관리로 부터 분리했다. 이것이 뜻하는 것은 Spring, PicoContainer 또는 Plexus 와 같은 유명한 IoC/DI 컨테이너가 UMO component 들을 생성하는데 사용되도록 한다는 것이다.


UMO Components

Universal Message Object TM 를 의미하는 UMO 는 어느곳에서라도 event 를 보내고 받을 수 있는 object 이다.

UMO component 는 비즈니스 오브젝트이다. 이것들은 들어오는 이벤트에서 비즈니스 로직을 실행하는 콤포넌트들이다.

이러한 컴퍼는트들은 어떤 Mule 관련 코드도 필요 없는 표준 JavaBean 들이다.

Mule 은 component 의 설정에 기반하여 object 들 간의 라우팅과 변환을 처리한다.


Endpoints

Endpoint 는 Mule 의 통신력에 있어서 매우 중요하다. Endpoint 는 두개 혹은 그 이상의 어플리케이션 혹은 저장소 component 들간의 통신 채널을 정의한다.

Endpoint 는 어떤 프로토콜의 오브젝트간의 대화도 통합된 방법으로 할 수 있도록 하는 강력한 기능을 제공한다. Endpoint 는 Endpoint 를 통해서 누가 어떤 그리고 어떻게 메세지들을 받고 혹은 보내는지를 컨트롤 하기 위해서 message filter 들, security interceptor 들 그리고 transaction 정보로 구성된다. 더 자세한 정보를 얻으려면 Mule Endpoints 를 보아라.


External Applications

External application(외부 어플리케이션) 은 어플리케이션 서버 에서 부터 기간계 급여 시스템, 메인프레임 트레이딩 어플리케이션, 클라이언트 어플리케이션 까지 어떤 것도 될 수 있다.

기본적으로 데이타를 제공 혹은 소비할 수 있는 길이 있는 어떤 어플리케이션도 External application 이 될 수 있다는 뜻이다.

Mule 이 endpoint 들을 통해 통신을 처리하기 때문에, UMO component 들은 '어떤 어플리케이션이 데이타를 생산하는가?', '어플리케이션이 어디에 위치해 있는가?', '어떤 전송 프로토콜을 사용하는가?' 에 대한 정보를 가지고 있지 않다.

Mule Objects

Mule 에서 사용되는 전문용어는 약간의 혼란을 가져올 수 있지만, 그 혼란은 아주 간단히 없앨 수 있다.


Object Term Description
Transport transport 또는 "provider", 는 Mule 이 특정한 종류의 전송 혹은 프로토콜을
핸들링 할 수 있도록 지원해주는 오브젝트들을 말한다.
예를 들면 "Email Provider" 는 Mule 이 SMTP, POP 그리고 IMAP 프로토콜을 통해 메세지를 주고 받는것을 가능하게 한다.
Connector connector 는 endpoint 쪽에서 메세지를 주고 받는 object 를 말한다.
Connector 들은 특정 transport 혹은 Porvider 의 일부인 번들로 제공된다.
예를 들어, FileConnector 는 파일 시스템의 파일들을 읽고 쓸수 있다.
Router router 는 connector 에 의해 받은 혹은 connector 에 의해 발송 되어지기 전의 메세지에 어떤 일을 하는 object 를 말한다.
Filter filter 는 connector 로 부터 들어오는 혹은 나가는 메세지를 선택적으로 필터링을 한다. 예를 들면, File Provider 는 파일 이름 패턴 에 의해 어떤 파일을 connector 가 읽을지 제한하는 FilenameWildcardFilter 와 함께 쓰게 된다. Filter 들은 Router 들과 함께 사용된다.
Transformer transformer 는 incoming 또는 outgoing 메세지들을 어떤 방식으로 선택적으로 변환한다.
예를 들어, BytearrayToString transformer 는 byte array 를 String 오브젝트로 변환한다.

금요일, 12월 21, 2007

목요일, 12월 20, 2007

Quartz - Quartz 1 - CronTriggers Tutorial


작성자 : 김재탁(gagboy@gmail.com)

이 튜토리얼의 일부 내용은 Quartz 1.4.2 javadoc 의 CronTrigger 에서 가져왔다.

Introduction

cron 은 오랜시간동안 사용되어진 UNIX 툴이다. 즉 cron 의 스케쥴링 능력은 강력하고 입증된 것이다.

만약에 SimpleTrigger 의 정확한 간격에 의해 실행되는 schedule 이 아닌, 달력과 같은 개념을 바탕으로 작업을 실행시키는 schedule 을 필요로 한다면, SimpleTrigger 보다는 CronTrigger 가 더 어울릴 것이다.

CronTrigger 로는 "매일 금요일 정오", 또는 "매평일(토,일 제외) 9:30분 마다", 또는 "매 월, 수, 금 의 오전 9시~오전 10시 사이에 매 5분마다" 와 같은 스케쥴을 정의 할 수 있다.

또한, SimpleTrigger 와 같이, CronTrigger 는 schedule 의 효력이 시작되는 startTime 과 schedule 이 중지 되는 (optional) endTime 를 설정할 수도 있다.

Format

Cron-Expressions 은 공백으로 분리되는 6~7 개의 문자열로 구성된다. 각 필드들은 어떤 allowed values(허락된 값 - 아래 표 참조) 값도 가지고 있을수 있으며, allowed special characters(허락된 특수문자 - 아래 표 참조) 와 함께 다양한 조합을 만들수 있다:


Field Name Mandatory? Allowed Values Allowed Special Characters
Seconds YES 0-59 , - * /
Minutes YES 0-59 , - * /
Hours YES 0-23 , - * /
Day of month YES 1-31 , - * ? / L W C
Month YES 1-12 or JAN-DEC , - * /
Day of week YES 1-7 or SUN-SAT , - * ? / L C #
Year NO empty, 1970-2099 , - * /


cron 표현식은 다음과 같은 모양이 될수 있다: * * * * ? *
혹은 다음과 같이 더욱 복잡하게되 표현된다: 0 0/5 14,18,3-39,52 ? JAN,MAR,SEP MON-FRI 2002-2010

Special characters

  • * ("all values") 모든값 - 해당 필드의 모든 값. 예를들어 minutes 필드의 "*" 는 "매분" 을 의미한다.
  • ? ("no specific value") 값 정의 안함 - day-of-month 와 day-of-week 에 사용할 수 있다. 이것은 두 필드중 한 필드는 사용하지 않고 다른 한 필드만 사용하려고 할때 유용하다. 예를들어 무슨 요일에 상관 없이 매달 10일에 실행시키고 싶다면 day-of-month 필드에 "10" 을 적고 day-of-week 필드에 "?" 을 적으면 된다. 좀더 명확하게 알고 싶으면 아래 예제를 보도록 한다.
  • - - 범위를 기술한다. 예를들어 Hour 필드의 "10-12" 는 "10, 11, 12 시" 를 의미한다.
  • , - 추가적인 값들을 기술한다. 예를들어 day-of-week 필드의 "MON,WED,FRI" 는 "월요일, 수요일, 금요일" 을 의미한다.
  • / - 증가값을 정의할 때 사용된다. 예를들어, '0/15' 를 Minutes 필드에 기술하면, 이것은 '0 분에서 시작해서 매 15분 마다' 를 의미한다. 만약 '3/20' 을 Minutes 필드에 기술 했다면 이것은 '3분에서 시작해서 그 시간내의 매 20분 마다' 를 의미한다. - 다르게 말하자면 Minutes 필드에 '3,23,43' 이라고 적은것과 같다. '*' 뒤에 '/' 를 사용 할 수도 있다 - 이것은 '/' 전에 0을 가지는 것과 같다. day-of-month 필드의 '1/3' 은 "달의 첫번째 날에서부터 시작하여 매 3일 마다" 를 의미한다.
  • L ("last") - day-of-month 와 day-of-week 에서만 사용 될 수 있다. 이것은 마지막을 의미하는 "last" 의 짧은 표현이지만, 각 두 필드에서는 서로 다른 의미를 가지고 있다. 예를들어 day-of-month 의 "L" 필드는 "월의 마지막 일자" - 즉, 1월에는 31일, 평년(윤년이 아닌) 의 2월에는 28일을 의미한다. 만약 day-of-week 필드에 독립적으로 사용한다면 이것은 "7" 혹은 "SAT" 를 의미한다. 그러나 day-of-week에 다른 값 뒤에 사용된다면 이것은 "해당월의 마지막 XX요일" 을 의미하게 된다 - 예를들어 "6L" 또는 "FRIL" 은 "월의 마지막 금요일" 을 말하게 되는것이다. "L" 옵션을 사용할때 혼란스러운 결과를 얻지 않으려면 list 나 range(범위) 값을 지정하지 말아야 한다.
  • W ("weekday") - 주어진 날짜의 가장 가까운 평일(월~금) 을 정의할때 사용된다. 예를들어, day-of-month 필드에 "15W" 라고 정의했다면 이것은 "해당월의 15 일에 가장 가까운 평일" 을 의미한다. 그러므로 만약 15일이 토요일이라면 trigger 는 금요일인 14일에 실행되며, 15일이 일요일이라면 trigger 는 월요일인 16일에 실행되게 되며, 15일이 화요일이라면 15일에 실행되게 된다. 반면에 day-of-month 필드에 "1W" 라고 정의했고 1일이 토요일이라면, 트리거는 월요일인 3일에 실행된다. 즉 'W' 는 월의 경계를 넘지 않는다. 'W' 문자는 day-of-month 필드가 범위나 리스트가 아닌 하나의 날짜 일때만 사용 될 수 있다.

'L' 과 'W' 문자는 day-of-month 필드에 'LW' 로 함께 쓰일수 있다. 이것은 "월의 마지막 평일" 을 의미한다.

  • # - day-of-week 필드에만 사용될 수 있으며 월의 "몇번째" X요일 을 정의할때 사용된다. 예를들어 day-of-week 필드의 "6#3" 또는 "FRI#3" 은 "월의 세번째 금요일" 을 의미한다. 다른 예제로 "4#5" = 는 5번째 수요일을 의미하는데 만약 해당 월에 5번째 수요일이 없다면 이것은 실행되지 않는다.
  • C ("calendar") 아직 지원 안되는 기능 - 이것은 연관된 Calendar(달력) 으로부터 값이 계산되어 진다는 것을 의미한다. if any. If no calendar is associated, then it is equivalent to having an all-inclusive calendar. A value of "5C" in the day-of-month field means "the first day included by the calendar on or after the 5th". A value of "1C" in the day-of-week field means "the first day included by the calendar on or after Sunday".

months 필드와 days of the week 필드의 케릭터들은 대소문자를 구분하지 않는다. 즉 MON 은 mon 과 같다.

Examples

여기 모든 예제가 있다:

표현식 의미
0 0 12 * * ? 매일 정오에 실행
0 15 10 ? * * 매일 10:15am 에 실행
0 15 10 * * ? 매일 10:15am 에 실행
0 15 10 * * ? * 매일 10:15am 에 실행
0 15 10 * * ? 2005 2005년일 동안 매일 10:15am 에 실행
0 * 14 * * ? 매일 2pm 에서 2:59pm 까지 매분마다 실행
0 0/5 14 * * ? 매일 2pm 에서 2:55pm 까지 5분마다 실행
0 0/5 14,18 * * ? 매일 2pm 에서 2:55pm 까지 5분마다 실행 그리고 매일 6pm 에서 6:55pm 까지 5분마다 실행
0 0-5 14 * * ? 매일 2pm 에서 2:05pm 까지 매분마다 실행
0 10,44 14 ? 3 WED 3월의 모든 수요일에 2:10pm 과 2:44pm 에 실행
0 15 10 ? * MON-FRI 매 월요일, 화요일, 수요일, 목요일, 금요일의 10:15am 에 실행
0 15 10 15 * ? 매월 15일의 10:15am 에 실행
0 15 10 L * ? 매월 마지막날의 10:15am 에 실행
0 15 10 ? * 6L 매월 마지막 금요일의 10:15am 에 실행
0 15 10 ? * 6L 매월 마지막 금요일의 10:15am 에 실행
0 15 10 ? * 6L 2002-2005 2002, 2003, 2004, 그리고 2005 년의 매월 마지막 금요일의 10:15am 에 실행
0 15 10 ? * 6#3 매월 세번째 금요일의 10:15am 에 실행
0 0 12 1/5 * ? 달의 첫번째 날에서 부터 5일 마다 12pm(정오)에 실행
0 11 11 11 11 ? 매 11월 11일의 11:11am 에 실행

day-of-week and day-of-month 필드의 "?" 과 "*" 의 효과를 주의 깊게 보라.

Notes

  • 'C' 문자에 대한 기능이 아직 완성되지 않았다.
  • day-of-week 와 a day-of-month 모두에게 값을 정의하는 기능이 아직 완성되지 않았다 (지금은 두 필드중 한곳에 반드시 "?" 를 적어줘야 한다).
  • 자정에서 1:00 AM 사이에 실행되도록 설정할 때는 주의하라 - "daylight savings(서머타임)" 에 의해 시간이 앞으로 가거나 뒤로 가는것 때문에 실행을 반복하거나 건너 뛸 수 있다.

최근 게시물 이전 게시물