演習
1~6
Globus Toolkit Version 4 (Java WS Core)
演習: WS-Resourceの生成と機能拡張
目標:
GT4 Java Core 、WSRF基本仕様のサポート確認
サーバー側の実装方法
– サービス – リソース – 各種設定ファイル
(クライアントの実装方法)
– 最低限 WSRFの標準的な機能は、GT4に含まれる標準クライアントで利用可能
GT4標準クライアントの利用方法
– wsrf-get-property – wsrf-update-property – wsrf-destroy – wsrf-set-termination-time概要
0.Borja Sotomayor,”The Globus Toolkit 4 Programmer‘s Tutorial” が基本
– http://gdp.globus.org/gt4-tutorial/
“Chapter 5. Multiple Resources”に修正を加え、その効果を逐次確認する
1.WS-Coreの導入
2.標準的なWS-Resourceパターンの確認
– サービス及びリソースの構築、デプロイ、アクセス確認
3.リソース・プロパティに対するアクセス手段の追加
(オペレーション・プロバイダの活用)
– 実装は修正せず、WSDL, WSDDファイルの変更のみで実現
4.リソース・プロパティのコードにおける表現方法を変更
(サービス/リソース実装の変更)
– サービス/リソースの実装のみを変更
5.WS-ResorceLifeTimeへの対応:Immediate Destruction
– WSDL, WSDDファイルの変更のみで実現
6. WS-ResorceLifeTimeへの対応:Scheduled Destruction
– WSDL/WSDD、リソース実装の修正。サービス実装は変更なし オプション:JNDIのデプロイファイルの修正(破棄時刻をより正確にするため)WS-Resourceの拡張(本日の演習)
WS-Resource
Custom method (Get Property)WS-Resource
Custom method Get Property Set PropertyWS-Resource
Custom method Get Property Set Property Immediate DestructionWS-Resource
Custom method Get Property Set Property Immediate Destruction Scheduled Destruction wsrf-get-property カスタム クライアント wsrf-update-property wsrf-destroy wsrf-set- termination-time2
3,4
5
6
2.標準的なWS-Resourceパターンの確認(主要ファイルの
み)
クライアント ClientCreate.java クライアント ClientAdd.java イン タ ー フ ェ ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java epr.txt deploy-server.wsdd MathService.java イン タ ー フ ェ ー ス Webサービス Math.wsdlClientCreate.java(無修正で使用)
…
// Get factory portType
factoryEPR = new EndpointReferenceType();
factoryEPR.setAddress(new Address(factoryURI));
mathFactory = factoryLocator.getFactoryPortTypePort(factoryEPR);
// Create resource and get endpoint reference of WS-Resource CreateResourceResponse createResponse =
mathFactory.createResource(new CreateResource()); instanceEPR = createResponse.getEndpointReference();
// Write endpoint reference to file …..
MathFactoryServiceを呼び出し、
End Point Reference (EPR)を取得する
– WS-Resourceが生成される
演習を通じて、修正無しで使用する
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java タ ー ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl
ClientAdd.java (無修正で使用)
…
// Get endpoint reference of WS-Resource from file FileInputStream fis = new FileInputStream(eprFile);
instanceEPR = (EndpointReferenceType) ObjectDeserializer.deserialize( new InputSource(fis),EndpointReferenceType.class); fis.close(); … // Get PortType MathPortType math = instanceLocator.getMathPortTypePort(instanceEPR); // Perform addition math.add(value); …..
EPRで示されたWS-Resource
(MathService + MathResource)に
加算を依頼、結果を受け取る
演習を通じて、修正無しで使用する
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java イン タ ー フ ェ ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl
その他のファイル(無修正で使用)
MathQNames.java(図中省略)
– 名前空間の扱いを簡易にするための補助ファイル
MathResourceHome.java(図中省略)
– リソース・ホーム
MathFactoryService.java
– ファクトリー・サービス … ctx = ResourceContext.getResourceContext();home = (MathResourceHome) ctx.getResourceHome(); key = home.create();
String instanceService = (String)
MessageContext.getCurrentContext().getService().getOption("instance"); String instanceURI = baseURL.toString() + instanceService;
epr = AddressingUtils.createEndpointReference(instanceURI, key);
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java タ ー ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.java
epr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl
MathService.java (修正あり)
WS-Resourceを形成するサービスの実装
リソース・プロパティの実装方法変更に
あわせ、演習3で修正
–
簡便な方法から、よりWSRFの特徴が見える方法へ
… resource = ResourceContext.getResourceContext().getResource(); MathResource mathResource = (MathResource) resource;…
mathResource.setValue(mathResource.getValue() + a); //初期状態
mathResource.setLastOp("ADDITION"); …
ResourceProperty valueRP = mathResource //修正後
.getResourcePropertySet()
.get(MathQNames.RP_VALUE); Integer value = (Integer) valueRP.get(0);
value = new Integer(value.intValue()+a); valueRP.set(0, value); クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java イン タ ー フ ェ ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.java
epr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl
MathResource.java (1,修正あり)
WS-Resourceを形成するリソースの実装
演習3、5で修正
演習5まで終了したファイルから抜粋
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java タ ー ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl …
public class MathResource implements Resource, ResourceIdentifier, ResourceProperties, ResourceLifetime { …
private Calendar terminationTime; …
public Object initialize() throws Exception { this.key = new Integer(hashCode());
this.propSet = new SimpleResourcePropertySet( MathQNames.RESOURCE_PROPERTIES);
valueRP = new SimpleResourceProperty(MathQNames.RP_VALUE); valueRP.add (new Integer(0));
this.propSet.add(valueRP); …
return key; }
MathResource.java (2,修正あり)
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java イン タ ー フ ェ ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl …
/* Required by interface ResourceLifetime */ public Calendar getCurrentTime() {
return Calendar.getInstance(); }
public Calendar getTerminationTime() { return this.terminationTime;
}
public void setTerminationTime(Calendar terminationTime) { this.terminationTime=terminationTime;
}
…
/* Required by interface ResourceProperties */
public ResourcePropertySet getResourcePropertySet() { return this.propSet;
}
/* Required by interface ResourceIdentifier */ public Object getID() {
return this.key; }
Math.wsdl (修正あり)
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java タ ー ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl
インターフェースを記述
そのままデプロイされるわけではない
–全部を書かなくても良い WSDLプリプロセッサー(GTが提供)
演習2,4,5で修正
deploy-server.wsdd (修正あり)
デプロイの構成を行う
–
サービスのURI、使用するクラスの指定
–
WSDLファイルの指定
GT4のツールを使用する場合は、後ろに
_serviceを追加した形で指定する
–
オペレーション・プロバイダの指定
演習 2,4,5で修正
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java イン タ ー フ ェ ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl <!-- Instance service -->
<service name="examples/core/factory/MathService" provider="Handler" use="literal“ style="document">
<parameter name="className“
value="org.globus.examples.services.core.factory.impl.MathService"/>
<wsdlFile>share/schema/examples/MathService_instance/Math_service.wsdl</wsdlFile> …
<parameter name="providers" value="GetRPProvider SetRPProvider DestroyProvider SetTerminationTimeProvider SubscribeProvider GetCurrentMessageProvider"/>
その他の設定ファイル
Factory.wsdl (修正なし)
–
ファクトリーサービスのインターフェースを
記述
deploy-jndi-config.xml (図中省略、修正ありÆなしにする)
–
リソースホームに関連
–
演習5で修正
修正しなくても動作するが、リソース破棄の検知に時間がかかる。
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java タ ー ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl
epr.txt
<ns1:MathResourceReference xsi:type="ns2:EndpointReferenceType" xmlns:ns1="http://www.globus.org/namespaces/examples/core/MathService_instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://schemas.xmlsoap.org/ws/2004/03/addressing"> <ns2:Address xsi:type="ns2:AttributedURI"> http://192.168.1.1:8080/wsrf/services/examples/core/factory/MathService </ns2:Address> <ns2:ReferenceProperties xsi:type="ns2:ReferencePropertiesType"> <ns1:MathResourceKey>23578083</ns1:MathResourceKey> </ns2:ReferenceProperties> <ns2:ReferenceParameters xsi:type="ns2:ReferenceParametersType"/> </ns1:MathResourceReference> クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java イン タ ー フ ェ ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl
WS-ResourceのEnd Point Referenceを示す
テキストファイル
ClientCreateによって生成される
in.xml
演習2で使用
–
wsrf-update-propertyコマンドの入力ファイル
クライアント ClientCreate.java MathQNames.java クライアント ClientAdd.java タ ー ー ス Webサービス MathFactoryService.java Factory.wsdl リソース MathResource.java MathQNames.javaepr.txt deploy-server.wsdd MathResourceHome.javadeploy-jndi-config.xml
MathService.java MathQNames.java イン タ ー フ ェ ー ス Webサービス Math.wsdl in.xml <?xml version="1.0" encoding="UTF-8"?> <doc> <ns1:LastOp xmlns:ns1="http://www.globus.org/namespaces/examples/core/MathService_instance"> WSRF_UPDATE_PROPERTY </ns1:LastOp> </doc>
参考:globus-build-service
チュートリアルに含まれているが、独立したプロジェクトとしても公開されて
いる(GT4標準添付ではない)
–
http://gsbt.sourceforge.net/content/view/14/31/
GT4を用いたWSRF Webサービスの構築を容易にする
–
特定のディレクトリ構造に従ってファイルを用意する事が必要
関連ファイル
–
globus-build-service.py
build.mappings
build.xml
C:¥ws-core-4.0.2¥share¥globus_wsrf_tools¥build-stubs.xml
– flatten, generateBindings, generateStubs, mergePackageMapping, ..
C:¥ws-core-4.0.2¥share¥globus_wsrf_common¥build-packages.xml
– makeGar, deployGar, undeployGar, ..