レベル: 中級 Sivananthan Perumal (siva.perumal@in.ibm.com), Senior Staff Software Engineer, IBM
2006年 12月 05日 簡単なWeb Services Resourceを構築し、これをIBM Lotus Expeditorにデプロイする方法を理解しましょう。この記事では、サーバー・サイドおよびクライアント・サイドのコンポーネントの生成に使用するWSRFツールと、WS-Resourceのテストに使用できるテスト・クライアントの開発方法について解説します。
Web Services Resource Framework (WSRF)の仕様は、Webサービスを介してリソースにステートフルにアクセスするメカニズムを標準化します。IBM Lotus ExpeditorはWSRFをフィーチャーとして組み込むことにより、Open Service Gateway initiative (OSGi)サービスをリソースとして公開できるようにします。この記事では、WSRFに関する概念を紹介し、OSGiバンドルとしてインプリメントされ、Webサービスを使用する簡単なステートフル・リソースを設計および公開する手順を説明します。また、WSRF仕様で定義されているメッセージ交換パターンの標準セットを使用して、このステートフル・リソースにアクセスする方法についても説明します。この記事で使用するサンプル・コードは、IBM Lotus Expeditor Client for Desktop V6.1.0によって提供されるOSGiランタイム用に開発されています。
この記事では、次の各方法を説明します。
- 簡単なステートフル・リソースを設計する。
- Lotus Expeditor Toolkitを使用して、WS-Resourceのプロバイダー・サイド・コンポーネントをインプリメントする。
- Lotus Expeditor Toolkitを使用して、WS-Resourceのクライアント・サイド・コンポーネントを作成する。
- WS-ResourceをLotus Expeditor Clientにデプロイする。
- WS-Resourceとともに動作するアプリケーションを開発する。
この記事は、コアJavaスキル、およびWebサービス、XML、OSGiの基礎知識があることを前提として書かれています。また、サンプル・アプリケーションを実行するには、次のものがWindowsまたはLinuxシステムにインストールされている必要があります。
- Java 1.4.2
- Lotus Expeditor Client V6.1.0 (およびWeb Services Resource Framework 6.1.0.0フィーチャー)
- Eclipse 3.2.0およびWeb Tools Project(WTP) 1.5.1
- Lotus Expeditor Toolkit(およびMobile Web Services 6.1.0フィーチャー)
Lotus ExpeditorでのWS-Resource
WS-Resourceは、1つのリソースとそのリソースへのアクセスに使用される1つのWebサービスを組み合わせたものです。Lotus Expeditor Client for Desktopは、次のコンポーネント・ステレオタイプを使用してWS-Resourceを実現します。
- リソース
WS-Resourceサービスとして公開しなければならない1つ以上のステートフルOSGiサービス・オブジェクトをカプセル化するOSGiバンドルです。これらのサービス・オブジェクトは、ShoppingCartやPrintJobなどのビジネス・エンティティーのビュー、またはPrinterなどの物理デバイスのソフトウェア・ファサードです。開発者は、このサービス・オブジェクトのインプリメンテーションをOSGiバンドルとして提供することが求められています。
- Webサービス
WS-ResourceのWebサービス・ファサードとして動作するOSGiバンドルです。このコンポーネントは、WS-ResourceのWebサービス記述言語(WSDL)の記述にしたがって、WSRF標準ポート・タイプおよびカスタム・ポート・タイプを公開します。開発者は、Mobile Web Services生成ウィザードを使用して、指定されたリソース記述の完全なWebサービス・バンドルを生成できます。
- アダプター
Webサービス・バンドルとリソース・バンドル間のブリッジとして動作するOSGiバンドルです。これは、受信Webサービス・メッセージ(WSRF標準ポート・タイプおよびカスタム・ポート・タイプの両方)を、リクエスターによって指定されたリソース・インスタンスにルーティングします。リソースからのすべての応答(例外も含む)は、アダプターおよびWebサービス・バンドルを介してルーティングされ、正常応答またはフォールトとしてリクエスターに返されます。開発者がWebサービス・バンドルを生成するとき、Mobile Web Services生成ウィザードもプレースホルダーを持つアダプター・バンドルを生成します。開発者は、アダプターをリソース・インスタンスに結合するインプリメンテーションを提供することが求められています。
- クライアント・スタブ
消費するアプリケーションが、WS-ResourceへのアクセスまたはWS-Resourceを扱うために使用できるJavaアーカイブです。このクライアント・サイド・コンポーネント(Webサービス・クライアント・スタブと呼ばれることもあります)は、Java API呼び出しを、WS-Resourceによって公開されたWSDLファイルをサブスクライブするSOAPメッセージに変換します。開発者は生成ウィザードを使用して、これらのクライアント・スタブを完全に生成することができます。
詳細については、「Lotus Expeditor Help(US)」のセクション「Lotus Expeditor用のアプリケーションの開発」を参照してください。
開発環境(Lotus Expeditor Toolkit)のセットアップと確認
Mobile Web ServicesフィーチャーをともなうLotus Expeditor ToolkitをWS-Resourceプロバイダー・コンポーネントおよびWS-Resourceクライアント・コンポーネント用の開発プラットフォームとして使用し、これらをテストします。
開発環境をセットアップするには、次の手順にしたがいます。
- Eclipse 3.2.0をWeb Tools Project(WTP) 1.5.1とともにインストールします。
- Lotus Expeditor Toolkitをインストールします。
- Eclipseを再起動します。
開発環境のセットアップを確認するには、次の手順にしたがいます。
- Eclipseを起動します。
- 「File」->「New」->「Other」を選択します。
- 「Select a wizard」ウィンドウで、「Mobile Web Services」を展開します。
- WS-Resource ClientおよびWS-Resource ProviderがMobile Web Servicesの子として表示されていることを確認します。
サンプルWS-Resourceの構築
このセクションでは、簡単なWS-Resourceの開発で使用される方法とツールを紹介し、Lotus Expeditor Toolkitを使用してこれらをテストします。開発済みのWS-Resourceのソース・コードは、この記事の「ダウンロード」セクションにあります。このセクションでは、次の手順にしたがって、WS-Resourceのすべてのコンポーネントを最初から作成します。
- サンプルWS-Resourceの設計モデルを構築する。
- WS-Resourceのリソース・バンドルをインプリメントする。
- 生成ツールを使用して、プロバイダー・サイドのコンポーネントを作成する。
- アダプター・コンポーネントをリソース・コンポーネントに結合するロジックをインプリメントする。
- 生成ツールを使用して、クライアント・サイドのコンポーネントを作成する。
- テスト・アプリケーションを開発し、実行する。
Lotus Expeditor Client for Desktop内のWS-ResourceおよびWS-Resource用のクライアント・アプリケーション・コンポーネントをパッケージ化し、デプロイする手順については、後のセクションで説明します。セキュアなWS-Resourceの開発およびアクセスについては、この記事では触れません。
サンプルWS-Resourceの設計
WS-Resourceの開発に用いる方法とツールに焦点を当てるために、アドレス(Address)のような非常に簡単なデータ・オブジェクトを使用し、これをWS-Resourceとして設計してみましょう。このリソースのプロパティーには、eMailID、preference、およびpersonDetailsが含まれます(図1参照)。PersonDetailsおよびContactInfoは、Addressリソースのリソース・プロパティーとしてステレオタイプ化されていることに注意してください。また、Address WS-Resourceの複数のインスタンスを作成(および使用)するために、設計モデルにAddressFactoryクラスが含まれています。
図1. Addressリソースの設計モデル

拡大図
リソース・バンドルの開発
前のセクションで説明した設計モデルは、Lotus Expeditor Toolkitを使用して、ここでOSGiバンドルとしてインプリメントする必要があります。リソース・バンドルは、Eclipse SDK 3.2.0(以降)のプラグイン開発ウィザードを使用して、Eclipseプラグインとして開発します。これを行うには、プラグイン開発ウィザードで、新しいプラグイン・プロジェクトを作成するときの標準として「OSGi Framework」を選択します。
このリソース・バンドルの完全なソース・コードは、「ダウンロード」セクションにあります。Addressリソースのリソース・プロパティーは、AddressInterfaceでget/setメソッドとしてエンコードされている点に注意してください。
リスト 1. com.ibm.wsrf.sampleapp.address.service.AddressInterface
public interface AddressInterface {
public void setEmailId(String emailId);
public String getEmailId();
public boolean getStatus();
public void setStatus(boolean status);
public String getPreference();
public void setPreference(String pref) throws Exception;
public float getVersionNumber();
public void setVersionNumber(float VersionNumber);
public Date getValidUntil();
public void setValidUntil(Date ValidUntil);
public PersonDetails getPersonDetails();
public void setPersonDetails(PersonDetails pDetails);
public ContactInfo getContactInfo();
/*****************************************************
* Service Methods
*****************************************************/
public ContactDetails[] getContactDetails(int type)
throws ContactDetailsNotFoundException, InvalidAddressTypeException;
public void addContactDetails(ContactDetails contactObj);
public void addDependents(String[] names);
}
|
後で、Mobile Web Services生成ウィザードを使用するときに、このbeanのようなインターフェースが使用されて、WS-Resourceのリソース・プロパティー文書が記述されます。
AddressFactoryInterfaceは、Addressリソースの新規インスタンスを作成、またはAddressインスタンスを検索するために、アダプター・コンポーネントによって使用されます。
リスト 2. com.ibm.wsrf.sampleapp.address.service.AddressFactoryInterface
public interface AddressFactoryInterface {
public String createAddress(String eMailId) throws Exception;
public void deleteAddress(String eMailId) throws Exception;
public AddressInterface getAddress(String eMailId) throws Exception;
}
|
生成されたアクティベーターを変更し、start()メソッドおよびstop()メソッドを含める必要があります。
リスト 3. com.ibm.wsrf.sampleapp.address.bundle.AddressActivator
public class AddressActivator implements BundleActivator {
private ServiceRegistration serviceRegistration = null;
public AddressActivator() {
}
public void start(BundleContext context) throws Exception {
Hashtable properties = new Hashtable();
serviceRegistration = context.registerService
(AddressFactoryInterface.class.getName(), new AddressFactoryImpl(), properties);
}
public void stop(BundleContext context) throws Exception {
serviceRegistration.unregister();
}
}
|
AddressFactoryImplインスタンスが、サービス・インプリメンテーションとして(および、AddressImplとしてではなく)登録されていることに注意してください。これは、複数のAddressリソースの作成を容易にし、対応するAddressリソース・インスタンスを検索および使用するためです。
リソース・バンドル用のプロバイダー・サイド・コンポーネントの生成
Lotus Expeditor ToolkitのMobile Web Servicesフィーチャーを使用すると、リソース・アダプターおよびWS-ResourceのWebサービス・バンドルを作成できます。生成ウィザードを使用してプロバイダー・サイドのコンポーネントを生成する方法の詳細については、「Lotus Expeditor Toolkit Help(US)」のセクション「Lotus Expeditor用のアプリケーションの開発」を参照してください。
WS-Resource Providerウィザードを使用するときは、AddressFactoryInterfaceをリソース・クラスとして指定します。ウィザードはJavaインターフェースでbeanのプロパティーをイントロスペクトし、リソース・プロパティーの候補としてプロンプトします。開発者は、これらのリソース・プロパティーを選択するか、新しいリソース・プロパティー名を指定します。これらのプロパティーは、リソース・プロパティー文書を構築するために使用されます。
WS-Resource Providerウィザードで、次のように操作します。
- WS-Resource LifetimeプロパティーとExpose Service Methodsプロパティーを選択する。
- Enable Securityプロパティーは選択しない。
- ウィザードの「Resource Property」パネルに表示されているすべてのリソース・プロパティーを選択する。
- ウィザードの「Service Methods」パネルで、Addressリソース設計モデル(図1)でサービス・メソッドとして識別されているメソッドだけを選択する。
- 必要に応じて、ウィザードでプラグイン・プロパティーおよびプロジェクト・プロパティーを編集する。
生成されたコードのリソース・バンドルとの結合
WS-Resource Providerウィザードは、Eclipseワークスペースで2つのプロジェクトを生成します。アダプター・バンドルとWebサービス・バンドルで、どちらもプロバイダー・サイドのバンドルです。Webサービス・バンドルは変更の必要がなく、そのままデプロイできますが、アダプター・バンドルは編集し、リソース・バンドルに結合する必要があります。
生成されたコードでアダプター・バンドルを探すと、次のJavaクラスがTODO付きのプレースホルダーを持っていることがわかります。
<Address>LifeTimeManager.java
<Address>PropertyManager.java
AddressLifeTimeManagerクラスでは、createResource()、destroyResource()、およびgetResource()の各操作のインプリメンテーションを提供する必要があります。これらの操作は、Addressリソース・バンドルのAddressFactoryImplによって提供される、対応するサービスを使用するよう結合されています。
createResource()操作の結合
クライアント・アプリケーションが新しいAddressリソースを作成するときは、createResource()メッセージをWS-Resourceプロバイダーに送信します。WSRFは、このメッセージをアダプター・コンポーネントのAddressLifeTimeManagerクラスにルーティングします。createResource()用の初期化パラメーターは、XML文書としてConfigInfoパラメーターで送信されます。このXML文書は、AddressLifeTimeManagerのcreateResource()操作でResourceConfigurationオブジェクトとして利用できます。
この初期化パラメーターはResourceConfigurationから抽出され、createAddress()メッセージとともにAddressFactoryImplに送信されることに注意してください。
リスト 4. createResourceのコード・スニペット
public ResourceConfiguration createResource(Element configInfo)
_throws ResourceUnavailableFault, ResourceUnknownFault, Exception {
Element ele = (Element)configInfo.getElementsByTagName("eMailID").item(0);
System.out.println(ele.getFirstChild().getNodeValue());
String emailIdfromClient = ele.getFirstChild().getNodeValue();
String eMailIdValue = getAddressFactory().createAddress(emailIdfromClient);
ResourceConfiguration resourceConfiguration = new ResourceConfiguration();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
Text text = document.createTextNode(eMailIdValue);
resourceConfiguration.addConfigurationInfo(emailIdQName, text);
return resourceConfiguration;
}
|
AddressFactoryを使用してリソースを作成した後、LifeTimeManagerのcreateResource操作は、以降のAddressインスタンスの識別に使用されるResourceConfigurationを用いてクライアントに応答します。ResourceConfiguration情報は、クライアント・アプリケーションに返されるEndPointReferenceのReferenceParameterにカプセル化されています。
getResource()操作の結合
同様に、クライアント・アプリケーションがリソースにアクセスし、そのリソース・プロパティー文書を使用する、WS-Resourceを廃棄する、またはWS-Resourceにサービス・メソッドを呼び出すとき、WSRFは最初にAddressLifeTimeManagerでgetResource()操作を使用してAddressリソースのインスタンスを取得しようと試みます。ResourceConfiguration情報が再び使用され、AddressFactoryImplの補助によって、Addressリソースのインスタンスが一意に識別されます。getResource()操作はAddressFactoryImplのgetAddress()メソッドを呼び出して、Addressオブジェクトを検索することに注意してください。
リスト5. getResourceのコード・スニペット
public Object getResource(ResourceConfiguration resourceConfiguration)
throws ResourceUnavailableFault, Exception {
Node emailIdValue =
resourceConfiguration.getConfigurationInfo(emailIdQName);
System.out.println(emailIdValue);
Text textInfo = (Text) emailIdValue;
System.out.println(textInfo);
String eid = textInfo.getNodeValue();
System.out.println("ID from getResource::AddressLifeTimeManager :"+eid);
Object addressObj = getAddressFactory().getAddress(eid);
if(addressObj == null){
throw new ResourceUnavailableFault
("Resource Not Available !!", new Exception());
}else{
return addressObj;
}
}
|
destroyResource()操作の結合
Addressリソースは、クライアント・アプリケーションからのdestroy()メソッドによって、またはTerminationTimeに達したときに破棄されます。リソースを破棄するとき、フレームワークはアダプター・コンポーネントのAddressLifeTimeManagerクラスのdestroyResource()メソッドを呼び出します。Addressリソースのインスタンスを一意に識別するために、ResourceConfiguration情報が使用されます。
リスト6. destroyResourceのコード・スニペット
public void destroyResource(ResourceConfiguration resourceConfiguration)
throws ResourceUnavailableFault, ResourceNotDestroyedFault,Exception {
Node emailIdValue = resourceConfiguration.getConfigurationInfo(emailIdQName);
Text textInfo = (Text) emailIdValue;
String eid = textInfo.getNodeValue();
System.out.println("ID from destroyResource::AddressLifeTimeManager :"+eid);
getAddressFactory().deleteAddress(eid);
}
|
PropertyManagerの操作の結合
リソース・プロパティー文書のリソース・プロパティーの値は、常にリソースのインスタンスによって保持されています。フレームワークはこれらの値をキャッシュしませんが、WS-Resourceの任意のインスタンスに対し、有効なすべてのリソース・プロパティー名のリストをリソース・プロパティー文書で維持します。WS-Resourceのリソース・プロパティー文書の変更をともなうすべてのWSRFメッセージは、アダプターのPropertyManagerクラスによって処理されます。メッセージを消費するか、同じメッセージをリソース・バンドルに転送するかを選択できます。
AddressPropertyManagerクラスでは、生成されたコードは、すべてのプロパティーのget/update/delete/insertの各操作用のプレースホルダーを持っています。前述のように、開発者は、getまたはupdateメッセージをAddressリソースに転送するインプリメンテーションを提供できます。同様に、deleteおよびinsertメッセージをAddressリソースのインスタンスに転送することもできます。
この例では、次のことに注意してください。(a) preferenceプロパティーのupdate操作は、setPreference()メッセージとしてAddressリソースのインスタンスに送信されます。(b) get操作はgetPreferenceメッセージとしてAddressリソースのインスタンスに送信されます。(c) insert操作はsetPreference()メッセージとしてAddressリソースのインスタンスに送信されます。(d) delete操作には追加インプリメンテーションがありません。
リスト7. AddressPropertyManagerのコード・スニペット
(a) public void updatePreference(Object resource, Object value)
throws ResourceUnavailableFault,
UnableToModifyResourcePropertyFault,
UpdateResourcePropertiesRequestFailedFault,
InvalidModificationFault,
BaseFault, Exception {
com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
java.lang.String inValue = (java.lang.String)value;
resourceRef.setPreference(inValue);
}
(b) public Object getPreference(Object resource)
throws ResourceUnavailableFault, Exception {
com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
java.lang.String retValue = resourceRef.getPreference();
return retValue;
}
(c) public void insertPreference(Object resource, Object value)
throws ResourceUnavailableFault,
UnableToModifyResourcePropertyFault,
InsertResourcePropertiesRequestFailedFault,
InvalidModificationFault,
BaseFault, Exception {
com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
java.lang.String inValue = (java.lang.String)value;
resourceRef.setPreference(inValue);
}
(d) public void deletePreference(Object resource)
throws ResourceUnavailableFault,
DeleteResourcePropertiesRequestFailedFault, Exception {
com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
}
|
クライアント・アプリケーションがEndPointReferenceによって指定されたAddressのリソース・プロパティー値を取得するときは、リソース・プロパティーのQNameをパラメーターとして含めてgetResourcePropertyメッセージを送信します。フレームワークは、最初にAddressリソースのインスタンスを取得するために、このメッセージをアダプター・コンポーネントにルーティングします。AddressLifeTimeManagerのgetResource()操作によって、Addressリソースのインスタンスが取得されます。その後、フレームワークはAddressPropertyManagerのgetPreference()操作を呼び出します。AddressPropertyManagerのgetPreference()操作は、Addressリソースの対応する操作にこのメッセージを転送します。
開発者は、残りのリソース・プロパティーに、同様のインプリメンテーションを提供する必要があります。
|
ヒント: リソース・プロパティーが読み取り専用として設計されている場合は、これらの操作に追加インプリメンテーションを提供せずにupdateおよびinsertメッセージを消費するか、updateおよびinsert操作のインプリメンテーションで例外(たとえば、InvalidModificationFault)をスローすることができます。リソース・プロパティーが必須プロパティーとして設計されている場合は、delete操作のインプリメンテーションでDeleteResourcePropertiesRequestFailedFault例外をスローできます。 |
サービス・マネージャーの操作の結合
WS-Resourceのカスタム・ポート・タイプ(サービス・メソッドと呼ばれることもあります)は、アダプター・コンポーネントのAddressServiceManagerの一部として生成されます。コード・ジェネレーターは、デフォルトで、これらの操作をAddressリソースの適切なメソッドに結び付けるコードを生成します。この点では、生成されたコードを変更する必要はありません。
サンプルWS-Resource用のクライアント・サイド・コンポーネントの生成
すべてのプロバイダー・サイドのコンポーネント(リソース・バンドル、アダプター・バンドル、およびWebサービス・バンドル)の開発が完了した後は、これらのWS-Resourceプロバイダー・コンポーネントをWS-ResourceとしてLotus Expeditor Toolkitにデプロイします。WS-Resourceプロバイダー・バンドルとともにClient Services Serverを起動する方法の詳細については、「Lotus Expeditor Help(US)」のセクション「Lotus Expeditor用のアプリケーションの開発」を参照してください。
WS-Resourceが消費される準備ができているかどうかを判断するには、ブラウザーに「http://localhost/ws/pid/Address?wsdl」というURLを入力します。WS-ResourceのpidはAddressです。ブラウザーに、Addressリソースを記述するWSDLファイルが表示されます。
これで、Mobile Web Servicesツールを使用して、クライアント・コンポーネントを生成できるようになりました。Mobile Web ServicesツールキットのWS-Resource Clientウィザードを使用して、クライアント・スタブのコードを生成します。生成ウィザードを使用してクライアント・サイドのコンポーネントを生成する方法の詳細については、「Lotus Expeditor Help(US)」のセクション「Lotus Expeditor用のアプリケーションの開発」を参照してください。
生成されたコードを変更する必要はありません。
WS-Resource用の簡単なテスト・クライアント・アプリケーションの開発
WS-Resourceをテストするには、テスト・アプリケーションを開発する必要があります。このテスト・アプリケーションは、クライアント・サイドのコンポーネントを使用して、次のことを行います。
- 新しいWS-Resource (Address)インスタンスを作成する。
- 標準WSRFメッセージを送信する。
- カスタムportTypeから操作を呼び出す。
テスト・クライアント・アプリケーションのmain()メソッドを以下に示します。
リスト8. テスト・クライアントのコード・スニペット
public static void main(String[] args) {
String resourceUniqueId = "wsrf_support@ibm.com";
TestClient tc = new TestClient();
EndpointReference resEPR = null;
/**
* Creates the WS-Resource with the given resource configuration and
* returns the EPR for further interaction with the WS-Resource.
*/
try {
resEPR = tc.createResource(resourceUniqueId);
if (resEPR != null)System.out.println("Resource created !! \n");
} catch (Exception e) {
e.printStackTrace();
}
OperationContext opContextObj = new OperationContext();
opContextObj.setToEPR(resEPR);
AddressSoap_Stub stubObj = new AddressSoap_Stub();
stubObj.setCurrentOperationContext(opContextObj);
boolean updateResult = tc.testUpdateResourceProperty();
if(updateResult == true)System.out.println
("Update Resource Property :: SUCCESS");
else System.out.println("Update Resource Property :: FAILED");
boolean addResult = tc.testAddDependants();
if(addResult == true)System.out.println("Add Dependants :: SUCCESS");
else System.out.println("Add Dependants :: FAILED");
}
}
|
上記のコードには、次の手順が含まれていることに注意してください。
- 新しいAddressリソースを作成し、EndPointReference (EPR)を取得する。
- OperationContextをセットアップする。
- WSRF標準操作、つまりpreferenceリソース・プロパティーのupdateResourcePropertiesをテストする。
- サービス・メソッド、つまりAddressリソースのaddDependentsを、1つの従属を追加することによってテストする。
完全なコードについては、「ダウンロード(US)」セクションを参照してください。
また、前のコード・スニペットでは、クライアントとWS-Resource間の通信チャネルのセットアップにOperationContextが使用されていました。OperationContextは、メッセージのソースをfromEPRに、メッセージのターゲットをtoEPRに保持します。OperationContextが有効なtoEPRを保持していることを確認する必要があります。WS-Resourceに操作を実行する前に、スタブ・オブジェクトのsetCurrentOperationContext(opContextObj)操作を呼び出すことによって、現在のOperationContextを設定してください。
前述のように、新しいAddressリソースを作成するときは、初期化パラメーターを、ConfigInfoパラメーター内のXML文書およびTerminationTimeプロパティーの初期値として送信する必要があります。AddressLifeTimeManagerは次のResourceConfiguration XML文書を解析するようインプリメントされているので、ConfigInfo XML文書は同じ構造を持っています。
リスト9. ConfigInfo XML文書
<ConfigInfo>
<AddressResource/>
<eMailID>
wsrf_support@ibm.com
</eMailID>
</ConfigInfo>
|
WS-Resourceを作成するコードは、次のとおりです。
リスト10. createResourceinテスト・クライアントのコード・スニペット
public EndpointReference createResource(String uniqueId)
throws Exception {
String hostName = "localhost"; // Hostname of the WebService
String serviceName = "Address"; // Service Name of the Resource
String uriString = "http://" + hostName + "/ws/pid/"
+ serviceName+ "?wsdl";
WSAddressingService addressingObj = new WSAddressingServiceImpl();
// creating the EPR of resourceFactory
EndpointReference resourceFactoryEPR =
addressingObj.createEndpointReference(uriString);
// prepare configInfo parameter for createResource()
Node[] configInfo = getConfigInfo(uniqueId);
// prepare initTerminationTime parameter for createResource()
Calendar initTermTime = Calendar.getInstance();
int curr = initTermTime.get(Calendar.HOUR);
initTermTime.set(Calendar.HOUR, curr + 1);
// Prepare the channel for communicating with Resource Factory
OperationContext opContextObj = new OperationContext();
opContextObj.setToEPR(resourceFactoryEPR);
// Set the resourceFactoryEPR as toEPR
stubObj.setCurrentOperationContext(opContextObj);
// Set the current OperationContext
// Send createResource() message to the resourceFactory
EndpointReference resourceEPR =
stubObj.createWSResource(configInfo, initTermTime);
return resourceEPR;
}
|
リスト10では、次の点に注意してください。
- EndpointPointReferenceオブジェクトが、リソース・ファクトリー用に構築されます。この場合、EndPointReferenceのURLはAddressリソース自身のURLと同じになります。
- クライアントからリソース・ファクトリーへの通信チャネルが作成されます。OperationContextオブジェクトが作成され、リソース・ファクトリーのEndPointReferenceはtoEPRに設定されます。
- Addressリソースのスタブ・オブジェクトを使用して、createResource()メッセージがリソース・ファクトリーに送信されます。
- リソース・ファクトリーは、新たに構築されたAddressリソース・オブジェクトのEndPointReferenceを用いて応答します。
最後に、テスト・アプリケーションが実行されると、次のような結果が表示されます。
リスト11. テスト・クライアントの出力
Start Of Program !!
Resource created !!
Update Resource Property :: SUCCESS
Add Dependants :: SUCCESS
End Of Program !!
|
ランタイム環境(Lotus Expeditor Client V6.1.0)のセットアップ
Lotus Expeditor Client for Desktopは、Addressリソースをデプロイするために使用されるランタイムです。このセクションでは、サンプルWS-Resourceを実行するランタイム環境をセットアップする手順について説明します。
ランタイムをセットアップするには、「Lotus Expeditor Help(US)」の説明にしたがって、Lotus Expeditor Client V6.1.0をWindowsまたはLinuxにインストールし、WSRF V6.1.0.0フィーチャーをLotus Expeditor Clientにインストールします。
ランタイムのセットアップを確認するには次の手順にしたがいます。
- -consoleオプションを使用して、Lotus Expeditor Clientを起動します。
- コンソール・ウィンドウで、インストール済みのすべてのプラグインの状態を表示するために、「ss」と入力します。
- プラグインのリストで、com.ibm.pvcws.osgi_6.1.0プラグイン、およびすべてのWSRFプラグインがアクティブな状態にあることを確認します。アクティブでない場合は、そのプラグインを開始します。
Lotus ExpeditorへのサンプルWS-Resourceのデプロイ
Lotus Expeditor Client for Desktopを稼働した後は、次の手順にしたがって、Address WS-Resourceプロバイダー・コンポーネントをデプロイします。AddressResourceのビルト済みフィーチャーのデプロイ方法については、「ダウンロード」セクションのREADME.txtを参照してください。
Address WS-Resourceフィーチャーのデプロイメント用の準備
Address WS-ResourceをLotus Expeditor Client for Desktopにインストールするには、WS-Resourceをフィーチャーとしてパッケージ化する必要があります。次の手順にしたがって、フィーチャーを作成します。
- Lotus Expeditor Toolkitで、新しいフィーチャー・プロジェクトを作成するために「ファイル」->「新規」->「AddressFeature」(例)を選択します。
- 「参照済みプラグインおよびフラグメント」ウィンドウで、AddressResource、AddressAdapter、およびAddressWebserviceの各プラグインを選択します。
- 「終了」をクリックします。
- 新たに作成されたフィーチャー・プロジェクトを右クリックし、メニューから「エクスポート」を選択します。
- 「エクスポート」ウィンドウで、「Deployable features」オプションを選択し、「次へ」をクリックします。
- ディレクトリーを入力し、「終了」をクリックします。
フィーチャーとしてのWS-Resourceのデプロイ
WS-Resourceをフィーチャーとしてデプロイするには、次の手順を実行します。
- Lotus Expeditor Clientで、「ファイル」->「アプリケーション」->「インストール」を選択します。
- 「インストールする新規フィーチャーを検索」を選択し、「次へ」をクリックします。
- 「フォルダーの場所の追加」をクリックし、前の手順5でフィーチャーをエクスポートした場所を選択し、「終了」をクリックします。
- デプロイメントを反映するために、Lotus Expeditor Clientを再起動します。
WS-Resourceのデプロイメントの確認
-consoleオプションを使用してLotus Expeditor Clientを起動した後は、新たにインストールしたプラグインが開始していることをコンソール・ウィンドウでチェックします。
AddressリソースのWSDLが正しく公開されていることを確認するには、ブラウザーで「http://HostAddress:Port/ws/pid/ResourcePID?wsdl」というURLを入力します。HostAddressはLotus Expeditor ClientをホストするノードのIPアドレスで、PortはWeb サービスが実行されているポートです。また、ResourcePIDはリソースの名前です。
たとえば、Lotus Expeditor Client V6.1.0 Webコンテナー・コンポーネントがポート80で実行され、すべてのIPアドレスを受け取るよう構成されている場合、サンプルのURLは「http://localhost/ws/pid/Address?wsdl」となります。
サンプル・クライアント・アプリケーションの実行
AddressリソースをLotus Expeditor Client for Desktopにデプロイした後は、この記事で取り上げたサンプル・クライアント・アプリケーションを実行できます。このサンプル・アプリケーションはStandard Widget Toolkit (SWT)ベースのJavaプログラムです。ユーザーはこのアプリケーションを使用して、さまざまなWSRF標準メッセージおよびAddressリソースで定義されたカスタム・メッセージを送信できます。
このクライアント・アプリケーションは、Lotus Expeditor Client向けのWSRFのすべてのAPIフィーチャーのデモを行うようにインプリメントされています。フィーチャーは、メニュー・オプションの「WSRF Standard Operations」および「WSRF Custom Operations」を使用して調べられます。「WSRF Custom Operations」メニューでは、ファクトリー・メソッドとサービス・メソッドを試すことができます(図2参照)。
図2. 「WSRF Custom Operations」メニュー

「WSRF Standard Operations」メニューでは、すべてのWSRFリソース・プロパティー操作およびWSRF lifetime操作を試すことができます(図3参照)。
図3. 「WSRF Standard Operations」メニュー

まとめ
この記事では、簡単なWS-Resourceを構築する方法、およびそれをLotus Expeditor Client for Desktopにデプロイする方法について説明しました。また、プロバイダー・サイドおよびクライアント・サイドのコンポーネントの生成に使用するツールを紹介しました。さらに、この記事で開発したWS-Resourceをテストするテスト・クライアントの開発方法についても説明しました。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Sample WS-Resource files | WSRF_AddressResourceSample.zip | 287 KB | HTTP |
|---|
参考文献 学ぶために
議論するために
著者について  | |  | Sivananthan Perumal is a Senior Staff Software Engineer, working in IBM Software Labs India. He has been working on Web services and related technologies for over three years. You can reach him at siva.perumal@in.ibm.com. |
記事の評価
|