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 の持つ詳細な表現への対応
謝辞
本研究の
本研究の一部は
一部は,文部科学省科学技術進行調整費
「グリッド技術
グリッド技術による
技術による光
による光パス網提供方式
パス網提供方式の
網提供方式の開発」
開発」による