Apache ODE 用に作成した BPEL を SCA 化して実行 - Apache Tuscany 利用
Apache ODE 1.2 用に作成した BPEL ファイルを SCA 化して Apache Tuscany 1.3 上での実行を試みる。
ただし、Apache Tuscany 1.3 がサポートしている(同梱している)のは ODE 1.1 のため、BPEL や WSDL ファイルの名前空間を変更する必要あり。
なお、今回は id:fits:20080812 で作成したファイル(SampleTest.bpel, SampleTest.wsdl, deploy.xml)を使う事にした。
名前空間の変更
Tuscany 1.3 上で実行するために Apache ODE 1.2 用に作成した BPEL・WSDL ファイル内の名前空間を以下のように変更する。
- BPEL ファイル内の名前空間 http://docs.oasis-open.org/wsbpel/2.0/process/executable を http://schemas.xmlsoap.org/ws/2004/03/business-process/ に変更
- WSDL ファイル内の名前空間 http://docs.oasis-open.org/wsbpel/2.0/plnktype を http://schemas.xmlsoap.org/ws/2004/03/partner-link/ に変更
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 に設定されていればよい)
- カレントディレクトリ
カレントディレクトリと 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 ファイルをダウンロードし、編集してから使うことにする。
- "http://localhost:8080/SampleTestComponent?wsd" を SampleTestComponent.wsdl ファイルとしてダウンロード
- "http://localhost:8080/SampleTestComponent?wsd=SampleTest.wsdl" を SampleTest_deployed.wsdl ファイルとしてダウンロード
SampleTestComponent.wsdl ファイルの修正点は以下。
- xmlns:tns の名前空間の値を "http://fits/sample" に変更
- wsdl:import 要素の location 属性を "SampleTest_deployed.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!