반응형
Introduction

BAM Adapter와 BPEL Sensores를 이용하여 주문을 모니터링(dashboard) 해봅시다~



Creating Dashboards in BAM

http://localhost:9001/OracleBAM에 접속합니다.



Architect 버튼을 클릭합니다.



데이터 객체 클릭 후 하위 폴더 생성을 클릭합니다.

Training을 입력 후 폴더 생성 버튼을 클릭합니다.



계속 버튼 클릭 후, 다시 하위 폴더 생성 클릭 후 End2End-105-POProcessing 생성



/Training/End2End-105-POProcessing 에서 데이터 객체 생성을 클릭합니다.



필드 추가를 이용해서 아래와 같이 생성합니다.

Total 필드는 계산됨을 선택하고 공식 편집을 클릭합니다.



Price * Quantity 를 입력합니다.



나머지 필드도 입력 후 데이터 객체 생성 버튼을 클릭합니다.



계속 버튼을 클릭합니다.



레이아웃을 클릭한 상태입니다.



내용 클릭해보면 아직 데이터는 없습니다. -0-



다시 메인 화면에서 Active Studio 버튼을 클릭합니다.



공유 보고서 탭을 클릭합니다.



새 폴더를 클릭합니다.



Training 입력 후 확인 버튼을 클릭합니다.



생성된 Training 폴더를 더블 클릭해서 들어갑니다.



다시 새 폴더 생성을 클릭합니다.



End2End-105-POPRocessing 입력 후 확인 버튼을 클릭합니다.



생성된 폴더를 더블 클릭해서 들어갑니다.



새 보고서 생성 버튼을 클릭합니다.



위 1개 아래 2개의 영역이 있는 보고서를 선택합니다.



제목 부분을 PO Processing Report로 변경합니다.



첫번째는 갱신 정렬 목록(Updating Ordered List)을 선택합니다.



아래쪽에 설정 창이 뜨는데 먼저 데이터 객체를 선택해야합니다. Training을 더블 클릭합니다.



End2End-105-POProcessing을 더블 클릭합니다.



Orders를 선택 후 다음 버튼을 클릭합니다.



데이터 필드를 모두 선택합니다.



다음 버튼을 클릭합니다.



완료 버튼을 클릭합니다.



두번째 영역은 3D 파이 차트(3D Pie Chart)를 선택합니다.



그룹 기준은 Item Type, 차트 값은 Total, 요약 함수는 Sum을 체크 해제하고 Percentage of Total을 체크합니다.

다음 버튼을 클릭합니다.



보기 속성 변경을 클릭합니다.



보기 제목을 Percentage of Total Sales by Item Type으로 변경 후 확인 버튼을 클릭합니다.



3번째는 3D 막대 차트(3D Bar Chart)를 선택합니다.



기룹 기준은 Status, 차트 값은 Order ID, 요약 함수는 Count를 선택 후 다음 버튼을 클릭합니다.



보기 속성 변경 클릭 후 보기 제목을 Purchase Orders by Status로 변경하고 확인을 클릭합니다.



보고서 저장을 클릭합니다.



저장 위치를 공유보고서/Training/Ene2End-105-POProcessing로 지정 후 확인 버튼을 클릭합니다.



확인 버튼을 클릭합니다.





Configure BAM Adapter on WebLogic Server

웹로직 콘솔(http://localhost:7001/console)에 접속하여 배치 목록으로 이동합니다.

OracleBamAdapter를 클릭합니다.



구성 - 아웃바운드 접속 풀 탭으로 이동합니다.

oracle.bam.adapter.adc.RMIConnectionFactory 를 펼치고 eis/bam/rmi를 클릭합니다.



밤 서버 정보를 입력 후 저장 버튼을 클릭합니다.



※ 미리 .../Oracle_SOA1/soa/BAMPlan 폴더를 생성해 놓읍시다!

배치 계획을 미리 생성한 폴더에 맞춰 저장합니다.



저장 되었습니다.



다시 배치 테이블에서 OracleBamAdapter를 선택(체크)하고 갱신 버튼을 클릭합니다.



완료 버튼을 클릭합니다.





Creating a BAM Connection

JDeveloper로 돌아와서 POProcessing 어플리케이션을 엽니다.

Application Resources 네비게이터에서 Connections에서 오른쪽 버튼 클릭 후 New Connection - BAM 을 클릭합니다.



Name은 기본 이름으로 합니다. Next 버튼을 클릭합니다.



BAM Server 정보를 입력합니다.



Test Connectino 버튼을 클릭해서 모두 success 가 나와야 합니다. Finish 버튼을 클릭합니다.



Orders 데이터 객체가 보이네요~





Adding a BAM Service Adapter

BAM Adapter를 추가합니다.



Service Name: OrderBAMAdapter



Browse 버튼을 클릭합니다.



Training/End2End-105-POProcessing/Orders를 선택합니다.



Operation은 Upsert를 선택하고 Enable Batching을 체크합니다. Key로 _Order_ID를 선택합니다.



JNDI Name은 기본 eis/bam/rmi



Finish 버튼을 클릭합ㅎ니다.



route(Mediator)PO와 OrdersBAMAdapter(BAM Adapter)를 연결합니다.



routePO를 더블 클릭합니다.



OrdersBAMAdapter::writetoBAM 으로가는 Transform을 추가합니다.





아래와 같이 연결합니다.





Testing BAM Integration with the BAM Adapter


다시 배치 후 테스트합니다. Mediator에서 BAM으로 간 것을 볼 수 있습니다.



BAM 데이터 객체 내용을 보하나의 데이터가 입력되었습니다.





Adding BAM Sensors to the BPEL Process

approveLargeOrder(BPEL Process)를 편집합니다.



assignCCNumber(Assign) 액티브를 수정합니다.



Copy Operation을 하나 추가합니다.



편집창 오른쪽 상단에 BPEL로 되어있는것을 Monitor로 변경합니다.



assignCCNumber 액티브에서 오른쪽 버튼 클릭 후 Create - Sensor를 클릭합니다.



Name은 PendingApprovalActivitySensor, Evaluation Time은 Completion을 선택합니다.

Activity Variable Sensors에 Variable을 하나 추가합니다.



Variable XPath 오른쪽에 편집 버튼을 클릭합니다.



outputVariable - payload - Order를 선택합니다.



OK를 클릭합니다.



OK 를 클릭합니다.



assignCCNumber 액티브에 센서 아이콘이 생겼습니다.



Structure 팔레트(BPEL 편집창에서만 보입니다)에서 Sensor Actions를 클릭하고 BAM Sensor Action을 클릭합니다.



Action Name은 PendingApprovalSensorAction 입력, Sensor는 PendingApprovalActivitySensor를 선택합니다.

BAM Data Object 오른쪽에 Browse 버튼을 클릭합니다.



Training - End2End-105-POProcessin - Orders를 선택합니다.



_Order_ID키로 추가하고 Map File을 지정 후 Enable Batching을 체크 합니다.

Map File 오른쪽의 + 버튼을 클릭합니다.



아래와 같이 연결합니다. 아래 함수는 current-Datetime()



센서 하나와 그에 해당하는 센서 액티브를 만들었습니다.



이제 callbackClient 액티브에 Sensor를 추가합니다.



Evaluaion Time을 Activation으로 선택하고 Variable는 outputVariable - Orders를 선택합니다.



CallbackActivitySensor에 해당하는 BAM Sensor Action을 만들겠습니다.



설정은 아래와 같습니다.



아래와 같이 2개의 센서와 센서 액션(BAM)이 만들어졌습니다.





Deploying and Running the Composite

모두 배치 후 테스트합니다.



두번째 주문은 Customer ID가 이름이 들어와 있고, approved가 approved로 되어있는것을 확인할 수 있습니다.

assign 센서에서 Pending 상태로 한번 기록되고, callback 센서에서 approved 상태로 업데이트가 됩니다.





5000원 이상의 주문을 하게 되면 Human Task에 의해서 대기 상태에 걸리게 됍니다.

이때는 assign 센서까지는 거쳤는데 아직 callback 센서를 거치지 않아서 상태가 Pending Approval로 입력이 되어있습니다.



휴먼 테스트를 처리 하고 나면



callback 센서에 의해서 상태가 바뀌게 됩니다.



실시간으로 갱신되는 레포트를 보겠습니다.

BAM 메인에서 Active Viewer 버튼을 클릭합니다.



좌측 상단에 보고서 선택 버튼을 클릭합니다.



보고서를 선택합니다.



짜잔~ -_-/ (좀.. 구림...)






반응형
//
반응형
Introduction

SDO를 사용하는 방법을 알아봅시다~



Preparing for the lab

아래 스크립트를 실행하셔야 합니다.


sqlplus soademo/soademo @create_cstomers_table.sql



Creating the ADFBC Service

어플리케이션을 만듭니다.



Application Name: CustomerSDOApp



Project Name: CustomerSDO



Finish 클릭



CustomerSDO 프로젝트에서 마우스 오른쪽 버튼 클릭 후 New... 클릭



Business Tier - ADF Business Components에 Business Components from Tables를 선택합니다.



Connection을 추가합니다.



Connection 정보를 입력합니다.



SQL Flavor와 Type Map은 Oracle로 놔두고 OK

※ 테스트하는 DB(soademo)가 다른 DB이면 바꿔주세요.



CUSTOMERS 테이블을 선택합니다.



Next 버튼을 클릭합니다.



Customers (SOADEMO.CUSTOMERS)를 선택합니다.



Read-Only View Objects 창에서는 그냥 Next 버튼을 클릭합니다.



Name: CustomerSDOAppModule



Finish 버튼을 클릭합니다.



CustomerSDOAppModule을 더블 클릭합니다. Service Interface를 선택합니다.



+ 버튼을 클릭합니다.



Web Service Name: CustomerSDOService



Next 버튼을 클릭합니다.



CustomersView1을 선택합니다.



CustomersView1 선택하면 Basic Operations 탭에 목록이 나오게 됩니다. 하나도 빠짐없이 다 선택합니다. (스크롤 내려서 선택!)



Finish 버튼을 클릭합니다.





Deploying the service

Configureations을 선택 합니다.



CustomerSDOService를 선택 후 Edit 버튼을 클릭합니다.



Datasource Name: jdbc/soademoDatabase. OK 버튼을 클릭합니다.



Defaut Configuration을 CustomerSDOService로 번경합니다.



모두 저장합니다.

CustomerSDO 프로젝트 선택 후 마우슨 오른쪽 버튼 클릭. Project Properties... 클릭합니다.



Java EE Application에서

Java EE Web Application Name: CustomerSDO-webapp, Java EE Web Context Root: customer-app



Deployment에서 Deployment Profile을 추가합니다.



Archive Type을 Business Components Service Interface로 선택하고 Name은 customerSDOProfiles로 입력합니다.



추가된 customerSDOProfile을 펼치고, MiddelTier (EJB JAR File) 선택 후 Edit 버튼을 클릭합니다.



EAR File을 customer-app.ear 로 변경하고, Enterprise Application Name을 CustomerSDO로 변경합니다.

OK 버튼을 클릭합니다.



OK 버튼을 클릭합니다.



Deploy 합니다.



http://localhost:8001/customer-app/CustomerSDOService로 접속합니다.

아래와 같은 화면이 나오는데, 작업에서 getCustomersView1 선택 후 customerId에 1111을 입력하고 호출 버튼을 눌러봅시다.



결과가 나옵니다. 형식이 지정된 XML을 클릭하면 좀 더 이쁘게 볼 수 있습니다.



이 웹서비스를 POProcessing에서 사용해봅시다.



Using the SDO in POProcessing Composite

POProcessing Composite 편집 화면에서 Web Service를 추가합니다.



전에 추가한 웹서비스의 WSDL URL을 알기 위해서는 서비스 설명을 참조하십시오.를 클릭하거나 뒤에 ?wsdl 을 붙이면 됩니다.



위 URL을 복사합니다.



WSDL URL에 붙여넣기 합니다. 붙여넣기 후 포커스를 다른 곳으로 이동시키면 자동으로 정보를 읽어들입니다.



approveLargeOrder(BPEL Process)를 수정합니다.



Structure 팔레트에서 Variable를 추가합니다.



Name: CustomerInfoEV. Element 선택 후 Browse 버튼을 클릭합니다.



아래와 같이 CustomerSDOService.wsdl에 있는 스키마를 선택합니다.



Entity Variable 채크 후 Partner Link 오른쪽의 Browse 버튼을 클릭합니다.



CustomerSDOService를 선택합니다.



OK 버튼을 클릭합니다.



receiveInput 액티브 아래에 Bind Entity 액티브를 추가합니다.



이름을 BindCustomerId로 변경 후 편집합니다.(더블 클릭)



Entity Variable 오른쪽의 Browse 버튼을 클릭합니다.



CustomerInfoEV를 선택합니다.



Unique Key를 추가합니다.



KeyLocal Part 오른쪽 Browse 버튼을 클릭합니다.



CustomerInfoEV - customersViewSDO - CustomerId를 선택합니다.



Key Value 오른쪽에 Express Builder 버튼을 클릭합니다.



inputVariable - payload - Order - customerId를 선택합니다.



OK 버튼을 클릭합니다.



OK 버튼을 클릭합니다.



Assign 액티브를 BindCustomerId 아래에 추가합니다.



Name: AssignCustomerName. 아래와 같이 Copy Operation을 추가합니다.



Human Task 가 속해있는 Switch 액티브 바로 아래에 Assign 액티브를 추가합니다.



Name: AssignOrderInfo. 아래와 같이 2개의 Copy Operation을 추가합니다.





POProcessing composite 배치 후, 1000~5000 가격의 데이터를 테스트해봅시다.


테스트 후 흐름 추적에서 callbackClient 부분을 보면 고객의 이름이 나온 것을 확인할수 있습니다.



실제 db에서 customers 테이블을 select 해보면 주문정보가 갱신되어있습니다.







반응형
//
반응형
Introduction

Event Driven Network(EDN)으로 인스턴스를 싱행하는 방법을 알아보겠습니다.

JMS, AQ 같은것들로도 된다는거 같네용 ㄷㄷ



Defining the event

Poprocess Composite 편집 화면에서 Event Definition Creation 아이콘을 클릭합니다.



EDL File Name은 POEvents를 입력하고, Events 부분에서 Add an Event 버튼을 클릭합니다.



Element는 po.xsd - PuchaseOrder를 선택합니다.

Name은 NewPO를 입력하고 OK를 클릭합니다.



Events에 NewPO가 추가된 것을 확인하고 OK를 클릭합니다.



자동으로 열리는 POEvents.edl 창은 닫습니다.



다시 POProcessing Composite에 Mediator를 추가합니다.



Name은 receiveNewPO를 입력하고, Template은 Subscribe to Events를 선택합니다.

Subscribe to Events를 선택하게 되면 이떤 이벤트를 읽어(구독)들일건지 설정하는 화면으로 바뀝니다.

+ 버튼을 클릭합니다.



NewPO를 선택합니다. (이미 선택되어져 있습니다.



OK를 클릭합니다.



receiveNewPO(Mediator)와 routePO(Mediator)를 연결합니다.



receiveNewPO를 더블 클릭하여 편집합니다.



Transform Using을 만듭니다.









Deploying and testing

아래 파일을 다운로드 받아서 편집합니다. (soa suite 11.1.1.2.0에 클래스패스를 변경한 파일입니다.)



lab 에 나온대로 11.1.1.1.x 쓰시면 아래 파일을 받아주세요



DB_USERID, DB_PASSWD, DB_CONN, ORACLE_HOME 값을 자신에 맞게 변경합니다.

※ 여기서 DB 정보는 RCU를 이용해서 만들었던 DB 정보 입니다.

명령 프롬프트 창에서 ORACLE_HOME 환경변수를 자신의 설치폴더에 맞게 설정합니다.

> set ORACLE_HOME=C:\Oracle\Middleware\Oracle_SOA1

만약 Java 가 실행이 안되다면 설치하시고 java.exe 가 실행이 되게 설정해주세요~

이벤트를 실행해봅시다!


> publish.cmd new_po_event.xml

성공적으로 실행 되었다면 아래와 같은 메시지가 나옵니다.

Creating datasource...
Creating BusinessEventConnectionFactory...
Creating connection...
2010. 8. 12 오후 4:10:47 oracle.integration.platform.blocks.event.jms.ContextHelper lookupContextProviderClass
정보: Context provider properties file not found
Creating Business Event...
Sending event:
<business-event xmlns:ns="http://schemas.oracle.com/events/edl/POEvents" xmlns="http://oracle.com/fabric/businessEvent">
   <name>ns:NewPO</name>
   <id>e4196227-806c-4680-a6b4-6f8df931b3f3</id>
   <content>
      <PurchaseOrder xmlns="http://xmlns.oracle.com/ns/order">
         <CustID>1111</CustID>
         <ID>33412</ID>
         <productName>Sony Bluray DVD Player</productName>
         <itemType>Electronics</itemType>
         <price>350</price>
         <quantity>5</quantity>
         <status>Initial</status>
         <ccType>Mastercard</ccType>
         <ccNumber>1234-1234-1234-1234</ccNumber>
      </PurchaseOrder>
   </content>
</business-event>
Done.

이제 EM에 들어가서 POProcessing 을 확인해보면 인스턴스가 생성된 것을 확인 할 수 있습니다.

흐름 추적을 해보면 receiveNewPO Service에 의해서 실행이 된 것을 확인 할 수 있습니다.



※ lab을 잘 따라 했다면 여기서 성공하지 않고 에러가 나서 복구 대기중일 겁니다.

이유는 Chapter E 에서 했던 보안 정책 때문에 그런데 비활성화하고 하면 잘 됩니다.

또는 그냥 복구 하면 바로 잘 됩니다. 왜 그런지는 저도 잘 -_-;;;







반응형
//

Chapter E - Enforcing Policies

Posted at 2010. 8. 12. 14:15 | Posted in Oracle Solution/PO Processing
반응형
Introduce

서비스에 보안정책을 정하는 방법을 알아봅시다~

- How to attach a policy
- How to secure invocation of a composite using web services security usernametoken(userid/password).
- How to propagate identiry across a multi-composite to an invoked service using SAML[각주:1].
- Communicate signed and encrypted messages.



Policy attachment in console

EM에서 POProcessing Composite을 클릭합니다.



정책 탭을 클릭합니다.



첨부 대상/분리 위치 버튼을 클릭 후 receivePO를 클릭합니다.



사용 가능한 정책 목록에서 "was_username_token_service_policy"를 클릭 후 첨부 버튼을 클릭합니다.



첨부된 정책 목록 확인 후 확인 버튼을 클릭합니다.



이번에는 getCreditCardStatus에 정책을 첨부합니다.



"oracle/wss11_saml_token_with_message_protection_client_policy"를 첨부합니다.



2가지 정책이 첨부 되었습니다.



validationForCC Composite의 getStatusByCC에도 정책을 첨부합니다.



"oracle/wss11_saml_token_with_message_protection_service_policy"를 첨부 합니다.



1가지의 정책이 첨부되었습니다.



POProcessing을 테스트합니다.

테스트를 할때 보안 분에서 "WSS 사용자 이름 토큰"을 선택하고 사용자 이름과, 비밀번호를 입력해야 니다.



입력하지 않거나 틀리면 아래와 같은 에러가 납니다.





A quick look at policy management

EM 왼쪽 메뉴에서 "WebLogic 도메인 - domain1(자기도메인)"에서 오른쪽 버튼 클릭 후 "웹서비스 - 정책"을 클릭합니다.



적용된 정책 목록이 나옵니다.





Policy attachment in JDeveloper

JDeveloper에서 정책을 적요시키는 법을 알아봅시다.

POProcessing에서 receivePO(Web Service)에서 오른쪽 버튼 클릭 후 Configure WS Policies...를 클릭합니다.



Security 부분에서 정책을 추가합니다.



OK를 클릭하면 receivePO(Web Service)에 자물쇠 아이콘에 생긴 것을 확인할 수 있습니다.



getGreditCardStatus(Web Service)와 validationForCC의 getStatusByCC(Web Service)에도 정책을 적용합니다.





getStatusByCC











  1. http://jangsunjin.tistory.com/33 [본문으로]
반응형
//

Chapter D - Fault Handling

Posted at 2010. 8. 12. 13:27 | Posted in Oracle Solution/PO Processing
반응형
Introduction

에러가 발생했을때 처리하는 법을 알아보겠습니다.



Test service unavailability

원격 에러(remote fault) 에 대한 에러 처리 정책을 정의하는 법을 알아봅시다.

먼저 validationForCC 웹서비스를 잠시 내려봅시다.

JDeveloper의 Application Server Navigator에서 validationForCC(Composite)를 내릴 수 있습니다.





※ Application Server Navigator가 안보인다면 View 메뉴에 있습니다.



※ EM(Enterprise Manager)에서도 내릴 수 있습니다.



이제 POProcessing를 테스트 합시다.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/ns/order">
        <ns1:PurchaseOrder>
            <ns1:CustID>1111</ns1:CustID>
            <ns1:ID>2222</ns1:ID>
            <ns1:productName>iPod shuffle</ns1:productName>
            <ns1:itemType>Electronics</ns1:itemType>
            <ns1:price>145</ns1:price>
            <ns1:quantity>30</ns1:quantity>
            <ns1:status>Initial</ns1:status>
            <ns1:ccType>Mastercard</ns1:ccType>
            <ns1:ccNumber>1234-1234-1234-1234</ns1:ccNumber>
        </ns1:PurchaseOrder>
    </soap:Body>
</soap:Envelope>

메시지 흐름 추적 실행을 해보면 에러가 발생했습니다.



getStatusByCC 웹서비스를 호출해야 하는데 웹서비스가 꺼져있어서 나는 에러 입니다.



remoteFault를 확인할 수 있습니다.





Add policy-based fault handler to do manual recovery

사용자 복구를 위한 기본 정의를 추가해봅시다.

아래 두 파일을 POProcessing 프로젝트 폴더에 복사합니다.

 



JDeveloper의 Application Navigator에서 새로고침을 누르면 복사된 파일이 나타납니다.



fault-policies.xml 파일은 에러에 따른 처리를 정의하는 파일이고, fault-bindings.xml 파일은 이 정의를 적용시키는 역할을 합니다.

fault-policies.xml 파일을 열어서 편집합니다.

Step D.2.2.2 주석 바로 아래에 아래의 내용을 추가합니다.

      <!-- Step D.2.2.2: Add your fault handler for remote fault here: -->
      <faultName xmlns:bpelx="http://schemas.oracle.com/bpel/extension" name="bpelx:remoteFault">
        <condition>
            <action ref="ora-human-intervention" />
        </condition>
      </faultName>

모두 저장 후 배치 합니다.

EM 에서 다시 테스트 후 메시지 흐름 추적 실행을 해보면 getStatusByCC는 에러가 나있고, approveLargeOrder(BPEL Process)는 실행 중인 것을 확인할 수 있습니다.

그리고 오류 메시지 부분에 복구라는 부분이 생겼습니다.



감사 추적을 보면 아래와 같은 부분이 나옵니다.



BPEL Process의 흐름을 보면 invokeCCStatusService 액티브에서 노란색 오로라를 뿜고 있습니다.

이 Invoke 부분에서 remote fault이 발생하여 사용자가 수동으로 처리를 해주기를 기다리고 있는 것입니다.



※ 여기서도 확인할 수 있습니다.



이제 validationForCC composite를 다시 살립시다.



위의 상태에서 "복구"를 누르거나 BPEL Process 추적 창에서 복구탭을 누르거나(방법은 좀 있는듯...) 해서 복구 탭으로 이동합니다.

에러 메시지 선택 후 복구 버튼을 클릭합니다.



예 클릭



정상적으로 에러가 없이 됐으면 아래와 같이 오류 메시지 목록에 아무것도 없습니다.



흐름 추적을 보변 2번째 복구(1번은 처음 실행시에 난 에러)에서 처리가 되어서 정상 처리가 끝까지 된 것을 확인할 수 있습니다.





Handle faults in BPEL

먼저 Database에서 작업을 하나 해줘야합니다. soademo/soademo로 들어가서 create_validate_cc.sql 스크립트를 실행해주세요.



CreditCardValidation Application - validationForCC Project - composite.xml 파일을 열어 편집합니다.

Database Adapter를 추가합니다.



Service name: validateCC



JNDI Name: eis/DB/soademoDatabase



Call a Stored Procedure or Function을 선택합니다.



Browse 버튼을 클릭합니다.



VALIDATECC를 선택합니다.



선택된 프로시저 확인 후 Next 클릭



Next



Finish



RouteReques(Mediator)와 validateCC(Database Adapter)를 연결합니다.



RouteReques(Mediator)를 더블 클릭하여 편집합니다.

getCreditValidation으로 가는 조건을 입력합니다.



not(starts-with($in.request/inp1:creditcardStatusRequest/inp1:CCNumber, '2'))

카드번호 맨 앞자리가 '2'로 시작하지 않는 조건입니다.



validateCC로 가는 조건도 입력합니다.

starts-with($in.request/inp1:creditcardStatusRequest/inp1:CCNumber, '2')

카드번호 맨 앞자리가 '2'로 시작하는 조건입니다.

validateCC로 가는 Transform 맵핑을 설정합니다.







validateCC에서 리턴받는 Transform 맵핑을 설정합니다.







모두 저장후 배치 합니다.

카드번호가 2로 시작하는 데이터를 입력합니다.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/ns/order">
        <ns1:PurchaseOrder>
            <ns1:CustID>1111</ns1:CustID>
            <ns1:ID>2222</ns1:ID>
            <ns1:productName>iPod shuffle</ns1:productName>
            <ns1:itemType>Electronics</ns1:itemType>
            <ns1:price>145</ns1:price>
            <ns1:quantity>30</ns1:quantity>
            <ns1:status>Initial</ns1:status>
            <ns1:ccType>Mastercard</ns1:ccType>
            <ns1:ccNumber>2234-1234-1234-1234</ns1:ccNumber>
        </ns1:PurchaseOrder>
    </soap:Body>
</soap:Envelope>

binding fault 에러가 발생했습니다.



BPEL 내에서 binding fault 에러를 제어 해봅시다.

approverLargeOrder(BPEL Process)를 편집합니다.



assignCCNumber(Assign) 액티브와 invokeCCStatusService(Invoke) 액티브 사이에 Scope 액티브를 추가합니다.



이름 부분을 더블 클릭 후 checkCC로 변경합니다.



Scope 액티브를 펼칩니다.



invokeCCStatusService(Invoke) 액티브를 Scope 액티브 안으로 넣습니다.



Scope 내의 아이콘중에 Add Catch Branch 아이콘을 클릭합니다.



추가된 Catch Branch를 펼칩니다.



Catch 아이콘을 더블 클릭합니다.



Browse Faults 버튼을 클릭합니다.



System Faults > bindingFault 을 선택합니다.



Fault Variable을 자동 생성합니다.



OK를 클릭합니다.



OK를 클릭합니다.



catch 영역 안에 Switch 액티브를 추가합니다.



<case> 의 조건을 입력합니다.



<case> 영역에 Assign 액티브를 추가합니다.



이름을 Assign_UNKNOWNCC로 변경 후 아이콘을 더블 클릭합니다.



From은 'UNKNOWN CC' 입력, To는 invokeCCStatusService_execute_OutputVariable - reply - creditcardStatus를 선택합니다.



<otherwise> 영역에 Throw 액티브를 추가합니다.



이름을 Throw_Binding_Fault로 변경 후 아이콘을 더블 클릭합니다.



Fault QName은 System Faults > bindingFault 선택 후 Fault Variable 오른쪽에 Browse Fault Variables.. 버튼을 클릭합니다.



catch 설정할 때 만들었던 FaultVar를 선택합니다.



OK 클릭



fault-policies.xml 파일을 열어 아래 내용을 추가합니다. (Step D.2.4.20 주석 아래에)

      <!-- Step D.2.4.20: Add your fault handler for binding fault here: -->
      <faultName xmlns:bpelx="http://schemas.oracle.com/bpel/extension" name="bpelx:bindingFault">
        <condition>
          <!-- Let the component handle this specific binding fault -->
          <test>$fault.code="20001"</test>
          <action ref="ora-rethrow-fault" />
        </condition>
      </faultName>

다시 카드번호가 '2'로 시작하는 데이터로 테스트 해보겠습니다.

getStatusByCC 서비스에서 에러는 났지만 approveLargeOrder(BPEL Process)는 정상적으로 완료 되었습니다.



감사 추적을 살펴보면 invokeCCStatusService 액티브에서 오류가 발생했고 catch 영역에서 에러를 처리했습니다.



BPEL에서 Scope는 Java의 try catch 역할도 합니다.



Using A Custom Java Fault Handler

이번에는 사용자가 직접 Java로 작성한 에러 처리를 적용해보겠습니다.

※ 에러처리에 사용할 예제 java 소스(jar)가 웹로직 서버 도메인의 lib 폴더에 있어야 합니다. 서버 실행중에 적용했다면 재시작!!

그리고 C:\po\log 폴더(웹로직 서버가 구동중인 컴퓨터입니다!!! 주의!)가 존재야 합니다.




fault-policies.xml 파일을 아래와 같이 수정합니다.

      <!-- Step D.2.4.20: Add your fault handler for binding fault here: -->
      <faultName xmlns:bpelx="http://schemas.oracle.com/bpel/extension" name="bpelx:bindingFault">
        <condition>
          <!-- Let the component handle this specific binding fault -->
          <test>$fault.code="20001"</test>
          <!-- <action ref="ora-rethrow-fault" /> -->
          <action ref="my-java-handler" />
        </condition>
      </faultName>

모두 저장 후 다시 배치. 카드 번호가 '2'로 시작하는 데이터로 테스트 해보겠습니다.

잘 처리 되었습니다.



soa console 에는 아래와 같이 출력됩니다.

MyFaultHanlder: Handle Fault
MyFaultHanlder: Properties
MyFaultHanlder: =================================================================
MyFaultHanlder: logFileName = myfaulthandler.log
MyFaultHanlder: logFileDir = c:\po\log

c:\po\log\myfaulthandler.log 파일을 열어보면 아래와 같습니다.

Fault Details
===============================================================
Fault Type ................ bpel
Poilcy ID ................. POProcessingFaults
Faulted Partner Link ...... getGreditCardStatus
Port Type ................. {http://oracle.com/sca/soapservice/CreditCardValidation/validationForCC/getStatusByCC}getGreditCardStatus



Handle Mediator Faults

Mediator에서 나는 에러를 처리해봅시다.

fault-policies,xml 을 아래와 같이 편집합니다. (Step D.2.6.1 주석 아래에 추가)

      <!-- Step D.2.6.1: Add your fault handler for mediator faults here: -->
      <faultName xmlns:medns="http://schemas.oracle.com/mediator/faults" name="medns:mediatorFault">
        <condition>
          <action ref="my-mediator-fault-handler" />
        </condition>
      </faultName>

Action을 하나 더 추가합니다. (Step D.2.6.2 주석 아래 추가)

      <!-- Step D.2.6.2: Add the Action definition for handling mediator fauls using custom java here:-->
      <Action id="my-mediator-fault-handler">
        <javaAction className="soatraining.faulthandling.MyFaultHandler"
            defaultAction="ora-terminate" propertySet="myMediatorProps">
            <returnValue value="OK" ref="ora-human-intervention" />
        </javaAction>
      </Action>

새로운 JavaAction에 사용되는 프로퍼티를 세팅합니다. (Step D.2.6.3 주석 아래 추가)

      <!-- Step D.2.6.3?: Add new property set for MyFaultHandler for logging Mediator faults here:-->
      <propertySet name="myMediatorProps">
        <property name="logFileName">mediator-faults.log</property>
        <property name="logFileDir">c:\po\log</property>
      </propertySet>

routePO(Mediator)를 수정합니다.



WriteApprovalResults 로 가는 라우팅을 병렬(Parallel)로 변경합니다.



Yes를 클릭합니다.



모두 저장 후 재배치합니다.

에러를 내기 위헤서 파일이 저장되는 폴더(C:\Temp)를 읽기 전용(쓰기 불가능)으로 만들겠습니다.

윈도우(Windows)의 경우
  - 읽기전용 설정
    > attrib +r c:\temp
  - 읽기전용 해제
    > attrib -r c:\temp
리눅스(Linux)의 경우
  - 읽기전용 설정
    $ chmod -w /temp
  - 읽기전용 해제
    $ chmod +w /temp 

이제 EM(Enterprise Manager)에서 테스트를 해봅시다.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/ns/order">
        <ns1:PurchaseOrder>
            <ns1:CustID>1111</ns1:CustID>
            <ns1:ID>2121</ns1:ID>
            <ns1:productName>Bluetooth Headset</ns1:productName>
            <ns1:itemType>Electronics</ns1:itemType>
            <ns1:price>49.99</ns1:price>
            <ns1:quantity>1</ns1:quantity>
            <ns1:status>Initial</ns1:status>
            <ns1:ccType>Mastercard</ns1:ccType>
            <ns1:ccNumber>8765-8765-8765-8765</ns1:ccNumber>
        </ns1:PurchaseOrder>
    </soap:Body>
</soap:Envelope>

메시지 흐름 추적을 보면 에러가 났습니다.



감사 추적을 보면 WriteApprovalResults.Write 부분에서 에러가 난것을 볼 수 있습니다.



C:\Temp 폴더의 읽기 전용을 해제 한뒤, 복구를 해봅시다.



예 클릭



복구 작업이 성공적으로 완료되었습니다.



다시 메시지 흐름 추적을 보면 재시도한 흔적(?)을 확인할 수 있습니다.







반응형
//

Chapter C - Unit Testing

Posted at 2010. 3. 2. 17:33 | Posted in Oracle Solution/PO Processing
반응형
Introduction

SOA composite 레벨에서 테스트를 할 수 있습니다.

아래 4가지 유닛 테스트를 해봅시다.

1. An inbound message for receivePO.
2. A simulation of a callback message returned by as service
3. An assertion to verify the order status at completion
4. An assertion the will always fail for the input we provided in this testcase



Create the Unit Test

프로젝트 - SOA Content - testsuites 에서 마우스 오른쪽 버튼 클릭 후 Create Test Suite 클릭




이름은 logic Test로 입력




생성될 파일 이름을 TestDelivery로 입력




Exposed Services와 External Reference 영역이 노란색으로 변경되었습니다.

Return to SOA composite diagram 버튼을 누르면 진짜 composite 화면으로 갑니다.





Set the inbound message

reveivePO를 더블클릭하거나 오른쪽 버튼 클릭 후 Create Initiate Messages를 클릭합니다.






request Part의 값을 입력합니다.




receivePO 그림에 파란색 화살표가 생겼습니다.




이번에는 getCreditCarStatus에서 approveLargeOrder로 리턴(return)이 항상 VALID가 나오게 해봅시다.

approveLargeOrder(BPEL Process)와 getCreditCardStatus(Web Service)를 연결하는 선을 더블 클릭합니다.



Emulates 탭에서 Emulate를 추가합니다.




Generate Sample 버튼을 클릭하면 아웃풋의 샘플이 나옵니다.

태그 사이의 값을 VALID로 수정합니다.




OK를 클릭합니다.




선이 변경되었습니다.





Set the assertion for success

routePO 에서 WriteApprovalResults 로 갈 때 상태(status) 내가 지정한 값과 같은지 검증합니다.

routePo(Mediator)와 WriteApprovalResults(File Adapter)를 연결하는 선을 더블 클릭합니다.




Asserts 탭에서 Assert를 추가합니다.




Assert Target 오른쪽의 Browse 버튼을 클릭합니다.




status를 선택합니다.




값을 approved 로 입력합니다.





Set the assertion for failure

이번에는 배송 처리할 때 고객ID(CustomerID)가 내가 지정한 값과 일치하는지 검증해봅시다.

approveLargeOrder와 FullfillementProcess를 연결하는 선을 더블 클릭합니다.




Assert를 추가합니다.




값은 9999를 입력합니다.




OK 클릭





Deploying the Application

배치합니다. 이번에는 혹시몰라 1.1 버젼으로 배치했습니다. ㄷㄷ





Testing the application

프로젝트(POProcessing [1.1]) 선택 후 단위 테스트 탭을 선택 후 실행을 클릭합니다.




테스트 실행 이름을 입력합니다.




테스트 실행의 결과 상태가 "실행 중"이면 테스트 상태 새로 고침을 버튼 클릭해서 상태를 갱신합니다.




상태가 "실패"로 나왔습니다.




아래쪽 검증 세부 정보를 보면 검증 결과가 나온 것을 확인할 수 있습니다.







반응형
//
반응형
Introduction





Surfacing binding properties at the composite level

File Adapter를 직접 수정하지 않고 프로퍼티만 설정해서 생성될 파일의 이름을 바꿔봅시다.

WriteApproval 레퍼런스(File Adapter)를 선택합니다.




레퍼런스(또는 Property Inspector) 패널에서 Binding Properties를 추가합니다.




Name은 FileNamingConvention을 선택하고 Value는 test_%SEQ%.xml을 입력합니다.




composite.xml을 Source 보기로 보면 아래와 같이 프로퍼티가 추가되었습니다.





Generating and validating a deployment plan

여치 계획 파일을 만들어서 배치할 때 여러가지 설정을 적용(변경)한 상태로 배치를 할 수 있습니다.

composite.xml 파일에서 마우스 오른쪽 버튼 클릭 후 Generate Config Plan을 클릭합니다.




생성할 파일 이름을 POProcessing_dev_cfgplan.xml 으로 설정 후 OK 클릭




아래의 위치에 텍스트를 추가합니다.

File Adapter 의 출력 파일명을 변경합니다.




아래의 위치에  텍스트를 추가합니다.

파일을 쓸 디렉토리의 위치를 변경합니다.




모두 저장 후 composite.xml 파일에서 오르쪽 버튼 클릭 후 Validate Config Plan을 클릭합니다.




configuration plan 파일을 선택합니다.




어떻게 바뀔 것인지 로그가 나옵니다.




서버에 디플로이 할때 아래와 같이 플랜 파일을 선택할 수 있습니다.





Testing

테스트를 해보면 주문 파일이 설정 플랜에서 설정한 대로 파일이 생성되는 것을 확인할 수 있습니다.



반응형
//
반응형
Introduction

배송정보를 JMS 큐(Queue)에 등록하겠습니다.

Chapter 1 에서 JMS 관련 서버 설정이 되어있어야 합니다.



Add the JMS adapters

JMS Adapter를 External References 영역에 추가합니다.



Name : JMS_USPS



Oracle Weblogic JMS를 선택합니다.



서버 커넥션을 선택합니다.



Define from operation and schema (specified later)를 선택합니다.



Produce Message를 선택합니다.



Browse... 를 클릭합니다.



demoFulfillmentQueue (queue)를 선택합니다.



JNDI Name : eis/QUeue/demo



browse 버튼을 클릭합니다.



fulfillment.xsd - Fulfillment 를 선택합니다.



Next 클릭



Finish 클릭




위와 같은 방법으로 JMS_UPS, JMS_FedEx를 추가로 만들어줍니다.

다 만든 후 FilfillmentProcess(BPEL Process)와 연결합니다.





Invoke the services from BPEL

FulfillmentProcess(BPEL Process)를 더블 클릭하여 편집합니다.



FulfillmentProcess(Business Rule 액티브) 아래에 Switch 액티브를 추가합니다.



Case를 2개 더 추가합니다.



<case> 부분을 더블 클릭합니다.



General 탭에서 Name은 USPS를 입력합니다.

Expression은 아래와 같이 입력합니다. (빌더를 이용하세요)



두번째 <case> 도 더블 클릭해서 UPS를 입력합니다.



세번째 <case>는  FedEx



<case USPS> 안에 Invoke 액티브를 추가합니다.




추가한 Invoke 액티브와 JMS_USPS 컴포넌트를 연결합니다.



이름은 Invoke_USPS를 입력하고, Input Variables 를 기본으로 추가합니다.



UPSFedEx도 마찬가지로 추가합니다.



Assign 액티브를 <case USPS> 영역 안의 Invoke_USPS 위에 추가합니다.



더블 클릭하여 편집합니다.



General 탭에서 이름을 Assign_USPS로 입력합니다.



Copy Operation을 아래와 같이 추가합니다.

UPSFedEx도 똑같이 추가합니다. (그래도 To는 틀려야겠죠? -_-)



<otherwish> 부분은 삭제합니다.



완성되었습니다.





Deploying and testing the application

배치 후 테스트 해보면 마지막에 JMS로 데이터가 간 것을 확인할 수 있습니다.



WebLogic Console로 접속해서 서비스 - 메시징 - JMS 모듈로 이동합니다.



SOAJMSModule을 클릭합니다.



demoFulfillmentQueue를 클릭합니다.



모니터링 탭에서 SOAJMSModule! demoFulfillmentQueue를 체크 후 메시지 표시를 클릭합니다.



들어온 메세지를 확인합니다.



데이터를 확인합니다.







반응형
//