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

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!