WebSphere® Integration Developer와 WebSphere Process Server는 기본적인 이벤트 관리 서비스를 제공하는 방식으로써 Common Event Infrastructure (CEI)를 도입했다. CEI는 CBE 스팩에서 정의된 대로 Common Base Events (CBE)를 처리한다. CEI는 표준 XML 기반 포맷을 제공하는데, 이는 로그와 쿼리 이벤트에 기본적인 메커니즘이 된다. WebSphere Integration Developer에서의 CEI 지원을 통해 CBE 이벤트가 만들어 진다. 예를 들어, Business Process Execution Language (BPEL) 액티비티를 선택하고, 액티비티-시작 또는 액티비티-중지 이벤트를 선택할 수 있는데, 이는 자동으로 CBE를 만들어 낸다. 하지만, WebSphere Integration Developer 이벤트에 상응하지 않는 비즈니스 레벨 이벤트를 만들 필요는 없다. 여기에는 Process Engine (BPE) API를 사용할 수 있다. 하지만, 이 API는 CBE 포맷과 다른 CEI 스팩의 애트리뷰트도 노출하기 때문에, 이 API의 관련 부분들은 이벤트의 기록, 쿼리, 보기를 지원하는 사용하기 쉬운 아티팩트 세트에 저장된다. 이 글에서는, 이러한 아티팩트들을 설명하고, 이들을 복합 애플리케이션에서 사용하는 방법을 설명한다.
복합 애플리케이션을 측정하기 위해서 비즈니스 레벨 이벤트를 포착(capture)해야 한다. 비즈니스 레벨 이벤트들은 비즈니스와 관련된 정보를 캡쳐하는 이벤트이다. 예를 들어, 은행 자금이 한 계좌에서 다른 계좌로 인출될 때 이벤트가 기록된다. 비즈니스 레벨 이벤트는 기업이 비즈니스를 수행하는 방식을 파악하고 향상시킬 수 있도록 도움을 준다. 비즈니스 이벤트가 기록된 후에 이들을 모아서 비즈니스 경향을 파악할 수 있고, 결국 비즈니스를 향상시키는데 필요한 평가를 내릴 수 있는 것이다. 하지만, 비즈니스 레벨 이벤트가 특정한 WebSphere Integration Developer 액티비티와 반드시 연관되어야 하는 것은 아니다. WebSphere Integration 액티비티는 WebSphere Integration Developer 단계들에 상응할 수 있다. 그림 2는 전형적인 WebSphere Integration Developer 액티비티를 나타내고 있다. 비즈니스 레벨 이벤트는 WebSphere Integration Developer 액티비티에 상응할 수 있다.
측정 가능한 애플리케이션이 되려면 이벤트에 임의의 데이터를 영속시키는 기능이 있어야 한다. 이러한 임의의 데이터들은 비즈니스 레벨에서 의미를 갖는다. CBE 스팩은 CBE의 ExtendedDataElement 섹션을 사용하여 임의의 데이터를 영속시킨다. 이 섹션에서는 애플리케이션 스팩의 데이터가 이름 값 쌍의 포맷으로 되어 있다.
비즈니스 프로세스, 비즈니스 규칙 같은 측정 가능한 컴포넌트 유형은 WebSphere Integration Developer에 사전 정의된 비즈니스 이벤트 세트를 갖고 있다. (표 1) 하지만, 가끔 이러한 사전 정의된 이벤트들이 비즈니스 레벨 이벤트를 생성하지 않을 때도 있다. 따라서, 측정 가능한 기능을 갖춘 복합 애플리케이션을 제공하려면 언제라도 비즈니스 레벨 이벤트를 생성할 수 있어야 한다.
표 1. 각 에디터용 측정 가능한 엘리먼트
| 에디터 | 측정 가능 엘리먼트 |
|---|---|
| Assembly editor (CEI 전용) | Operation |
| Business process editor (CEI and Audit Log) | Assign, Compensate, Empty, Flow (Parallel Activities), Invoke, Pick (Receive Choice), Process, Receive, Reply, Rethrow, Scope, Script, Sequence, Staff, Switch (Choice), Template (not shown), Terminate, Throw, Variable, Wait, While (While loop) |
| Business object-mapping editor (CEI 전용) | Map, Transformation (all kinds) |
| Business rule-group editor (CEI 전용) | Operation |
| Business state machine editor (CEI 전용) | Action, Entry, Exit, Guard, State, State Machine Definition (State Machine), Timer, Transition |
| Human task editor (CEI와 Audit Log) | Escalation, Task, Task Template (not shown) |
| Interface-mapping editor (CEI 전용) | Operation Binding, Parameter mediation (all kinds) |
| Selector editor (CEI 전용) | Operation |
주: 표 1에서 Audit Log로 되어 있는 이벤트들은 프로세스 구성 데이터베이스에서 감사(audit) 이벤트로서 생성된다. CEI로서 구분된 이벤트들은 CEI 데이터 스토어에서 생성된다.
표 2. 액티비티와 이와 관련된 기본 이벤트
| 액티비티 | 기본 이벤트 이름 |
|---|---|
| Invoke | Completion forced, Entry, Exit, Expired, Failed, Retry forced, Skipped, Stopped, Terminated |
| Process | Compensated, Compensating, Compensation failed, Correlation, Deleted, Entry, Event handler escalated, Event received, Exit, Failed, Failing, Restarted, Resumed, Suspended, Terminated, Terminating, Work item created, Work item deleted, Work item transferred |
| Receive | Entry, Exit, Terminated |
| Reply | Exit, Failed, Skipped |
| Scope | Compensated, Compensating, Compensation failed, Entry, Event handler escalated, Event received, Exit, Failed, Failing, Skipped, Terminated |
| Staff | Assigned, Completion forced, Created, Deassigned, Escalated, Exit, Expired, Failed, Fault set, Output set, Retry forced, Skipped, Stopped, Terminated, Work item created, Work item deleted, Work item refreshed, Work item transferred |
| Template (not shown) | Deleted, Entry |
CBE를 검색하고 분석하는데 사용할 수 있는 두 개의 옵션들이 있다.
- WebSphere Process Server에서 제공하는 CBE Event Browser는 CBE 뷰를 제공하고, 서버 뷰의 WebSphere Integration Developer 또는 http://localhost:9060/ibm/console/cbebrowser에서 실행된다. 이 옵션은 생성된 이벤트를 보기 원하는 개발자들에게 유용하다. (그림 1)
- 프로그램을 사용하여 이벤트를 검색하고 분석과 표현을 수행할 수 있다. 이 아티팩트는 이러한 옵션들을 다룬다.
그림1. CBE Event Browser
비즈니스 레벨 이벤트를 처리하기 위해서는, 세 개의 기본적인 아티팩트를 다운로드 해야 한다. 비즈니스 레벨 이벤트들은 CEIEventEmitter를 통해 생성되고, CEIQueryService로 쿼리되며, CEIMeteringViewPortlet을 통해 볼 수 있다.
CEIEventEmitter(그림 2)는 자바™ 또는 비즈니스 프로세스에서 호출된 Service Component Architecture (SCA) 컴포넌트에서 비즈니스 레벨 이벤트를 생성할 수 있도록 해준다. 이 이벤트는 비즈니스 레벨 이벤트와 연결되고, 임의의 이름 값 쌍을 포함하고 있다.
그림 2. CEIEventEmitter의 클래스 다이어그램
Listing 1은 자바 코드에서 비즈니스 레벨 이벤트를 만들어 내는 예제이다. Factory Pattern을 사용하여 이벤트 에미터(emitter)를 생성하고 알맞은 데이터로 이를 호출할 수 있다. 간단한 메시지를 포함하고 있는 로그 이벤트(emitLogMessage)를 생성하거나, eventName, eventTrackingId, 이벤트에 대한 데이터를 포함하고 있는 이름 값 쌍을 포함한 표준 이벤트(emitEvent)를 만들 수 있다.
Listing 1. 자바 코드
ICEIEventEmitter eventEmitter = CEIEventManagementFactory.createEventEmitter();
eventEmitter.emitLogMessage(String application, String eventTrackingId, String message);
eventEmitter.emitEvent(String application, String eventTrackingId, String event,
String[] eventDataName, String[] eventDataValue)
throws CEIEventException; |
eventTrackingId는 모든 관련 이벤트들과 연관된다. 예를 들어, 하나의 비즈니스 프로세스에 같은 eventTrackingId를 사용할 수 있다. 이 이벤트는 이미 발생했던 비즈니스 레벨 이벤트를 나타내는 하나의 스트링이다. WPS:BusinessLevelEvent:FundTransferEvent처럼 콜론(colon)을 사용하여 의미가 있는 이벤트 이름들을 만들 수 있다.
Listing 2는 계좌 이체 동안 비즈니스 레벨 이벤트를 기록했던 은행 애플리케이션에서 사용되었던 코드 예제이다.
Listing 2. CEIEventEmitter를 사용하는 은행 애플리케이션 예제
// Bean implementation class for Enterprise Bean: AccountTransferService
public class AccountTransferServiceBean implements javax.ejb.SessionBean {
//some code is ignored here
public void makeTransfer( String bankId, String fromAccId, String toAccId,
BigDecimal amount, String description)
throws EJBException, TransferException {
// some code is ignored here
try {
fromTransaction = transactionsLocalHome.create(time.toString(),
fromAccId,fromBankId,"Transfer",time);
fromTransaction.setDescription(description);
fromTransaction.setTotal(amount);
fromTransaction.setToaccid(toAccId);
} catch (CreateException e2) { e2.printStackTrace();}
meterDebitEvent(fromBankId,fromAccount.getCustomerid(),fromAccId,amount);
meterCreditEvent(toBankId,toAccount.getCustomerid(),toAccId,amount);
}
private void meterDebitEvent( String bankId,String userId,String fromAcc,
BigDecimal amount) {
try {
ICEIEventEmitter emitter = CEIEventManagementFactory.createEventEmitter();
emitter.emitEvent("Jivaro", "Jivaro", "transfer_funds", new String[] {
"OpCode", "AgentID", "BfsID", "SubscriberID", "UserID",
"HostName", STATIC_Metering_ACTID, STATIC_Metering_AMOUNT},
new String[] { STATIC_Metering_DEBIT_OPCODE,
STATIC_Metering_AGENTID, STATIC_Metering_BFSID, bankId, userId,
java.net.InetAddress.getLocalHost().getHostName().toString(),
fromAcc, amount.toString()});
} catch(Exception e) { e.printStackTrace(); }
}
private void meterCreditEvent(String bankId,String userId,String toAcc,
BigDecimal amount) {
}
// some code is ignored here
} |
CEIEventEmitterRouter (다운로드 가능)는 CEIEventEmitter를 웹 서비스로서 래핑(wrap)한다. 웹 서비스를 WebSphere Integration Developer로 반입하고, 호출 기능을 하는 SCA 컴포넌트를 연결하면(그림 3), CEIEventEmitter가 서비스로서 호출될 수 있다. 성능이 문제가 된다면 SCA 모듈에 이 아티팩트를 포함시키고 이를 표준 자바 빈으로서 호출할 수도 있다.
그림 3. 서비스로서의 CEIEventEmitter
CEIQueryService(그림 6)는 CEI 영속 상태를 쿼리할 수 있도록 해주고, 지정된 코릴레이션 영역 내에서 CBE로부터 데이터를 리턴한다. 코릴레이션 영역은 모든 관련된 CBE들을 함께 그룹핑한다.
CEIEventEmitter가 이벤트들을 유지할 때, trackingId는 코릴레이션 영역을 형성하는데, 이는 관련된 이벤트들을 연결시키는데 사용된다. 여러분은 모든 관련된 CBE 이벤트들을 검색할 수 있다. 이 아티팩트에 대한 인터페이스는 웹 서비스이고, 이벤트들은 쉬운 액세스를 위해 CBE 대신 Plain Old Java Object (POJO)로 리턴된다.
아티팩트는 두 개의 부분들이 있다. 첫 번째 부분은 실제 웹 서비스와 관련 아티팩트이고, 이는 CEIQueryServiceEAR 파일에 저장된다. 이러한 아티팩트들은 WebSphere Process Server 인스턴스에 전개된다. CEIQueryService 아티팩트의 두 번째 부분은 웹 서비스에 대한 클라이언트 인터페이스와 관련된 프록시 클래스들이다. 이것은 CEIQueryServiceClientEAR 파일에 저장된다. 클라이언트 인터페이스는 테스트에 사용할 수 있는 WAR에 쉽게 액세스 할 수 있도록 EAR 파일로 되어있다. 이 클라이언트 프로젝트는 WebService 프록시와 관련 클래스들을 제공하여 CEIQueryService에 연산을 호출한다. 일반적으로, CEIQueryServiceProxy를 인스턴스화 하고 웹 서비스에 원하는 연산을 호출함으로써 웹 서비스를 시작한다. 데이터는 CEIQueryEventData 객체들의 어레이를 포함하고 있는 CEIQueryEvent 객체로 리턴된다.
그림 4. CEIQueryService 클래스 다이어그램
CEIQueryWebService를 호출하는 방법을 보여주는 샘플이 있다. 이 샘플을 통해, 생성된 프록시를 사용하여 웹 서비스를 테스트 할 수 있다. TestClient.jsp를 선택하고, Run > Run on Server를 선택한다. 웹 브라우저가 열리면, 실행할 연산을 선택할 수 있다. 서비스가 원격 호스트에 전개되어 있을 경우 엔드포인트를 바꿔야 한다.
주: 모든 프로젝트들을 성공적으로 컴파일 하려면, WPS_RUNTIME/CEI/client/events-client.jar 파일이 프로젝트 빌드 경로에 있어야 한다. WPS_RUNTIME은 WebSphere Process Server가 설치된 디렉토리이다. (C:/Program Files/IBM/Rational/SDP/6.0/runtimes/bi_v6)
CEIMeteringViewPortlet(그림 5)는 CEIEventEmitter로 생성되었던 측정 이벤트들을 볼 수 있는 포틀릿이다. CEIMeteringPortlet은 CEIQueryService를 사용하여 이벤트를 검색하고 이들을 포틀릿 페이지에서 리스팅 한다. (그림 6) 이 포틀릿에서는 사용자들이 날짜, 에이전트, 등록자에 따라서 이벤트들을 정렬할 수 있다.
표 3. 필드 설명
| 기준 | 사용법 |
|---|---|
| Start date | 이 날짜 이전에 생성된 어떤 이벤트도 보이지 않는다. |
| End date | 이 날짜 이후에 생성된 어떤 이벤트도 나타나지 않는다. |
| Agent | 이 에이전트가 생성한 이벤트들이 보인다. 에이전트는 이벤트 소스를 나타내는 스트링이다. 이벤트를 보내기 위해 애플리케이션이 선택한 임의의 스트링이다. 이는 CBE의 sourceComponentId/@application 애트리뷰트에 상응한다. |
| Subscriber | 등록자가 등록한 이벤트가 나타난다. 등록자는 이벤트 소스가 선택한 스트링이다. 이 이벤트와 관련된 당사자들을 나타낸다. 이는 SubscriberID 이름을 가진 CBE의 ExtendedDataElement에 상응한다. |
필터링 기준 영역은 선택적이다. 포틀릿은 이벤트를 필터링 하기 위해 사용할 수 있는 기준만 사용한다. 이 기능은 많은 이벤트들에 특히 유용하다.
이 포틀릿의 기능들 중 하나는 XPATH 쿼리 스트링을 사용하여 필터링을 하는 기능이다. CEIMeteringPortlet는 사용자가 정한 기준으로 XPATH 쿼리 스트링을 만들고 이 쿼리 스트링을 CEIQueryService로 보낸다. CEIQueryService는 XPATH 쿼리 스트링을 사용하여 이벤트를 검색하고 비 순응 이벤트들을 가려낸다.
그림 5. CEIMeteringViewPortlet의 클래스 다이어그램
그림 6. CEIMeteringViewPortlet 요약
하나의 이벤트를 선택하여 애트리뷰트를 상세히 볼 수도 있다. (그림 7)
그림 7. CEIMeteringPortlet 상세 보기
지금까지, 측정 가능한 복합 애플리케이션을 만드는 것이 왜 중요한지를 설명했다. 비즈니스 레벨 이벤트의 역할과, 복합 애플리케이션에서 비즈니스 레벨 이벤트를 생성하고, 쿼리하며, 보는데 사용할 수 있는 세 개의 아티팩트들을 설명했다. 이러한 재사용 가능한 아티팩트들 덕택에, 복합 애플리케이션들을 측정할 수 있고, 더 나아가 전체적인 비즈니스 프로세스를 향상시킬 수 있다.
| 설명 | 이름 | 크기 | 다운로드 방식 |
|---|---|---|---|
| 서버 측 프로젝트1 | assetsserviceside.zip | 117KB | HTTP |
| 클라이언트 측 프로젝트 | assetsportlet.zip | 2832KB | HTTP |
| 다운로드 할 수 있는 모든 프로젝트 리스트 | projectlist.zip | 6KB | HTTP |
Note
- 본 아티팩트들은 Project Interchange Format으로 제공됩니다. 반입하려면 File>Import를 선택한 다음 Project Interchange를 선택하십시오.
교육
-
RSS feed: 본 시리즈의 기술자료 관련 공지 (한국 developerWorks의 RSS 피드.)
-
Business Process Execution Language for Web Services (한글).
-
Common Base Event 스팩.
-
Common Base Event and Common Event Infrastructure 베스트 프랙티스.
-
Event Management Best Practice: 이벤트 관리.
-
Common Base Event best practices: 시작하기.
-
Common Base Event best practices: Properties and elements at a glance.
-
developerWorks 기술 이벤트와 웹 캐스트.
-
IBM SOA 웹사이트
-
한국 developerWorks SOA와 웹서비스 존
토론
-
developerWorks 블로그 및 developerWorks 커뮤니티 참여.
-
SOA와 웹서비스 포럼.


