読者です 読者をやめる 読者になる 読者になる

Apache ODE 用に作成した BPEL を SCA 化して実行 - Apache Tuscany 利用

SOA SCA BPM BPEL Java Ruby

Apache ODE 1.2 用に作成した BPEL ファイルを SCA 化して Apache Tuscany 1.3 上での実行を試みる。
ただし、Apache Tuscany 1.3 がサポートしている(同梱している)のは ODE 1.1 のため、BPELWSDL ファイルの名前空間を変更する必要あり。

なお、今回は id:fits:20080812 で作成したファイル(SampleTest.bpel, SampleTest.wsdl, deploy.xml)を使う事にした。

名前空間の変更

Tuscany 1.3 上で実行するために Apache ODE 1.2 用に作成した BPELWSDL ファイル内の名前空間を以下のように変更する。

SampleTest.bpel ファイル
<bpws:process exitOnStandardFault="yes" name="SampleTest"
    suppressJoinFailure="yes" 
    targetNamespace="http://fits/sample"
    xmlns:bpws="http://schemas.xmlsoap.org/ws/2004/03/business-process/" 
    xmlns:tns="http://fits/sample">

	・・・
</bpws:process>

xmlns:bpws の値を変更。

SampleTest.wsdl ファイル
<definitions name="SampleTest"
        targetNamespace="http://fits/sample"
        xmlns:tns="http://fits/sample"
        xmlns:plnk="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"
        ・・・>
    ・・・
</definitions>

xmlns:plnk の値を変更。

Composite・ComponentType ファイルの作成

SCA の構成を記述した .composite ファイルを以下のように作成。

  • implementation.bpel 要素の process 属性に BPEL ファイル process 要素の name 属性の値を設定
  • interface.wsdl 要素 interface 属性に "WSDL名前空間#wsdl.interface(WSDLファイル portType 要素の name 属性の値)" を設定
SampleTest.composite
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
	targetNamespace="http://fits/sample"
    xmlns:hns="http://fits/sample"
    name="bpel">

    <component name="SampleTestComponent">
        <implementation.bpel process="hns:SampleTest"/>
        <service name="client">
            <interface.wsdl interface="http://fits/sample#wsdl.interface(SampleTest)" />
            <binding.ws />
        </service>
    </component>

</composite>

.composite ファイルの service 要素のみを取り出して、以下のような .componentType ファイルを作成。

SampleTest.componentType
<?xml version="1.0" encoding="ASCII"?>
<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" 
    xmlns:wsdli="http://www.w3.org/2006/01/wsdl-instance"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <service name="client">
        <interface.wsdl interface="http://fits/sample#wsdl.interface(SampleTest)" />
    </service>
</componentType>

deploy.xml の変更

service 要素の name 属性を以下のように変更する。

deploy.xml
<?xml version="1.0" encoding="UTF-8"?>
<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03"
    xmlns:pns="http://fits/sample" 
    xmlns:wns="http://fits/sample"
    xmlns:tus="http://tuscany.apache.org">

    <process name="pns:SampleTest">
        <active>true</active>
        <provide partnerLink="client">
            <service name="tus:client" port="SamplePort"/>
        </provide>
    </process>
</deploy>

ランチャースクリプトの作成

Java で書くのが面倒なので、JRuby スクリプトで SCA 実行用のランチャースクリプトを作成。

launcher.rb
include Java

import org.apache.tuscany.sca.host.embedded.SCADomain;

scaDomain = SCADomain.newInstance("SampleTest.composite")

puts "start service"

gets

scaDomain.close

puts "stop service"

実行

カレントディレクトリに、これまでに編集・作成したファイルと %TUSCANY_HOME%\lib\ode-dao-jpa-ojpa-derby-1.1.zip を解凍したディレクトリを配置する。(特に同じディレクトリに配置する必要は無く、classpath に設定されていればよい)

  • カレントディレクトリ
    • jpadb ディレクトリ
    • deploy.xml
    • launcher.rb
    • SampleTest.bpel
    • SampleTest.wsdl
    • SampleTest.composite
    • SampleTest.componentType

カレントディレクトリと tuscany-sca-manifest.jar を classpath に設定して、JRuby スクリプトを実行すると、"http://ホスト名:8080/SCAコンポーネント名" でサービスが公開される。

>set classpath=.;%TUSCANY_HOME%\lib\tuscany-sca-manifest.jar
>jruby launcher.rb
・・・
情報: Added Servlet mapping: http://localhost:8080/SampleTestComponent
・・・
start service

動作確認

サービスが動作すると、"http://ホスト名:8080/SCAコンポーネント名?wsdl" で WSDL ファイルが公開されるようになるが、この WSDL は問題があって直接使えないため、暫定策として以下のように WSDL ファイルをダウンロードし、編集してから使うことにする。

SampleTestComponent.wsdl ファイルの修正点は以下。

編集後の SampleTestComponent.wsdl
<wsdl:definitions name="SampleTestComponent.client" targetNamespace="http://fits/SampleTestComponent/client" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://fits/sample" xmlns:ns0="http://fits/sample" xmlns:soap11="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:import namespace="http://fits/sample" location="SampleTest_deployed.wsdl">
  </wsdl:import>
    ・・・
</wsdl:definitions>

SampleTest_deployed.wsdl ファイルの修正点は以下。

  • partnerLinkType 要素の記述を修正
  • role 要素の記述を修正
編集後の SampleTest_deployed.wsdl
<definitions name="SampleTest" targetNamespace="http://fits/sample" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:plnk="http://schemas.xmlsoap.org/ws/2004/03/partner-link/" xmlns:tns="http://fits/sample" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/">
・・・
  <plnk:partnerLinkType name="SampleTest">
    <plnk:role name="SampleTestProvider" portType="tns:SampleTest" />
  </plnk:partnerLinkType>
</definitions>

上記で編集した WSDL を使ったクライアントスクリプトを作成・実行し、実行結果を確認する。(実行結果が Apache ODE 1.2 のものと異なるので注意)

client.rb ファイル
require 'soap/wsdlDriver'

wsdl = 'SampleTestComponent.wsdl'

service = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
service.generate_explicit_type = true

request = {"input" => "aaa"}

#hello メソッドの呼び出し結果が Apache ODE 1.2 上で
#実行した場合と異なる
puts service.hello(request)["SampleTestResponse"]
クライアントスクリプト実行結果
>jruby client.rb
・・・
aaa world!