Comments
Transcript
Globus Toolkit 4における WSRFサービス記述のアノテーションによる補助
Globus Toolkit 4における WSRFサービス記述のアノテーションによる補助 1.産業技術総合研究所 1.産業技術総合研究所、 産業技術総合研究所、2.エス 2.エス・ エス・エフ・ エフ・シー 中田秀基1、竹房 あつ子 あつ子1,岸本誠1,2 工藤 知宏1、田中 良夫1、関口 智嗣1 National Institute of Advanced Industrial Science and Technology グリッドとWSRF グリッド 複数の管理主体にまたがるVO(仮想組織)による資 源の共有と有効利用 明示的,宣言的なインターフェイス記述が必要 Web Services Resource Framework (WSRF) Web Services をベースに,サーバ側の状態を明示 的に取り扱う枠組み WSDL (WS Description Language) による明示的な インターフェイス記述 WSRFサービス記述の問題 Web Services - 多階層 何重にも積み重ねられたソフトウェアスタック ツールの補助なしにスクラッチから記述するのはほ ぼ不可能 Globus Toolkit 4 WSRFサービスを記述するための代表的なフレー ムワーク ○ 抽象度の高い記述が可能 × 数多くの非本質的なファイルの記述が必要 研究の目的 WSRF サービスの サービスの記述を 記述を容易にする 容易にするツール にするツールの ツールの提供 Globus Toolkit 4 を補助するツールを作成 ユーザはアノテーション付きの Java のソースを記述するだけ 他のファイルはJavaソースから自動生成 転送データがXMLスキーマが既定の場合にも対応 発表の概要 Web Services と WSRF の概要 Globus Toolkit 4 の概要 提案ツール 提案ツールの ツールの設計と 設計と実装 議論 まとめと今後 まとめと今後の 今後の課題 (狭義の)Web Services SOAP/HTTP をベースにした ベースにした通信 にした通信 XML による拡張性の高い形式 いくつもの独立した規格による膨大なプロトコルスタック WSDL (Web Services Description Language) サービスのインターフェイスを記述 転送データのスキーマも定義 ○ 明確に 明確にインターフェイスが インターフェイスが定義できるため 定義できるため 相互運用性を 相互運用性を確保しやすい 確保しやすい × プロトコルスタック による複雑 による複雑さ 複雑さ 低速 記述にはツールのサポートが必須 Web Services の記述補助 (1) Web Services の実装 実装言語(Javaなど)によるサービス本体 WSDLによるインターフェイス定義 非常に煩雑 内容の一部は,サービス本体の記述と重複 整合性の確保 転送データ 転送データの データのマーシャリング・ マーシャリング・アンマーシャリング 実装言語のオブジェクトと転送データ形式 (XML表 現)との間の変換 実装言語の型とXMLスキーマの対応は自明ではな い Web Services の記述補助 - 記述補助ツール WSDL先行型 WSDL先行型: 先行型: WSDL → 記述言語 WSDLから記述言語によるスタブを作成, ex. wsdl2java 転送データのオブジェクトもWSDLから生成 ○ サービスのインターフェイスであるWSDLを完全に 制御できる × 煩雑なWSDLをまず書かなければならない サービス先行型 サービス先行型: 先行型: 記述言語 → WSDL 記述言語からWSDLを構成: ex. java2wsdl ○ WSDL を書かないですむ × オブジェクトを特殊な形で書く必要がある Java Beans × WSDLの内容が完全に制御できない WSDLと言語の間のセマンティクスギャップ WSRF (Web Services Resource Framework) Web Service でサーバ側 サーバ側の状態を 状態を統一的に 統一的に記述する 記述する ためのフレームワーク ためのフレームワーク 「リソース」という概念を導入 サービスそのものは状態を持たない サービスとリソースを一組として扱うことで実質的 に「状態をもつサービス」を実現 c.f. Open Grid Service Infrastructure サービスそのものに状態を付加 Open Grid Forum で提案され 提案され, され,OASISで OASISで標準化 サンプルサービス 簡単な 簡単なカウンタサービス 内部状態としてint値 を持つ その値に対して加算 と減算が可能 public public class class Math Math {{ private private int int internal; internal; public public int int add(int add(int val){ val){ internal internal += += val; val; return return internal; internal; }} public public int int sub(int sub(int val) val) {{ internal internal -= -= val; val; return return internal; internal; }} }} WSRF - サービスとリソースの分離 サービス = オペレーション リソース = データ add P P sub internal add Q Q sub internal WSRF - サービスとリソースの分離 サービス = オペレーション リソース = データ add P P/X sub internal リソースID X add リソースID Y Q P/Y sub internal Factory サービスパターン Factory サービス リソースを背後のリソースホーム内に作成 1.リソース 作成依頼 クライアント 3.EPR返却 EPR返却 Factory サービス 2.リソース 作成 リソース リソース ホーム 4.EPRによる EPRによる アクセス 本体 サービス コンテナ 5.リソース アクセス Globus Toolkit 4 広く用いられているグリッド いられているグリッドの グリッドのツールキット ver. 1/2 - 独自プロトコル ver. 3 - OGSI ベース ver. 4 - WSRF ベース WSRF 環境 Java によるサービスコンテナ 開発用のツール WSRFで WSRFで実装された 実装されたサービス されたサービス GRAM ジョブ起動GRAM GRAM MDS MDS RFT RFT 情報サービス WSRF ファイル転送サービス WSRFコア コア User User defined defined Services Services GT4 によるWSRFサービスの記述 WSDL先行型 WSDL先行型の 先行型の記述補助 WSDL を書くと転送データのJavaオブジェクトを生 成 さまざまな基本サービスを提供 Operation Provider GT4 Tutorial [http://gdp.globus.org/gt4-tutorial/] [ GT4によるWSRFサービス記述に必要なファイル 6 8 サービス デプロイ ファイル 9 デプロイ JNDI ファイル WSDL 1 Factory サービス 5 QName 4 3 リソース リソース ホーム 7 WSDL 2 本体 サービス コンテナ GT4によるWSRFサービス記述に必要なファイル 説明 Factoryサービス Factoryサービス 本体サービス 本体サービス リソース リソースホーム QName 小計 Factoryサービスインターフェイス Factoryサービスインターフェイス 本体サービスインターフェイス 本体サービスインターフェイス 小計 サービスの サービスのデプロイファイル デプロイ JNDI 設定ファイル 設定ファイル 小計 計 記述言語 Java Java Java Java Java WSDL WSDL WSDD XML JNDI XML 行数 51 50 73 20 16 210 71 119 190 27 37 64 464 GT4によるWSRFサービス記述の問題点 サービスと サービスとリソースの リソースの双方を 双方を書かなければならない オブジェクト指向的には単一のオブジェクトなのに独立した 2つのオブジェクトとして実装 リソースには リソースにはアクセスメソッド にはアクセスメソッドが アクセスメソッドが必要 Bean のsetter/getter WSDLの WSDLのインターフェイス記述 インターフェイス記述は 記述は煩雑 非常に複雑で専門知識が必要 その他 その他の記述ファイル 記述ファイルが ファイルが多すぎる 定型的なファイルも多いが手作業ではミスがでる エラーから記述ミスを発見するのも大変 GT4を用いた場合のプログラムの概要 // // サービス サービス class class MathService MathService {{ private private MathResource MathResource getResource(){ getResource(){ return return (MathResource) (MathResource) ResourceContext. ResourceContext. getResourceContext().getResouce(); getResourceContext().getResouce(); }} // // リソース リソース class class MathResource MathResource {{ private private int int value; value; public public int int getValue(){ getValue(){ return value; return value; }} public public AddResponse AddResponse add(int add(int val){ val){ MathResouce MathResouce mr mr == getResource(); getResource(); int int tmp tmp == mr.getValue() mr.getValue() ++ val; val; mr.setValue(tmp); mr.setValue(tmp); }} return return new new AddResponse(tmp); AddResponse(tmp); ... ... }} サービス add } リソース} getValue logic setValue value public public void void setValue(int setValue(int value){ value){ this.value = this.value = value; value; }} WSDLの例 <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <definitions name="MathService" <definitions name="MathService" targetNamespace="http://www.globus.org/namespaces/examples/core/MathService_i nstance_rp" targetNamespace="http://www.globus.org/namespaces/examples/core/MathService_i nstance_rp" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.globus.org/namespaces/examples/core/MathService_instanc e_rp" xmlns:tns="http://www.globus.org/namespaces/examples/core/MathService_instanc e_rp" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsrp="http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties1.2-draft-01.xsd" xmlns:wsrp="http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties1.2-draft-01.xsd" xmlns:wsrpw="http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties1.2-draft-01.wsdl" xmlns:wsrpw="http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties1.2-draft-01.wsdl" xmlns:wsdlpp="http://www.globus.org/namespaces/2004/10/WSDLPreprocessor" xmlns:wsdlpp="http://www.globus.org/namespaces/2004/10/WSDLPreprocessor" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:import <wsdl:import namespace= namespace= "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft01.wsdl" "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft01.wsdl" location="../../wsrf/properties/WS-ResourceProperties.wsdl" /> location="../../wsrf/properties/WS-ResourceProperties.wsdl" /> <types> <types> <xsd:schema targetNamespace="http://www.globus.org/namespaces/examples/core/MathService_i <xsd:schema nstance_rp" targetNamespace="http://www.globus.org/namespaces/examples/core/MathService_i nstance_rp" xmlns:tns="http://www.globus.org/namespaces/examples/core/MathService_instanc e_rp" xmlns:tns="http://www.globus.org/namespaces/examples/core/MathService_instanc e_rp" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- Requests and responses --> <!-- Requests and responses --> <xsd:element name="add" type="xsd:int"/> <xsd:elementname="addResponse"> name="add" type="xsd:int"/> <xsd:element <xsd:element name="addResponse"> <xsd:complexType/> <xsd:complexType/> </xsd:element> </xsd:element> <xsd:element name="subtract" type="xsd:int"/> <xsd:elementname="subtractResponse"> name="subtract" type="xsd:int"/> <xsd:element <xsd:element name="subtractResponse"> <xsd:complexType/> <xsd:complexType/> </xsd:element> </xsd:element> <!-- Resource properties --> <!-- Resource properties --> <xsd:element name="Value" type="xsd:int"/> <xsd:elementname="LastOp" name="Value" type="xsd:string"/> type="xsd:int"/> <xsd:element <xsd:element name="LastOp" type="xsd:string"/> <xsd:element name="MathResourceProperties"> <xsd:element name="MathResourceProperties"> <xsd:complexType> <xsd:complexType> <xsd:sequence> <xsd:sequence> <xsd:element ref="tns:Value" minOccurs="1" maxOccurs="1"/> <xsd:elementref="tns:LastOp" ref="tns:Value" minOccurs="1" minOccurs="1" maxOccurs="1"/> maxOccurs="1"/> <xsd:element <xsd:element ref="tns:LastOp" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:sequence> </xsd:complexType> </xsd:complexType> </xsd:element> </xsd:element> </xsd:schema> </xsd:schema> </types> </types> <message name="AddInputMessage"> <message name="AddInputMessage"> <part name="parameters" element="tns:add"/> <part name="parameters" element="tns:add"/> </message> </message> <message name="AddOutputMessage"> <message name="AddOutputMessage"> <part name="parameters" element="tns:addResponse"/> <part name="parameters" element="tns:addResponse"/> </message> </message> <message name="SubtractInputMessage"> <message name="SubtractInputMessage"> <part name="parameters" element="tns:subtract"/> <part name="parameters" element="tns:subtract"/> </message> </message> <message name="SubtractOutputMessage"> <message name="SubtractOutputMessage"> <part name="parameters" element="tns:subtractResponse"/> <part name="parameters" element="tns:subtractResponse"/> </message> </message> <portType name="MathPortType" <portType name="MathPortType" wsdlpp:extends="wsrpw:GetResourceProperty wsdlpp:extends="wsrpw:GetResourceProperty wsrpw:GetMultipleResourceProperties wsrpw:GetMultipleResourceProperties wsrpw:SetResourceProperties wsrpw:SetResourceProperties wsrpw:QueryResourceProperties" wsrpw:QueryResourceProperties" wsrp:ResourceProperties="tns:MathResourceProperties"> wsrp:ResourceProperties="tns:MathResourceProperties"> <operation name="add"> <operation <input name="add"> message="tns:AddInputMessage"/> <input message="tns:AddOutputMessage"/> message="tns:AddInputMessage"/> <output </operation> <output message="tns:AddOutputMessage"/> </operation> <operation name="subtract"> <operation <input name="subtract"> message="tns:SubtractInputMessage"/> <input message="tns:SubtractOutputMessage"/> message="tns:SubtractInputMessage"/> <output </operation> <output message="tns:SubtractOutputMessage"/> </operation> </portType> </portType> </definitions> </definitions> 補助ツールの設計指針 サービスと サービスとリソースの リソースの双方を 双方を書かなければならない リソースのみを リソースのみをユーザ のみをユーザに ユーザに記述させる 記述させる リソースにロジックを移動 サービスはりソースに対するラッパとして自動生成 リソースには リソースにはアクセスメソッド にはアクセスメソッドが アクセスメソッドが必要 ロード時に動的に付加 WSDLの WSDLのインターフェイス記述 インターフェイス記述は 記述は煩雑 ユーザの定義したコードから自動生成 欠落したセマンティクスはアノテーションで補う その他 その他の記述ファイル 記述ファイルが ファイルが多すぎる すべて自動生成 サービスとリソースの融合 サービスはただの サービスはただのラッパ はただのラッパに ラッパに リソースに リソースにデータと データとオペレーションを オペレーションを記述 単純になった 単純になったサービス になったサービスは サービスは自動生成可能 サービス add リソース getValue logic setValue value 補助ツールを用いた記述 // 自動生成) 自動生成 // サービス サービス (自動生成 (自動生成 自動生成) 自動生成 public public class class MathService MathService {{ ... ... public public AddResponse AddResponse add(int add(int val){ val){ MathResouce MathResouce mr mr == getResource(); getResource(); return return new new AddResponse(mr.add(val) AddResponse(mr.add(val) ); ); }} ... ... }} // ユーザが ユーザ 定義 // リソース リソース (ユーザ (ユーザ ユーザが が定義) 定義) ユーザが 定義 public public class class MathResource MathResource {{ @PropertyAN @PropertyAN private private int int internal; internal; @OperationAN @OperationAN public public int int add(int add(int val){ val){ internal internal += += val; val; return return internal; internal; }} :: }} 補助ツールの設計 WSDL の記述は 記述は困難 Javaのソースから自動生成 問題: Javaのソースだけでは情報が足りない Javaの Javaのアノテーションを アノテーションを利用 オペレーションとして公開するメソッド リソースとして公開するインスタンス変数 GT4での XML schemaの利用 XML Schema 参照 WSDL 生成 データ Class データ データClass Class 参照 サービス リソース 所与 ユーザ記述 自動生成 WSDL 補助ツールでの XML schemaの利用 XML Schema 参照 WSDL 生成 データ Class データ データClass Class 参照 サービス リソース 所与 ユーザ記述 自動生成 WSDL 補助ツールの実装 Javassist [Chiba ‘00]を 00]を利用 バイトコードレベルでJavaプログラムを操作 アノテーションの解析 リソースへのsetter / getterメソッドのロード時追加 提案ツールによるサービスの記述例 加算・ 加算・減算の 減算の可能な 可能なカウンタ 整数でなく,複素数を対象 複素数のデータ構造は,XMLスキーマによって与 えられる. ツールの ツールの使用法 複素数のXMLスキーマから,Javaクラスを生成 生成されたJavaクラスを活用してリソースを記述 リソースからサービス,WSDLなどを生成 複素数のXMLスキーマ <?xml <?xml version="1.0" version="1.0" encoding="UTF-8"?> encoding="UTF-8"?> <xsd:schema <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://gtrc.aist.go.jp/test2" xmlns="http://gtrc.aist.go.jp/test2" targetNamespace="http://gtrc.aist.go.jp/test2"> targetNamespace="http://gtrc.aist.go.jp/test2"> <xsd:complexType <xsd:complexType name="ComplexType"> name="ComplexType"> <xsd:sequence> <xsd:sequence> <xsd:element <xsd:element name="imaginal" name="imaginal" type="xsd:float"/> type="xsd:float"/> <xsd:element name="real" type="xsd:float" <xsd:element name="real" type="xsd:float" /> /> </xsd:sequence> </xsd:sequence> </xsd:complexType> </xsd:complexType> <xsd:element <xsd:element name="Complex" name="Complex" type="ComplexType" type="ComplexType" /> /> </xsd:schema> public class ComplexType </xsd:schema> public class ComplexType implements implements java.io.Serializable java.io.Serializable {{ private float imaginal; private float imaginal; private private float float real; real; }} public public ComplexType(float ComplexType(float imaginal, imaginal, float float real) real) {{ this.imaginal this.imaginal == imaginal; imaginal; this.real = real; this.real = real; }} public float getImaginal() { public float getImaginal() { return return imaginal; imaginal; }} ... ... 提案ツールによるサービスの記述 public class ComplexResource { @PropertyAN private ComplexType complex = new ComplexType(0.0f, 0.0f); @OperationAN public ComplexType add(ComplexType addValue) { complex = new ComplexType( complex.getImaginal() + addValue.getImaginal(), complex.getReal() + addValue.getReal()); return complex; } @OperationAN public ComplexType sub(ComplexType subValue) { complex = new ComplexType( complex.getImaginal() - subValue.getImaginal(), complex.getReal() - subValue.getReal()); return complex; } } 議論 カウンタサービス 9ファイル 472行 → 1ファイル 20行程度に 大幅な省力化 非専門家でも記述が十分に可能 XMLスキーマ XMLスキーマが スキーマが事前に 事前に定義されている 定義されている場合 されている場合 容易にJavaクラスを生成 WSDLを書かずに利用可能 結論 Globus Toolkit 4による 4によるWSRF によるWSRFの WSRFの記述を 記述をアノテーション によって補助 によって補助 Java ソースコードだけでWSRFサービスの記述 大幅な記述量の低減を実現 データ構造XMLスキーマで定義されている場合に も対応 今後の課題 転送データ 転送データがすでに データがすでにJava がすでにJava定義 Java定義されている 定義されている場合 されている場合への 場合への対応 への対応 WSDLのためのXMLスキーマの生成 マーシャリング・アンマーシャリング機能を動的に追加 Operation Provider への対応 への対応 Operation Provider - GT4の機能プラグイン機構 アノテーションを追加することで対応 例外状態への 例外状態への対応 への対応 Web Services ではFaultTypeの定義が可能 現状 - すべて同じデフォルトのFaultType プログラマがアノテーションで定義可能に Web Services Metadata for the Java Platform (JSR(JSR-000181) への対応 への対応 WSDL の持つ詳細な表現への対応 謝辞 本研究の 本研究の一部は 一部は,文部科学省科学技術進行調整費 「グリッド技術 グリッド技術による 技術による光 による光パス網提供方式 パス網提供方式の 網提供方式の開発」 開発」による