Transform에서 for-each 주의사항!

Posted at 2010. 4. 29. 14:26 | Posted in Oracle Solution/BPEL
일반적으로 트랜스폼(Transform)에서 여러개의 데이터일 경우 for-each 컴포넌트를 이용하여 돌릴 수 있습니다.

하지만 내가 의도하지 않는 결과가 나올 때가 있습니다. ㅠ_ㅠ



아래는 입력과 출력의 XML 스키마입니다.



단순히 입력 받은 그대로를 출력하는 BPEL 입니다.



트랜스폼으로 처리 했습니다.

<sample> 태그의 수만큼 루프가 돌게 됩니다.





<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body xmlns:ns1="http://www.example.org">
    <ns1:request>
      <ns1:sample>  <!-- 1개 -->
        <ns1:seq>1</ns1:seq>
        <ns1:id>1</ns1:id>
        <ns1:data>data_1</ns1:data>
      </ns1:sample>
      <ns1:sample>  <!-- 2개 -->
        <ns1:seq>2</ns1:seq>
        <ns1:id>2</ns1:id>
        <ns1:data>data_2</ns1:data>
      </ns1:sample>
    </ns1:request>
  </soap:Body>
</soap:Envelope>

위와 같은 데이터를 입력하게 되면 아래와 같은 데이터가 나오게 됩니다.

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <env:Header>
    <wsa:MessageID>urn:231BE770534E11DFBFC6CF3D19573BDE</wsa:MessageID>
    <wsa:ReplyTo>
      <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
    </wsa:ReplyTo>
  </env:Header>
  <env:Body>
    <response xmlns:ns0="http://www.example.org" xmlns="http://www.example.org">
      <ns0:sample>
        <ns0:seq>1</ns0:seq>
        <ns0:id>1</ns0:id>
        <ns0:data>data_1</ns0:data>
      </ns0:sample>
      <ns0:sample>
        <ns0:seq>2</ns0:seq>
        <ns0:id>2</ns0:id>
        <ns0:data>data_2</ns0:data>
      </ns0:sample>
    </response>
  </env:Body>
</env:Envelope>

하지만!! 아래와 같이 의도하지 않은 결과가 나올때가 있습니다. ㅠ_ㅠ

갯수는 제대로 나왔는데 데이터가 1첫째의 데이터만 계속 반복해서 나옵니다.

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <env:Header>
    <wsa:MessageID>urn:71B1A920534D11DFBFC6CF3D19573BDE</wsa:MessageID>
    <wsa:ReplyTo>
      <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
    </wsa:ReplyTo>
  </env:Header>
  <env:Body>
    <response xmlns:ns0="http://www.example.org" xmlns="http://www.example.org">
      <ns0:sample>
        <ns0:seq>1</ns0:seq>
        <ns0:id>1</ns0:id>
        <ns0:data>data_1</ns0:data>
      </ns0:sample>
      <ns0:sample>
        <ns0:seq>1</ns0:seq>
        <ns0:id>1</ns0:id>
        <ns0:data>data_1</ns0:data>
        </ns0:sample>
    </response>
  </env:Body>
</env:Envelope>

Mapper 파일을 Source 모드로 보면 정상적인 for-each 가 적용되면 아래와 같이 됩니다.

  <xsl:template match="/">
    <ns0:response>
      <xsl:for-each select="/ns0:request/ns0:sample">
        <ns0:sample>
          <ns0:seq>
            <xsl:value-of select="ns0:seq"/>
          </ns0:seq>
          <ns0:id>
            <xsl:value-of select="ns0:id"/>
          </ns0:id>
          <ns0:data>
            <xsl:value-of select="ns0:data"/>
          </ns0:data>
        </ns0:sample>
      </xsl:for-each>
    </ns0:response>
  </xsl:template>

하지만 정상적으로 for-each가 안되는 소스를 보면 아래와 같이 되어있습니다.

  <xsl:template match="/">
    <ns0:response>
      <xsl:for-each select="/ns0:request/ns0:sample">
        <ns0:sample>
          <ns0:seq>
            <xsl:value-of select="/ns0:request/ns0:sample/ns0:seq"/>
          </ns0:seq>
          <ns0:id>
            <xsl:value-of select="/ns0:request/ns0:sample/ns0:id"/>
          </ns0:id>
          <ns0:data>
            <xsl:value-of select="/ns0:request/ns0:sample/ns0:data"/>
          </ns0:data>
        </ns0:sample>
      </xsl:for-each>
    </ns0:response>
  </xsl:template>

현재 JDeveloper 의 버그 같지만 이런 에러(?)가 안나게 하는 방법은 맵핑할 때 자동 맵핑(Auto Map)을 이용하거나, for-each 컴포넌트를 먼저 적용 한 후 선을 연결하면 됩니다.

선을 먼저 연결하고 for-each 컴포넌트를 적용하면 원하는 결과가 안나올 수 있습니다.

'Oracle Solution > BPEL' 카테고리의 다른 글

Transform에서 for-each 주의사항!  (1) 2010.04.29
프로젝트 구조가 이상해질 때!!!  (0) 2010.04.27
Database Adapter  (0) 2010.04.19
  1. 뭐라는 소리라는 거징 -_-;;;;; 이젠 제이디벨로퍼까지 마스터 하시는 당신.. 최고야!! 히힛-

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Database Adapter

Posted at 2010. 4. 19. 11:54 | Posted in Oracle Solution/BPEL
프로젝트를 하게 되면 가장 많이 사용하게 되는 것이 데이터베이스(이하 디비)입니다.

BPEL 에서는 디비에 CRUD[각주:1]를 하려면 Database Adapter(이하 DbApapter)라는 것을 사용합니다.

하지만.... 그냥 쓰면 되는 것은 아니고... DbAdapter를 하나 추가 하기 위해서 미리 설정을 해줘야 하는 것이 있습니다.

웹로직 콘솔에서 데이터소스(datasource)를 설정하고, 그 데이터소스를 사용하는 DbAdapter를 추가해야 실제로 배치(deploy) 했을 때 사용 가능합니다.



간단한 샘플로 어떻게 해야되는지 알아봅시당당당~

웹서비스로 유저 정보를 입력하면 Oracle과 Sql Server 2005 에 각각 Insert 하는 웹서비스(?)를 만들어보겠습니다.



스키마 파일입니다.

  

입력되는 필드는 아래와 같습니다.



※ 아래 예제를 하시려면 SOA Suite 설치 및 프로젝트 생성, 배치는 할줄 알아야 합니둥~ -_-;;



라이브러리(jar) 세팅

웹로직(Oracle WebLogic)에서 기본적인 jdbc 드라이버는 포함되어 있지만 Mssql용 jdbc 드라이버는 포함되어있지 않습니다.

그래서 jdbc 드라이버를 추가해야 합니다. 많은 방법이 있지만 저는 {도메인홈}\lib 디렉토리에 넣어두겠습니다.





웹로직 서버를 시작(재시작)핼 때 콘솔화면을 보면 아래와 같이 sqljdbc4.jar 파일이 클래스 패스에 포함된 걸 볼 수 있습니다.





데이터베이스 리소스(datasource) 생성

※ 데이터소스 생성에 관해서는 제 블로그의 다른 글에도 많이 있을 겁니다. ㄷㄷ

먼저 Oracle 10g 데이터소스를 생성하겠습니다.

웹로직 콘솔로 들어갑니다. 도메인 구조(메뉴)에서 서비스 - JDBC - 데이터 소스를 선택합니다.



새로 만들기를 클릭합니다.



이름, JNDI[각주:2] 이름, 데이터베이스 유형, 데이터베이스 드라이버를 설정합니다.

여기서 중요한게 JNDI 이름입니다. 이 이름으로 찾아서 리소스를 사용합니다.

다음을 클릭합니다.



트랜잭션을 설정합니다. XA 지원되는 jdbc 드라이버는 패스 됩니다. ㅋㅋ



디비 접속 정보를 설정합니다. 입력 후 다음을 클릭합니다.



구성 테스트를 클릭합니다.



"접속 테스트가 성공했습니다." 메시지가 나와야 정상입니다.

다음을 클릭합니다.



대상을 선택합니다. 꼭 대상을 선택해 줘야합니다.

soa_server1을 체크합니다.




SQL Server 20005 데이터 소스를 생성하겠습니다.

데이터 소스 목록에서 sampleOracle이 추가된 것을 볼 수 있습니다.

새로 만들기 클릭



이름, JNDI 이름, 데이터베이스 유형, 데이터베이스 드라이버를 설정합니다.

기본적으로 Mssql은 XA[각주:3]가 아니므로 XA가 아닌 드라이버를 선택했습니다.

다음 클릭



트랜잭선 설정입니다.

글로벌 트랜잭션 지원
체크 해제 합니다. 다음 클릭



접속 정보를 설정합니다.



구성 테스트를 클릭합니다.



다음을 클릭합니다.



대상을 soa_server1로 설정합니다.



sampleMssql(jdbc/sampleMssql), sampleOracle(jdbc/sampleOracle) 이 추가되었습니다.




DbAdapter 설정

BPEL 에서 디비에 접근하려면 DbAdapter 를 통해서 해야합니다.

왼쪽 트리 메뉴에서 배치를 클릭합니다.



배치 목록에서 DbAdapter를 클릭합니다.



구성 탭을 클릭합니다.



아웃바운드 접속 풀 탭을 클릭합니다.



목록 테이블에서 새로 만들기를 클릭합니다.



javax.resource.cci.ConnectionFactory를 선택하고 다음을 클릭합니다.



JNDI 이름에 eis/DB/sampleOrcle을 입력합니다.

이 JNDI 이름이 JDeveloper 에서 사용할 이름입니다. 왕중요!!



처음 설정할 때 배치 계획 파일을 어디에 저장할 것인지 물어봅니다.

저는 {SOA홈}\soa\DBPlan 디렉토리에 저장하겠습니다. (DBPlan 디렉토리는 미리 만들었습니다.)

DBPlan 을 선택합니다.



확인을 클릭합니다.



정상 처리 메세지를 확인하시고, 배치 계획 경로도 확인해주세요~




다시 배치 - DbAdapter - 구성 - 아웃바운드 접속 풀 까지 이동합니다.

새로 만들기 클릭



그거.. 선택 후 다음 클릭



JNDI 이름으로 eis/DB/sampleMssql 입력합니다.



또! 다시 배치 - DbAdapter - 구성 - 아웃바운드 접속 풀 까지 합니다.

목록 테이블에 두개가 추가된 것을 볼 수 있습니다.

오라클꺼 먼저 설정 해봅시다.

javax.resource.cci.ConnectionFactory 앞에 +를 눌러 확장합니다.

eis/DB/sampleOracle을 선택합니다.



속성 테이블에서 맨 아래 xaDataSourceName의 속성값 부분 공간을 클릭합니다.



그러면 input이 생겨납니다. 우와왕~

여기에 jdbc/sampleOracle을 입력한 후 엔터를 입력합니다.



저장 클릭



잘 저장 되었다고 나옵니다. ㄷㄷ



이번에는 eis/DB/sampleMssql 클릭



현재 Mssql은 XA가 아니므로 dataSourceName에 jdbc/sampleMssql을 입력합니다.

platformClassName
을 변경해야 합니다. 현재 입력되어있는 속성값은 딱 봐도 Oracle10 용임을 알 수 있습니다.



oracle.toplink.platform.database.SQLServerPlatform 을 입력합니다.

다른 platformClassName은 아래 링크를 참조해주세요~

http://download.oracle.com/docs/cd/E12839_01/integration.1111/e10231/adptr_db.htm#CHDDDJAG



저장을 클릭합니다.



배치 목록에서 DbAdapter를 선택(체크박스 선택)하고 갱신을 클릭합니다.



완료를 클릭합니다.



성공적으로 갱신되었다는 메세지 확인



이제 JDeveloper 에서 디비 어댑터(Database Adapter)를 사용할 준비가 되었습니다.

JDeveloper에서 먼저 설정하고 콘솔에서 데이터소스와 DbAdapter를 설정해도 됩니다.

위에서 설정한 데이터소스와 DbAdapter는 실제 어플리케이션이 배치(Deploy)되서 돌아갈 때 사용하니까요~


Working JDeveloper

Database Addpater를 External Refereneces 영역에 드래그 앤 드랍 합니다.



서비스 이름(Service Name)을 지정합니다. 저는 그냥 테이블 이름을 했습니다.



현재 JDeveloper에서 사용할 접속 정보를 설정합니다.

커낵션(Connection) 오른쪽에 데이터베이스 커낵션 생성 버튼(녹색 +)을 클릭합니다.



커낵션 정보를 입력 후 Test Connection 버튼을 클릭했을 때 "Success!" 가 나와야 합니다.

OK 버튼을 클릭합니다.



커낵션을 추가(한번 추가했으면 앞으로는 선택하겠죠..)했을때의 모습니다.

아래 JNDI Name 이 eis/DB/{커낵션명} 으로 자동 작성되어있는 걸 볼 수 있습니다.

파란선을 기준으로 위쪽은 JDeveloper에서 설정할떄 쓰는 커낵션 정보이고, 아래 JNDI Name이나 Data Source는 실제 배치 되었을 때 참조하는 리소스 입니다.

그러므로 JDeveloper에서의 접송 정보와 위에서 했던 DataSource, DbAdpater 설정이 일치해야 합니다.

JNDI Name 이 위에서 설정한 DbAdapter 이름이어야 한다는게 감이 오시졈? ㄷㄷ

Next 버튼을 클릭합니다.



데이터베이스에 접속해서 뭘 할지 설정합니다. -_-

딱 보면 뭔지 알 수 있습니다.

Poll for New or Changed Records in a Table 은 테이블을 지속적으로 읽어들여 변화가 있을 떄 이벤트가 일어납니다.

Execute Pure SQL 은 사용자 쿼리 입니다.



테이블을 선택합니다. Import Tables 클릭



Query 버튼을 클릭하면 Available 영역에 테이블 목록이 조회됩니다.

테이블을 선택하고 오른쪽으로 가는 화살표 버튼을 클릭하여 선택합니다.



테이블이 선택된 것을 확인하시고 Next 버튼을 클릭합니다.



※ 임포트한 테이블에 기본키(Primary Key)가 없을 경우 기본키를 지정하는 단계가 나옵니다.

관계(Relationships)를 설정합니다. 일단 그런거 없으니 패스



사용할 필드를 설정합니다. 전 다 쓸겁니다. Next 클릭



고급 설정입니다.

시퀀스 설정(Sql Server의 Identity도 되더군용) 이라든지 이것 저것 설정할 수 있습니다.

그냥 Next 클릭 ㄷㄷ



Finish 클릭



Database Adapter(Oracle 꺼)가 하나 생성되었습니다.

이제 Mssql 꺼를 하나 더 만듭시다~





Mssql 커낵션을 추가합시다.



오라클이 아닌 다른 디비는 jdbc 드라이버를 설정해줘야 합니다.

Library 오른쪽이 Browse 클릭



New 클릭



Add Entry 클릭



jdbc 드라이버를 선택합니다.



라이브러리 이름(Libary Name)을 지정하고 OK 클릭



라이브러리가 추가 되었습니다. OK 클릭



Test Connection 버튼을 클릭하면 "Success!" 메세지가 나와야합니다.

만약 라이브러리를 설정 한하면 클래스가 없다느니 뭐라고 에러가 날겁니다. ㅎㅎ



다음 단계는 위의 Oracle 설정과 같습니다.





이제 요청(request) XML 구조를 만들어 봅시다.

xsd 폴더에서 마우스 오른쪽 버튼 클릭 후 New 클릭



All Technologies 탭에서 General - XML 에서 XML Schema를 선택합니다.



파일 이름(File Name)을 입력합니다.

보통 xsd 폴더에 저장하니 폴더도 확인 (꼭 xsd 폴더에 없어도 됩니당)



처음 만들게 되면 "exampleElement" 엘리먼트 하나만 만들어져 있습니다.

exampleElement 선택 후 오른쪽 컴포넌트 팔레트(Component Palette)에서 시퀀스(sequence)를 클릭합니다.

그러면 시퀀스가 하나 추가되고 추가된 시퀀스가 선택되어 있습니다.



엘리먼트(element)를 클릭합니다.

그러면 시퀀스 다음에 엘리먼트가 추가됩니다.



전에 추가된 시퀀스를 선택하고 다시 엘리먼트를 클릭합니다.



이렇게 엘리먼트 7개를 추가합니다.

뭐 드래그를 해도 되고 소스 편집을 해도 되고 방법은 많으니 직접 해보세용~



추가된 엘리먼트를 선택 후 오른쪽 아래에 속성 부분에서 이름(name)을 변경하시거나 엘리먼트를 더블클릭해서 이름을 바꿉니다.



그 후 다시 속성 부분에서 타입(type)을 입력합니다.



아래와 같이 7개의 엘리먼트를 완성합니다.

저장합니다.



Mediator 컴포넌트를 Components 영역에 드래그 앤 드랍합니다.



이름(Name)을 입력하고 템플릿(Template)은 One Way Interface(단방향)를 선택합니다.

Input은 방근전 만들었던 input을 선택합니다. 돋보기 버튼 클릭



Project Schema Files - input.xsd - exampleElement 를 선택합니다.



OK 클릭



RouteUser(Mediator)와 User(Database Adapter)를 연결합니다.



RouteUser와 TblUser를 연결합니다.



RouteUser(Mediator)를 더블 클릭하여 수정합니다.



아래에 보면 두개의 라우팅(Static Routing)이 있습니다.

각각 User와 UblUser로 가는 겁니다.

첫번째. User로 가는 데이터를 설정합시다. Transform Using 오른쪽의 맵핑 설정 버튼을 클릭하빈다.



Create New Mapper File을 선택합니다.



아래와 같이 선을 연결합니다.

그리고 String Functions 그룹에서 concat 컴포넌트를 가운데 영역에 드래그 앤 드랍합니다.



inp1:zipcode 와 inp1:address 를 차례로 concat 컴포넌트에 연결하고 top:addr 과 concat 컴포넌트와 연결합니다.

concat 컴포넌트를 더블클릭하여 수정합니다.



Add 버튼을 이용하여 파라메터(parameter)를 추가 한 후 공백(" ")을 넣습니다.



Date Functions 그룹에 current-dateTime 컴포넌트를 가운데 영역에 드래그 앤 드랍한 후, top:wdate 와 연결합니다.



이번에는 두번쨰 연결인 TblUser 와의 연결을 설정합시다.







모두 저장합니다.



배치(Deply) 및 테스트

배치 합니다.



테스트 합시다.



입력 후 오른쪽 아래 웹 서비스 테스트를 클릭합니다.



성공(?) 했습니다.

메시지 흐름 추적 실행을 클릭합니다.



RouteUser 를 거쳐서 User, TblUser 로 실행된 것을 볼 수 있습니다.

RouteUser를 클릭합니다.



Mediator에서 무슨일이 일어났는지 볼 수 있습니다.

페이로드를 확장하면 이동하는 데이터(XML)를 볼 수 있습니다.



데이터베이스를 확인해보면 입력한 정보가 각각 테이블에 들어가 있습니다. 와아~ -_-v





  1. C: Create, R: Retrieve(Read), U: Update, D: Delete [본문으로]
  2. Jana Naming and Directory Interface: 이름을 사용해서 객체나 객체에 대한 레퍼런스를 발견할 수 있는 방법을 제공한다. 어플리케이션 개발자는 네이밍 서비스에 이름을 사용하여 객체를 바인딩함으로써 객체에 이름을 부여하게 된다. 이후 코드에서는 글 이름을 사용하여 바인딩 된 객체를 참조할 수 있게 된다. [본문으로]
  3. XA방식의 트랜잭션이란 여러개의 데이터베이스, JMS, 또는 그 외의 리소스들간의 트랜잭션을 보장하는것을 말하고 NonXA방식이란 일반적인 한개의 데이터베이스에서 관리되는 트랜잭션을 말한다. [본문으로]

'Oracle Solution > BPEL' 카테고리의 다른 글

Transform에서 for-each 주의사항!  (1) 2010.04.29
프로젝트 구조가 이상해질 때!!!  (0) 2010.04.27
Database Adapter  (0) 2010.04.19

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

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

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



tag: BPEL, oracle, SOA

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

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를 체크 후 메시지 표시를 클릭합니다.



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



데이터를 확인합니다.







tag: BPEL, oracle, SOA

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Chapter 8 - Adding Fulfillment

Posted at 2010. 3. 2. 16:55 | Posted in Oracle Solution/PO Processing
Introduction

배송을 처리하는 BPEL Process 와 Business Rule 를 추가하여 봅시다.

1000원 이하는 USPS, 1000~5000원은 UPS, 5000원 초과는 FedEx 로 배송 처리합니다.



Add a BPEL Process and a Business Rule


BPEL Process 를 Components 영역에 추가합니다.




Name : FulfillmentProcess
Template: Asynchronous BPEL Process
Service Name : fulfillmentprocess_client
Expose as a SOAP service 체크 해제

Input 오른쪽의 찾기 버튼 클릭




Import 클릭






파일을 불러옵니다.






Fufillment 를 선택합니다.




Output 은 CarrierSelection 를 선택합니다.




Input 과 Output 확인 후 OK 클릭




Business Rule 컴포넌트를 Components 영역에 추가합니다.




Genral 탭에서

Name : FulfillmentRules
Package : fulfillmentrules

Input 을 추가합니다.




Fulfillment를 선택합니다.




이어서 Output을 추가합니다.




CarrierSelection을 선택합니다.



Advanced 탭에서 Service Name에 OracleRulesFulfillment 입력 후 OK를 클릭합니다.



approveLargeOrder와 FulfillmentProcess를 연결합니다.




FulfillmentProcess와 FulfillmentRules를 연결합니다.





Define the Business Rule

FulfillmentRules(Business Rule) 컴포넌트를 더블클릭하여 편집합니다.





왼쪽 메뉴에서 Bucketsets을 클릭합니다.



List of Ranges 를 추가합니다.



아이콘을 더블클릭하여 편집창을 띄웁니다.



Name은 OrderTotal, Data Type는 double 선택. 녹색 플러스 버튼을 클릭하여 아래와 같이 입력합니다.



왼쪽 메뉴에서 Facts를 클릭 한 후, 목록에서 FulfillmentType을 수정합니다.



total의 Bucketset을 OrderTotal로 설정합니다.



왼쪽 메뉴에서 Ruleset_1을 선택 후 Create Decision Table을 클릭합니다.



<insert condition> 부분을 클릭합니다.



<edit condition> 부분을 더블 클릭하고 FulfillmentType.total을 선택합니다.



R1 셀을 클릭 후 small을 선택합니다.



Rule을 추가합니다.



R2 셀에 large,를 선택합니다.

다시 Rule 추가 후 R3 셀에 xtralarge를 선택합니다.



Actions 부분에 Assert를 추가합니다.



assert new를 더블 클릭합니다.




Facts는 CarrierSelection을 선택하고 Parameterized를 체크합니다. 그리고 Always Selected를 체크합니다.

OK를 클릭합니다.



small의 액션에 CarrierValue.UPS를 선택합니다.



large에는 CarrierValue.UPS, xtralarge는 CarrierValue.FED_EX를 선택합니다.





Define the BPEL Process

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



Business Rule
액티브를 추가합니다.



이름은 FulfillmentProcess를 입력, Dictionary는 FilfillmentRules를 선택합니다.

Assign Input Facts 탭에서 Assign을 추가합니다.



아래와 같이 선택합니다.



Assign Output Facts 탭에서 Assign을 생성합니다.





OK를 클릭합니다.





Invoke FulfillmentProcess

approveLargeOrder(BPEL Process를 더블 클릭합니다.



Invoke 액티브를 ManualPOApproval_1이 있는 Switch 액티브 아래에 추가합니다.



추가한 Invoke 액티브와 FufillmentProcess(BPEL Process) 컴포넌트와 연결합니다.

Name : Invoke_Fulfillment

Input Variable을 기본 이름으로 추가합니다.



Transform 액티브를 Invoke_Fulfillment 액티브 위에 추가합니다.



추가한 Transform 액티브를 더블 클릭하여 편집합니다.



Source Variable 은 inputVariablepayload를 선택합니다.



Target Variable은 Invoke_Fulfillment_process_InputVariablepayload를 선택합니다.

Create Mapping 버튼을 클릭합니다.



customerIdorderId를 매핑합니다.



Mathematical Functions - multiply 을 가운데 영역에 추가합니다.

그리고 priceqty를 추가한 multiply과 연결하고, totalmultiply과 연결합니다.



Switch 액티브를 Invoke_Fulfillment 액티브 바로 액티브 아래에 추가합니다.



Sequence 액티브를 Switch 액티브의 <case> 영역 안에 추가합니다.



Transform_1을 추가한 Sequence 안으로 옮깁니다.



Invoke_Fulfillment를 Sequence안 Transform_1 아래로 옮깁니다.



<case>의 조건을 아래와 같이 설정합니다. (XPath Expression Builder 를 이용하세요)



<other wish> 부분은 삭제합니다.





routePO를 더블 클릭하여 수정합니다.



static routing rule을 추가합니다.



Service 클릭



타겟 서비스를 선택합니다.



맵핑을 선택합니다.



맵핑파일을 생성합니다.



아래와 같이 맵핑 합니다.



Mediator 설정에서 FulfillmentProcess로 가는 조건을 추가합니다.





모두 저장합니다~ 완성되었습니다.





Deploying and testing the application

테스트를 해보면 배송 처리가 된 것을 확인할 수 있습니다.







tag: BPEL, oracle, SOA

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Chapter 6 - Modifying the Mediator

Posted at 2010. 2. 10. 09:55 | Posted in Oracle Solution/PO Processing
Introduction

큰 주문(>1000)일 때는 BPEL 프로세서를 타면서 승인/거부 처리 하지만, 작은 주문일 때는 BPEL 프로세서를 타지 않아서 status가 Initial로 나옵니다.

그래서 작은 주문일 경우 무조건 승인(approved) 처리가 되게 해줍시다.



Modifying the application

routePO(Mediator) 더블 클릭




WriteApprovalResults::Write 가는 스태틱 라우팅(Static Routing) 부분의 트랜스폼(Transform Using)을 수정합니다.




수정(Edit) 클릭




PurchaseOrdr - status 에서 Order - status 로 가는 선을 삭제 합니다.




Order - status 에서 마우스 오른쪽 버튼 클릭 후 Set Text - Enter Text




"approve"를 입력합니다.




노란색 배경의 [T] 를 확인 하세요





Deploying and testing the application

배치 후 작은 주문(1000원 미만)을 테스트 합니다.








tag: BPEL, oracle, SOA

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Chapter 5 - Adding Human Workflow

Posted at 2010. 2. 5. 15:32 | Posted in Oracle Solution/PO Processing
Introduction

전 튜토리얼에서 금액이 1,000원이 넘으면 카드상태를 체크하는 BPEL 처리까지 만들어봤습니다.

<< Chapter 4. 까지 완성된 SOA >>

이번에는 1,000원이 넘고 카드상태가 정상(VALID)이면 관리자(?)의 수동 승인을 거치는 작업을 만들어 보겠습니다.



나름대로 정리해봤는데 -_- 맞나? ㄷㄷ;;



Adding a Human Task to the composite

composite에서 Human Task 컴포넌트를 Components 영역에 드래그 앤 드랍 합니다.




Name : ManualPOApproval

Create Composite Service width SOAP bindings 체크 해제




ManaualPOApproval과 approveLargeOrder를 연결합니다.




ManualPOApproval 컴포넌트를 더블 클릭합니다.




General 탭에서

Title : <%'Approve Order'%>
Description : Manual approval task for large orders



Data 탭에서 + 버튼 - Add other payload 클릭



Element 선택하고 오른쪽에 돋보기 버튼 클릭



internalorder.xsd - Order 선택



Editable via worklist 체크 합니다.



Assignment 탭에서 <Edit participant> 더블 클릭합니다.



Type : Single
Label : Large Order Approver

+ 버튼 - Add User 클릭



Identification Type : User
Data Type : By Name
value : weblogic



모두 저장 합니다.



Calling the Human Task from BPEL

이번에는 approvLargeOrder(BPEL Process)를 더블 클릭해서 편집합니다.




assignApproval 액티브 아래에 Human Task 컴포넌트를 드래그 앤 드랍 합니다.




Task Definition : ManualPOApproval
Task Title : Approve Order

오른쪽에 [...] 버튼을 클릭합니다.




Variables - Process - Variables - outputVariable - payload - Order 선택




OK 클릭




그림고 같이 ManualPOApproval_1 과 taskSwitch 두개의 액티브가 생겼습니다.

taskSwitch 를 확장합니다.




3가지의 조건이 나옵니다.




assignApproval을 <case Task outcome is APPROVE> 영역 Assign 아래로 이동시킵니다.




<case Task outcome is REJECT> 영역의 CopyPayloadForTask 더블 클릭




+ 버튼 - Copy Operation 클릭




'rejected'를 세팅 합니다.






<otherwise Task is outcome is EXPIRED, STALE, WITHDRAWN, or ERRORED> 영역의 Assign 에는 'expired' 를 세팅합니다.











Creating the Task form for task details

POPrecessing 어플리케이션에서 새로운 프로젝트 생성




Generic Project 선택



Project Name : ApproveTaskDetails

Project Technologies 선택하지 않고 Finish



ApproveTaskDetails 에서 마우스 오른쪽 버튼 - New



Web Tier - JSF 선택

ADF Task Flow Based on Human Task 선택

OK 클릭




POProcessing 디렉토리의 ManualPOApproval.task 선택




기본으로 두고 OK



ADF 파일들이 생성되었습니다.



taskDetails1_.jspx 더블 클릭



OK 클릭



Data Controls 색션에 있는 Task를 오른쪽 공간에 드래그 앤 드랍 합니다.




메뉴가 나오는데 Human Task - Complete Task with Payload 선택







짜잔! 페이지가 만들어졌습니다 우왕~



모두 저장합니다.



Deploying the application

POProcessing는 하던대로 배치합니다.

ApproveTaskDetails을 배치할때는 어플리케이션 메뉴를 이용해야 되더군요..











Testing the application

주문 가격이 1,000원이 넘고 카드상태가 정상인 데이터를 넣어봅니다.



메시지 흐름 추적 실행 클릭

※ 아직 이 흐름추적 실행 할 수 있는 페이지에서 다른곳으로 이동 하지 마세용~



추적에서 보면 ManualPOApproval 에서 실행 중 상태인 것을 볼 수 있습니다. ㄷㄷ



BPM에 접속한 후 받은 편지함에 보면 주문(?)이 들어와 있습니다.



세부 정보 확인 후 승인 또는 거부 할 수 있습니다.



승인 후 EM으로 와서 추적을 다시 해보면 처리가 완료된 것을 확인할 수 있습니다.



승인 처리된 파일을 보면 status가 approved가 되었습니다.



거부 처리된 파일을 보면 status가 rejected인 것을 확인할 수 있습니다.



이번에는 취소 처리를 하겠습니다.




status가 expired가 되었습니다.







tag: BPEL, oracle, SOA

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Chapter 4 - BPEL Orchestration

Posted at 2010. 2. 4. 15:47 | Posted in Oracle Solution/PO Processing
Introduction

이 앞으로도 마찬가지지만 전에 했던 튜토리얼이 배치까지 완료가 되어있어야합니다.

전 튜토리얼에 이어서 총액이 1000원이 넘으면 카드번호로 상태를 검사하는 BPEL 을 추가해보겠습니다.

대충 흐름을 보자면 이러겠네요...



이번 튜토리얼에서 추가되는것은 BPEL 과 전전 튜토리얼에서 만들었던 DbAdapter를 사용하게 됩니다.

그리고 Mediator를 수정합니다.



Invoking the CreditCardStatus service

Web Service 컴포넌트를 External References 영역에 드래그 앤 드랍 합니다.



Name : getGreditCardStatus

WSDL URL 오른쪽에 Find existing WSDLs 버튼 클릭



현재 실행되고 있는 어플리케이션 서버에서 validationForCC - getStatusByCC 를 선택합니다.



WSDL URL 확인하시구 OK 클릭



BPEL Process 컴포넌트를 Components 영역이 드래그 앤 드랍 합니다.




Name : approveLargeOrder
Template : Asynchronous BPEL Process
Expose as a SOAP service 체크 해제

Input 오른쪽의 Browse Input Elements 버튼 클릭




Project Schema Files - internalorder.xsd - Order 선택




Input 엘리먼트 확인 하시고 Output도 똑같이 Order를 선택합니다.






OK 클릭




ApproveLargeOrdergetCreditCardStatus연결합니다.




ApproveLargeOrder 더블 클릭





Designing the BPEL approval process

Invoke 액티브를 receiveInput 과 callbackClient 사이에 드래그 앤 드랍 합니다.

Invoke 액티브는 외부의 서비스를 실행하는 역할을 합니다.




Invoke_1 과 getCreditCardStatus 를 연결합니다.




Name : invokeCCStatusService

Input 오른쪽의 Automatically Create Input Variable 버튼 클릭




OK 클릭




Output 도 마찬가지로....






OK 클릭




Assign 액티브를 receiveInput 아래에 드래그 앤 드랍 합니다.

Assign 액티브는 값을 연결(전달? 매핑?)해주는 역할을 합니다.




Assign_1 더블 클릭




General 탭에서 Name : assignCCNumber




Copy Operation 탭에서

+ 버튼 - Copy Operation 클릭




From은 Variables - Process - Variables - inputVarable - payload - ns2:Order - creditCardInfo - cardNumber 선택

To는 Variables - Process - Variables - invokeCCStatusService_execute_InputVariable - request - creditcardStatusRequest - CCNumber 선택




다시 한번 + 버튼 - Copy Operation 클릭




Form은 Variables - Process - Variables - inputVariable - payload - Order 선택

To는 Variables - Process - Variables - outputVariable - payload - Order 선택




2개 등록된거 확인하시구 OK




Switch 액티브를 invokeCCStatusService 아래에 드래그 앤 드랍 합니다.




+ 를 클릭합니다.




View Condition Expression을 클릭합니다.




조건문을 입력할수 있는 텍스트창이 나오는데 Xpath Expression Builder 버튼을 클릭합니다.




BPEL Variables 부분의 변수명을 더블클릭하거나 선택 후 Inert Into Expression 을 클릭하면

조건문을 입력하는 텍스트에 변수명이 찍힙니다.

그 후 " = 'VALID' " 를 추가합니다.

bpws:getVariableData('invokeCCStatusService_execute_OutputVariable','reply','/ns3:creditcardStatus') = 'VALID'




조건이 입력되었습니다. 바깥 영역을 클릭하여 Condition Expression 창을 닫습니다.




Assign 액티브를 스위치문의 <case>영역(참)에 드래그 앤 드랍 합니다.




Assign_1 더블 클릭




General 탭에 Name : assignApproval




Copt Operation 탭에서 + 버튼 - Copy Operation 클릭




From 에서 Type : Expression 선택. Expression : 'approved' 입력




확인 하시구 OK 클릭




이번에는 Assign 액티브를 <otherwise>영역(거짓)에 드래그 앤 드랍 합니다.




Assign_1 더블 클릭




General 탭에서 Name : assignInvalidCC

이번에는 'invalidCreditCard'를 세팅 합니다.










Validate Process를 클릭합니다.

정상적으로 작성되었으면 느낌표(경고 표시)가 사라집니다.





Modifying the Mediator component

routePO(Mediator)와 approveLargeOrder(BPEL Process)를 연결합니다.




routePO 더블 클릭




첫번째 라우팅 부분에 필터 조건을 추가합니다. Invoke Expression Builder 버튼 클릭




조건문을 작성합니다.

($in.request/inp1:PurchaseOrder/inp1:price * $in.request/inp1:PurchaseOrder/inp1:quantity) < 1000 




첫번째 라우팅에 조건 들어간것 확인하시구 두번째 라우팅에 조건을 추가합니다.




조건문을 작성합니다.

($in.request/inp1:PurchaseOrder/inp1:price * $in.request/inp1:PurchaseOrder/inp1:quantity) >= 1000




두번째 라우팅의 조건 확인하시구 콜백(Callback) 받을 타겟을 지정합니다.

Browse for target service operations 버튼 클릭




Service 선택




SOAComposite1(이거 원래.. POProecssing 여야 되는데.. -_-) - References - WriteApprovalResults - Write 선택




두번째 라우팅의 값 매핑을 세팅합시다.




Create New Mapper File 선택




[inp1:PurchasseOrder]를 [inpt1:Order]로 드래그 앤 드랍 합니다.




자동 매핑합니다. OK




자동으로 매핑 되었습니다.




이번에는 콜백될 때 값들을 매핑합시다.




Create New Mapper File 선택




마찬가지로 자동 매핑합니다.









Deploying the application

배치는 여기를 봐주세요



Testing the application

POProcess 선택



테스트 클릭





1,000원이 넘는 주문을 입력합니다.



일단 에러는 없이 잘 됐군요... 추적!!!!!



원하는대로 잘 실행된 것을 볼 수 있습니다.

approveLargeOrder를 클릭합니다.



BPEL 프로세스 에서 값이 어떻게 전달 되었는지 볼 수 있습니다.

getCreditCardStatus에 CCNumber를 넣어줘서 VALID가 출력으로 나온 것을 볼 수 있습니다.

그리고 Switch 에 주문 상태(status)가 approved인 것도 볼 수 있습니다.



※ BPEL Process는 "흐름"탭을 클립해서 보면 아이콘으로 흐름이 나와서 더 쉽게 볼 수 있습니다.



아이콘을 클릭하면 입력, 출력 값을 확인할 수 있습니다.




이어서 C:\TEMP(File Adapter 만들때 지정했던 저장 폴더)에 생성된 파일을 열어보면 아래와 같이 내용이 들어있습니다.



이번에는 똑같지만 승인되지 않은 카드번호를 입력하겠습니다.



getCreditCardStatus 결과로 INVALID가 떨어졌군요.

그리고 주문 상태(status)는 invalidCreditCard가 되었습니다.



저장된 파일을 열어봅시다.



이번에는 그냥 1,000원이 안넘는 주문입니다.



BPEL 프로세스를 타지 않고 바로 파일로 기록됩니다.



저장된 파일







tag: BPEL, oracle, SOA

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Introduction

이번 튜토리얼에서는 File Adapter 를 이용하여 주문(PO) 요청를 파일로 기록하는 서비스를 만들어보겠습니다.



Creating a new application

File - New 또는 어플리케이션 리스트에서 New Application을 선택합니다.




Application Name : POProcessing




Project Name : POProcessing
Project Technologies : SOA




Finish 클릭





Adding the service interface

Web Service 컴포넌트를 Exposed Services 영역에 드래그 앤 드랍합니다.




Name : receivePO

WSDL URL 오른쪽의 Generate(톱니모양) 버튼 클릭




Request 탭에서 URL 오른쪽의 browse(돋보기모양) 버튼 클릭




상단 오른쪽의 Import Schema File 버튼 클릭





파일을 선택





Maintain original directory structure for imported files 채크 해제




PurchaseOrder 선택




OK 클릭. 여기서는 Reply, Fault 을 지정 안합니다.





Adding the routing component

Mediator 컴포넌트를 Components 영역에 드래그 앤 드랍 합니다.




Name : routePO
Template : Define Interface Later





Adding the File Adapter

File Adapter 컴포넌트를 External References 영억에 드래그 앤 드랍 합니다.




Service Name : WriteApprovalResults




Define from operation and schema (specified later) 선택




Write File 선택




파일 저장 위치와 저장할 이름 패턴을 지전합니다.

파일 패턴에서 %를 입력하면 가능한 패턴이 콤보로 나오게 됩니다.

※ 여기서 주의할 점음 경로(Directory)를 설정하실 때, 서버(WebLogic)가 깔린 PC가 기준입니다.

자기 컴퓨터에 JDeveloper와 서버가 다 깔려있다면 신경 안쓰고 해도 되지만, 개발PC와 서버PC가 다르면 서버PC가 기준이 됩니다.




어떤 내용으로 저장할지 지정합니다.

URL 오른쪽의 browse(돋보기) 버튼 클릭




상단 오른쪽의 Import Schema File 버튼 클릭





파일을 선택합니다.




Maintain original directory structure for imported files 체크 해제




Order 선택



다음...




Finish...





Wiring the components and adding a transformation

receivePO 와 routePO 를 연결합니다.




routePO 와 WriteApprovalResults 를 연결합니다.




routePO 를 더블 클릭합니다.




Select an existing mapper 버튼 클릭




Create New Mapper File 선택




receivePO의 inp1:PurchaseOrder 를 WriteApprovalResults의 inp1:Order 로 드래그 앤 드랍 합니다.




자동 매핑 설정 창이 나옵니다.

Match Elements Considering their Ancestor Names 체크 해제

Hide Dictionaries 클릭 후 Add 버튼 클릭해서



파일 선택




그러면 xml 파일의 설정에 따라 매핑이 이루어집니다.



모두 저장합니다.



Deploying the application

여기의 Deploying the application 부분을 보세요~



Testing the application

EM 접속 후 SOAComposite 를 클릭합니다.



테스트 클릭



트리 보기에서 XML 보기로 바꾼 후 아라 패일의 내용을 입력합니다.





잘 되었다고 합니다 -_-



추적...




실제로 C:\TEMP 디렉토리에 가보면 order_1.txt 파일이 생겼습니다.



파일을 열어보면 File Adapter를 만들 때 지정했던 형식대로 내용이 들어가 있습니다.







tag: BPEL, oracle, SOA

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Introductioin

Database AdapterMediator 컴포넌트를 이용한 카드 검사 서비스를 만들겠습니다.



Creation a new application

메뉴에서 File → New 클릭

왼쪽 트리메뉴에서 General 선택 - Generic Application 선택



Application Name : CreditCardValidation

Next 클릭



어플리케이션의 프로젝트를 만듭니다.

한 어플리케이션에 여러개의 프로젝트를 만들 수 있습니다.

Project Name : validationForCC

왼쪽 Available 목록 중에 SOA 를 선택해서 오른쪽으로 옮깁니다.



아무것도 없는 빈 프로젝트로 생성합니다.



첫 프로젝트를 만들었습니다. 두둥!

이클립스랑 비슷하면서도 다른 -_- FlexBuilder 랑 조금 더 비슷한듯 하네용 ㅎㅎ





Adding the database adapter

오른쪽 컴포넌트 중에서 Database Adapter(이하 DbAdapter) 를 External References 공간에 드래그 앤 드랍 합니다.




Service Name : getCreditValidation



크게 Connection 부분과 JNDI Name, Data Source 부분이 있는데..

Connection 지금 현재 이 DbAdapter 를 세팅하는데 필요한 디비의 정보고,

JNDI Name 이나 Dat Source 는 실제 서버에 배치 시킨 후 사용하게 될 리소스 입니다.

곧! Connection 의 디비 정보와 JNDI Name(또는 Data Source)의 정보가 똑같아야 합니다.



데이터베이스 정보를 입력합니다.

Test Connection 클릭 했을때 "Success!" 가 떨어지면 ㅇㅋ!

잘 보면 전 튜토리얼에서 설정한 Data Source 설정과 같다는 것을 알 수 있습니다.



OK 누르게 되면 JNDI Name 에 eis/DB/[Connection이름] 이 자동으로 입력된 것을 알 수 있습니다.

eis/DB/[이름] 은 전 튜토리얼에서 DbAdapter 설정한 JNDI Name 이라는 것을 알 수 있습니다.



어떤 작업을 할건지 선택합니다.

Perform an Operation on a Table 선택 - Select만 체크



어떤 테이블의 정보를 가져올 것인지 선택합니다.

아직 등록된 테이블 정보가 없으므로 Import Tables 클릭



Query 클릭하면 테이블의 목록을 가져옵니다.

Available 리스트에서 CREDITCARDINFO 테이블을 오른똑으로 선택합니다.



테이블이하나 선택되었습니다.



기본키를 지정합니다. CCNUMBER 칼럼을 선택



테이블 관계를 설정합니다. 관계 없으므로 -_- Next 클릭



어떤 칼럼만 가져올지 필터링 합니다. status만 체크



조건을 정의하는 부분입니다.

파라미터(입력)를 하나 추가합니다. Add 클릭 ccnb 입력

Edit 클릭



조건을 만듭니다.

Add 클릭

Query Key : ccnumber
Operator : EQUAL(=)
Second Argument : Parameter 선택



ccnb 파라미터를 하나 받아서 select 쿼리를 날리는 쿼리가 완성되었습니다. Finish 클릭



Database Adapter가 만들어졌습니다.





Adding the Meditator Component

이번에는 Mediator 컴포넌트를 Components 영역에 드래그 앤 드랍 합니다.

Mediator(중재자)는 분기, 값 전달 같은걸 합니다. (맞나?...)



Name : RouteRequest
Templete : Define Interface Later



이번에는 Web Service 컴포넌트를 Exposed Services 영역에 드래그 앤 드랍 합니다.

Web Service 컴포넌트는 외부와의 입/출력을 담당하는 컴포넌트 입니다.



Name : getStatusByCC

원래는 입/출력 스키마를 다 만들어줘야 하지만

이번 튜토리얼은 Web Service 가 목적이 아니므로 기존의 스키마를 불러옵니다.

WSDL URL 옆의 Generate WSDL from schema(s) 버튼(+)을 클릭합니다.



Request 탭에서 URL 오른쪽의 browse for schema file 아이콘 클릭



Import Schema File... 버튼 클릭



Browse Resources... 로 스키마 파일을 찾습니다.



OK 클릭



Maintain original directory structure for imported files 체크 해제

OK 클릭



Type 에 creditcheck.xsd 가 추가된 것을 볼 수 있습니다.

creditcardStatusReqeust 선택



이번에는 Reply 탭에서 creditcardStatus 를 선택합니다.

한번 스키마 파일을 불러(import)왔기 때문에 다시 파일을 일지 않고 선택하면 됩니다.



Fault 탭도 마찬가지로 error를 선택해줍니다.



OK 클릭



이제 getStatusByCC 와 RouteRequest 를 이어줍니다.



RouteRequest 와 getCreditValidation 을 이어줍니다.



잘 이어졌습니다~! >_<





Adding a transformation to the Mediator component

getStatusByCC 에서 받은(request) 입력에서 getCreditValidtion의 입력으로,

getCreditValidation 에서 나온 출력에서 getStatusByCC의 출력으로 값을 매핑시켜주는 Mediator를 설정해보겠습니다.


RouteRequest 를 더블클릭합니다.




첫번째 Transform Using 필드(입력 매핑)에서 오른쪽의

Select an existing mapper file or create a new one 버튼을 클릭합니다.




Create New Mapper File 을 선택하고 OK 클릭




왼쪽(getStatusByCC)의 inp1:CCNumber를 오른쪽(getCreditValidation)의 top:ccnb까지 드래그 합니다.




다시 RouteRequest Mediator. 두번째 Transform Using 필드(출력 매핑)에서 오른쪽의

Select an existing mapper file or create a new one 버튼을 클릭합니다.





입력 매핑과 똑같은 방법으로

getCreditValidation의 top:status와 getStatusByCC의 inp1:creditcardStatus를 이어줍니다.




모두 저장 합시다.



DeployIng the application

일단 서버(어플리케이션 커넥션)를 하나 등록해야 합니다.

New... (Ctrl-N)




왼쪽 카테고리에서 Connection을 선택 오른쪽 아이템 중에 Application Server Connection을 선택합니다.




커넥션 이름을 지정합니다.




커넥션의 Username과 Password를 지정합니다.




어드민 서버(WebLogic)의 정보와 도메인명을 입력합니다.




Test Connectino 에서 모두 "success" 가 나와야 합니다.




서버 커낵션을 하나 만들었습니다.



여기까지는 한번만 하면 됩니다.


프로젝트에서 마우스 오른쪽 버튼 - Deploy - [프로젝트명]... 클릭




Deploy to Application Server 선택




Overwrite any existing composites with the sam revision ID. 체크 해제

배치를 올릴때마다 버젼 번호가 붙게 되는데 체크를 하게 되면 전의 번호와 같은 번호로 덮어서 배치하게 됩니다.

개발용으로 할때는 하나로 계속 하는게 좋겠죠? 안좋나 -_-;;




아까 전에 만들었던 서버 커넥션을 선택합니다.




SOA 서버 선택




배치 요약 확인




컴파일이 정상적으로 끝나고, 배치를 시작할때 웹로직 암호를 물어봅니다.




배치가 되면 대충 이런 메세지가 콘솔로 나오게 됩니다.

[01:19:02 PM] >>>>  Warning:  Unable to determine the target platform from the Profile.  Using default...
[01:19:02 PM] ----  Deployment started.  ----
[01:19:02 PM] Target platform is  (Weblogic 10.3).
[01:19:02 PM] Running dependency analysis...
[01:19:02 PM] Building...
[01:19:10 PM] Deploying profile...
[01:19:10 PM] Updating revision id for the SOA Project 'validationForCC.jpr' to '1.0'..
[01:19:10 PM] Wrote Archive Module to C:\JDeveloper\mywork\CreditCardValidation\validationForCC\deploy\sca_validationForCC_rev1.0.jar
[01:19:10 PM] Deploying sca_validationForCC_rev1.0.jar to soa_server1 [Antop-PC:8001] 
[01:19:10 PM] Processing sar=/C:/JDeveloper/mywork/CreditCardValidation/validationForCC/deploy/sca_validationForCC_rev1.0.jar
[01:19:10 PM] Adding sar file - C:\JDeveloper\mywork\CreditCardValidation\validationForCC\deploy\sca_validationForCC_rev1.0.jar
[01:19:10 PM] Preparing to send HTTP request for deployment
[01:19:10 PM] Creating HTTP connection to host:Antop-PC, port:8001
[01:19:10 PM] Sending internal deployment descriptor
[01:19:10 PM] Sending archive - sca_validationForCC_rev1.0.jar
[01:19:31 PM] Received HTTP response from the server, response code=200
[01:19:31 PM] Successfully deployed archive sca_validationForCC_rev1.0.jar to soa_server1 [Antop-PC:8001] 
[01:19:31 PM] Elapsed time for deployment:  29 seconds
[01:19:31 PM] ----  Deployment finished.  ---- 



Testing the application

Enterprise Manager에 접속 - validationForCC 선택




테스트 클릭




카드번호를 입력 후 웹 서비스 테스트 클릭




결과가 나왔습니다. 두둥!

메시지 흐름 추척 실행 링크를 누르면 어떤 순서로 실행 되었는지 확인할 수 있습니다.




처리 순서가 나옵니다. 여기서 또 파란색 글씨 부분을 누르면 그 컴포넌트에서 어떻게 처리 되었는지 볼 수 있습니다.



파란색 링크(RouteRequest)를 클릭하면 더 자세한 정보를 볼 수 있습니다.



아래는 실제 테이블에 들어있는 데이터 입니다.







  1. 한정한
    님 완전 능력자시군요 ㄷㄷ 이건 거의 공략집 수준이네요 ㅎㅎ

댓글 (Comment)

Name*

Password*

Link (Your Website)

Comment

SECRET | 비밀글로 남기기