1. 먼저 insert 관련 tutorial을 이용해 insert Service를 만든다.
2. insert service에 fault handling 을 추가할것이다.
먼저 insert.wsdl(자신이 처음에 insert관련 tutorial을 했을경우에 생성된 wsdl파일)을 열고
<import namespace="http://schemas.oracle.com/bpel/extension"
location="http://호스트명:포트번호/orabpel/xmllib/RuntimeFault.wsdl"/>
을 추가한다.
이것은 bindingFaults 의 메세지 타입을 정하기 위해 사용된다.
bindingFaults
- application 과 관련된 Fault이며 일반적으로 같은키(pk)의 데이타가 존재할때
insert시도시 발생하는 에러와 같은것이다.
이것은 BPEL Process에 의해 다뤄질수 있다.
remoteFaults
- system related, like trying to insert a row when the network or
database is temporarily unavailable. These can be retried automatically by
configuring your bpel.xml.
system과 관련된 Fault이며 query실행시 네티웍이나 database가 일시적으로 이용할수
없는 상태가 된 경우와 같다.
이것은 bpel.xml을 수정함으로써 자동적으로 재시도를 할수 있다.
<partnerLinkBinding name="BPELSamples">
<property name="wsdlLocation">insert.wsdl</property>
<property name="retryInterval">60</property> --> 재시도간격(60초마다)
<property name="retryMaxCount">60</property> --> 최대 60번까지만
</partnerLinkBinding>
3. scope activity를 drag & drop 한후에 invoke및 assign을 넣는다 (insert service생성시 만든것)
4. scope의 Add Catch Branch를 클릭후에 fault handler를 더블클릭 한다.
5. Set Namespace URI to: http://schemas.oracle.com/bpel/extension
6. Set Local Part: to bindingFault
7. Create the Fault Variable
- 2가지 방법이 있다.
- 첫번째 방법
type에 AdapterException 입력후 클릭... Browse Fault Variables은 클릭하지 않는다.
.bpel file을 열고 <variables> element 에
<variable name="AdapterException" messageType="bpelx:RuntimeFaultMessage"/> 을
입력한다.
- 두번째 방법
Browse Fault Variables를 클릭후에 Variables선택후 Create 버튼 클릭
name 에 AdapterException 입력
message types 선택하고 Browse Message Type 클릭
Type Explorer
Message Types
Partner Links
client
InsertWithCatch.wsdl
Imported WSDL
RuntimeFault.wsdl
Message Types
RuntimeFaultMessage
선택
8. fault handler안에 scope activity를 추가한후 case 더블클릭한다.
9. bpws:getVariableData('AdapterException','code') = '1' 입력
1은 ORA-00001의 1을 가리킨다.
duplicate insert
ORA-00001: unique constraint (SCOTT.MOVIES_PK1) violated
10. Scope안에 invoke를 양쪽에 추가한다.
11. 두개의 invoke를 생성한 partnerLink(DBAdapter)에 연결을 한다.
12. operation은 merge이며 변수는 자동생성이 아닌 기존에 invoke에서 사용한 변수를 이용한다.
- 원래 insert만 수행하는 invoke에 fault handling을 이용하여 동일 데이타 발생시
merge를 수행하게되며 fault handling을 사용안하고 그냥 merge만 사용하여 process를
생성하는것보다 수행속도 면에서 많은 이점을 얻을수 있다.
즉 3개의 invoke는 처음에 assign된 값을 이용해서만 DB와 통신을 하므로 처음에만
같은 변수를 이용해 사용한다.
13. (90%) Do insert
(10%) Try insert
Do merge
-perform existence check on each row (if check database on)
-read each row from the database
-perform an update or insert
vs.
(100%) Do merge
-perform existence check on each row (if check database on)
-read each row from the database (if exists)
-perform an update or insert
일반적으로 90%의 신규데이타는 insert를 수행하고 나머지 10%정도의
데이타는 merge(update)를 수행하므로 merge시에 생기는 속도및 perfomance는
100% 모두 merge하는것보다 성능에서 우월할수 있다.