|
John Hsu (johnhsu@tw.ibm.com), Software engineer, IBM
レベル:中級
原文の掲載:2006年11月28日
原文はこちら (US)
IBM Lotus Expeditor ToolkitおよびIBM Rational Application Developer V6を使用して、IBM
Lotus Expeditorで実行されるOSGiサービスをWebサービスとしてプログラマチックに公開する方法を理解しましょう。また、この記事では、IBM
Lotus Expeditorランタイムを使用して、サービスをデプロイおよびテストする方法についても解説します。
IBM Lotus Expeditor (以前のIBM WebSphere Everyplace Deployment) は、接続、独立した配布、およびアプリケーションとサービスの管理を可能にするクライアント・ミドルウェア・フレームワークおよびツール用のプラットフォームです。IBM
Lotus ExpeditorはOpen Service Gateway initiative (OSGi)フレームワーク上に構築され、WebサービスおよびEnterprise
JavaBean (EJB)などのJ2EEサービスをクライアントに提供するため、ユーザーはアプリケーションの主要コンポーネントをクライアントに移動できます。また、IBM
Lotus Expeditorによって、ほとんどのビジネス・アプリケーションがローカルで実行できるため、モバイル・ユーザーはネットワーク接続がない状態でもアプリケーションを使い続けられ、ネットワーク接続が利用可能になったときに、サーバーと同期することができます。
IBM Lotus ExpeditorはJSR 172: J2ME Webサービス仕様にしたがってWebサービスをサポートしますが、JSR
172仕様以外の機能も提供します。このような機能の1つとして、OSGiサービスをWebサービスにマッピングする(および、この逆にマッピングする)、IBM
WebSphere Web Services Gatewayがあります。このため、Java APIs for XML-based
Remote Procedure Call (JAX-RPC)を使用することにより、IBM Lotus Expeditorの外部で実行されているアプリケーションも、IBM
Lotus Expeditor上で実行されているOSGiサービスを呼び出すことができます。
IBM Lotus Expeditorは、ユーザーがリッチ・クライアント・ユーザー・インターフェースを介して自身のOSGiサービスをWebサービスとして公開することを補助するWeb
Services Gateway Utilityを提供します。しかし、これは一部の状況で不便なことがあります。たとえば、1つのアプリケーションを開発して多数のクライアントに配布するときは、各ユーザーに対し、Web
Services Gateway Utilityを開いてサービスを手動で公開するよう依頼することは望ましくありません。むしろ、これはプログラマチックに行う方がよいでしょう。この記事では、簡単なOSGiサービス・バンドルを開発し、IBM
Lotus Expeditorによって提供される開発ツールキットを介して、それをWebサービスとして公開する方法について説明します。
前提条件
この記事を最大限に活用するには、Java、J2EE、Webサービス、OSGiフレームワーク、およびIBM Rational Application Developer V6 for WebSphere Software(US) またはEclipse 3.x(US)を使用したプラグイン開発に習熟している必要があります。以下で説明されている手順を実行する前に、IBM
Lotus Expeditor Toolkit V6.1とともに、IBM Rational Application Developer
V6またはEclipse 3.2のいずれかをインストールしなければなりません。また、IBM
Lotus Expeditor Clientのインストールも必要です。
developerWorksから、トライアル版のIBM Rational Application Developer V6.0 (US)をダウンロードできます。
この記事では、次のタスクを実行します。
- OSGiサービスを登録するClient Servicesプロジェクトを作成する。
- OSGiサービスをWebサービスとして公開する。
- Client Servicesプロジェクトをデプロイする。
- デプロイしたWebサービスをテストする。
OSGiサービスを登録するClient Servicesプロジェクトの作成
まず、Webサービスとして公開できるOSGiサービスを作成することから始めましょう。IBM
Lotus Expeditor Toolkitでは、これはClient Serviceプロジェクトを作成することによって行います。この記事は、Rational
Application DeveloperおよびIBM Lotus Expeditor Toolkitがすでにインストールされているものとして説明を進めます。このツールキットは、Rational
Application Developer環境を拡張し、OSGiベースおよびEclipseベースのアプリケーションの構築を可能にします。
次の手順ではRational Application DeveloperでOSGiサービスを作成しますが、IBM
Lotus Expeditor Toolkitがインストールされている場合は、Eclipseでも同じことを実行できます。
- 1. Rational Application Developerで、「ウィンドウ」->「パースペクティブを開く」->「プラグイン開発」を選択し、「プラグイン開発」パースペクティブに切り替えます。
- 「ファイル」->「新規」->「プロジェクト」を選択します。
- 「新規プロジェクト(New Project)」ウィザードで、「Client ServicesProject」を選択し、「次へ(Next)」をクリックします(図1参照)。
図1. 「新規プロジェクト」ウィザード

- 「Client ServiceProject」パネルで、「プロジェクト名」フィールドに「WSGateway」と入力し、「次へ」をクリックします。
- ウィザードの次のパネルで、デフォルト設定を受け入れ、「完了」をクリックします。
- Client Serviceプロジェクトが作成された後、「ファイル」->「新規」->「インターフェース」を選択し、インターフェース名「OSGiService」およびパッケージ名「wsgateway」を入力します。Rational
Application Developerによって、パブリック・インターフェースOSGiServiceが作成されます。インターフェースのコードをリスト1に示します。getResultメソッドはテスト・メソッドです。ここでは、OSGiサービスを開発し、Webサービスとして公開するため、どちらのサービスにも、他からの呼び出しを受けるパブリック・メソッドが少なくとも1つ必要です。
リスト1. OSGiServiceインターフェース
package wsgateway;
public interface OSGiService {
public String getResult();
} |
- 次に、「ファイル」->「新規」->「クラス」を選択し、クラス「OSGiServiceImpl」およびパッケージ名「wsgateway」を入力します。OSGiサービスまたはWebサービスを作成するとき、一般的な手法として、1つのインターフェースと1つのインプリメンテーション・クラスを作成します。これはコードをより柔軟にするためのベスト・プラクティスですが、必須ではありません。1つのクラスを作成し、これをOSGiサービスとして、およびWebサービスとして登録することもできます。この方法は、IBM
Lotus Expeditor Toolkitでは禁止されていませんが、推奨される方法ではありません。インプリメンテーション・クラスをリスト2に示します。
リスト2. OSGiServiceImplクラス
package wsgateway;
public class OSGiServiceImpl implements OSGiService {
public String getResult() {
return "This is OSGiServiceImpl";
}
} |
- リスト3のコードをActivator.javaのstart()に追加します。このコードは、OSGiフレームワーク用にOSGiServiceを登録します。
リスト3. Activator.java
public void start(BundleContext context) throws Exception {
super.start(context);
Hashtable properties = new Hashtable(7);
properties.put(Constants.SERVICE_PID, wsgateway.OSGiService.class.getName());
context.registerService(wsgateway.OSGiService.class.getName(), new OSGiServiceImpl(),_
properties);
} |
- 完了したら、このClient Servicesプロジェクトを実行し、サービスをOSGiフレームワークに登録できるかどうか確認します。Rational
Application Developerで、「実行」->「実行」を選択します。
- 「実行」ダイアログ・ボックスで、「Client Services」を選択し、「新規」をクリックします。
- 「プラグイン(Plug-ins)」タブを選択し、「ワークスペース・プラグイン(Workspace
Plug-ins)」の選択を解除し、「WSGateway」を選択します(図2参照)。
- 「必須プラグインの追加」ボタンをクリックし、「実行」をクリックします。
図2. 「実行」ダイアログ・ボックスの「プラグイン」タブ

- 「コンソール(Console)」タブを選択し、「ss」と入力し、WSGatewayのバンドル番号を見つけます(図3参照)。
図3. コンソール

- WSGatewayのバンドル番号を見つけた後、コンソールで「start xxx」と入力します。xxxはWSGatewayのバンドル番号です。
- 次に、コンソールで「s」と入力し、wsgateway.OSGiServiceがOSGiフレームワークに登録されていることを確認します(図4参照)。
図4. wsgateway.OSGiServiceが表示されたコンソール

WebサービスとしてのOSGiサービスの公開
OSGiサービスを作成し、これをOSGiフレームワークに正しく登録した後は、OSGiサービスをWebサービスとして公開できます。リスト4に示したコードをActivator.javaのstart()メソッドに追加します。
リスト4. Activator.java
public void start(BundleContext context) throws Exception {
super.start(context);
Hashtable properties = new Hashtable(7);
WebServiceProvider provider;
String providerName = "com.ibm.pvcws.osgi.proxy.WebServiceProvider";
ServiceReference ref = context.getServiceReference(providerName);
provider = (ref == null) ? null : (WebServiceProvider)context.getService(ref);
properties.put(Constants.SERVICE_PID, wsgateway.OSGiService.class.getName());
context.registerService( wsgateway.OSGiService.class.getName(), new OSGiServiceImpl(),_
properties);
/* provider.exportPid(wsgateway.OSGiService.class.getName());
System.out.println(wsgateway.OSGiService.class.getName() + " exposed as a Web Service at_
http://localhost:8777/ws/pid/" + wsgateway.OSGiService.class.getName());*/
ref = context.getServiceReference (wsgateway.OSGiService.class.getName());
String sid = ref.getProperty("service.id").toString();
provider.exportSid(sid);
System.out.println(wsgateway.OSGiService.class.getName() + "
exposed as Web Service at http://localhost:8777/ws/sid/" + sid);
} |
OSGiサービスをWebサービスとして公開するには、サービスsidとpidの2とおりの方法があります。前のリストで太字で示した部分は、両方の方法に共通するコードです。「ref
= context.getServiceReference (wsgateway.OSGiService.class.getName());」で始まる最後の行はsid方式のコードです。コメントになっているコードがpid方式のコードです。
com.ibm.pvcws.service.WebServiceProviderをActivator.javaにインポートし、META-INFフォルダーでMANIFEST.MFを開きます。次に、「依存関係(Dependencies)」タブに切り替えます(図5参照)。
図5. 「依存関係(Dependencies)」タブ

「必須プラグイン」セクションで、「追加」ボタンをクリックします。「プラグイン選択」ボックスの「プラグインの選択」フィールドに「com.ibm.pvcws.osgi」と入力し、「OK」をクリックします。
Client Servicesプロジェクトのデプロイ
これまでに、必要なコードを追加し、OSGi サービスをWebサービスにするための構成を行ってきました。ここでは、Client
ServicesプロジェクトをIBM Lotus Expeditorランタイムにデプロイします。java.exeとともに実行する一般的なJ2SEアプリケーションと異なり、ほとんどのJ2EEアプリケーションはJ2EEアプリケーション・サーバーにデプロイする必要があります。この記事では、アプリケーションをIBM
Lotus Expeditorランタイムにデプロイします。このランタイムは、J2EEアプリケーション・サーバー機能の一部を提供します。
次の手順にしたがって、Client Servicesプロジェクトをデプロイします。
-
前の「OSGiサービスを登録するClient Servicesプロジェクトの作成」セクションの手順9から13を繰り返します(ただし、構成はすでに実行済みなので、手順10はスキップします)。手順11で、「引数(Arguments)」タブを選択し、「-Dcom.ibm.pvc.webcontainer.port=0」を「8777」に変更します(図6参照)。
図6. 「引数Arguments」タブ

- コンソールで、com.ibm.pvcws.osgiおよびorg.eclipse.equinox.httpを見つけ、これらを開始します。
- もう一度コンソールで、WSGatewayを見つけて開始します。
- Webブラウザーを開き、コンソールに表示されたURLを入力します。成功すると、Webサービス記述言語(WSDL)が表示されます(図7参照)。
図7. Webブラウザーに表示されたWSDL

デプロイしたWebサービスのテスト
これで、Webサービスをデプロイすることができました。正しくデプロイされているか、確認してみましょう。IBM
Lotus Expeditor Toolkitには、それを行うための簡単な機能があります。WSDLファイルが存在する限り、IBM
Lotus Expeditor Toolkitはそれを解析し、JSR 172にしたがって必要なスタブ・コードを生成できます。これらのスタブを使用して、Webサービスをテストできます。
次の手順にしたがって、デプロイされたWebサービスをテストします。
- 前の「OSGiサービスを登録するClient Servicesプロジェクトの作成」セクションの手順1から5を繰り返し、WSGatewayClientというプロジェクト名を持つ別のClient
Servicesプロジェクトを作成します。
- 「ファイル」->「新規」->「その他」を選択します。
- 「Client Services」->「モバイルWebサービス」->「モバイルWebサービス・クライアント」を選択し、「次へ」をクリックします(図8参照)。
図8. 「新規」ウィザード

- 「モバイルWebサービス・クライアント」ダイアログ・ボックスのフィールドに、次の値を入力します(図9参照)。
- ソース・フォルダー:/WSGatewayClient/src
- パッケージ: wsgatewayclient
- WSDLのロケーション: http://localhost:8777/ws/pid/wsgateway.OSGiService
図9. 「モバイルWebサービス・クライアント」ダイアログ・ボックス

- 「次へ」をクリックし、「完了」をクリックします。
- WSGatewayClientにあるActivator.javaのconsumeService()で、リスト5のコードを追加します。このコードは、IBM
Lotus Expeditor Toolkitによって生成されたスタブを呼び出します。
リスト5. consumeService()
private void consumeService() throws Exception {
wsgatewayclient.OSGiServiceSoap_Stub stub = new wsgatewayclient.OSGiServiceSoap_Stub();
System.out.println(stub.getResult());
} |
- WSGatewayサービスがpid方式を使用してWebサービスを公開していることを確認します。sidを使用する場合は、クライアントを作成するときに、WSDL
URL内のsid番号が正しくなければなりません。プログラムの引数として「-clean」を追加すると、この番号が変わる可能性があるからです。
- 前のセクションで起動したIBM Lotus Expeditorランタイムを停止します。次に、「プロジェクトのデプロイ」セクションの手順1から3を繰り返し、IBM
Lotus Expeditorランタイムを再び実行します。ただし、手順1ではWSGatewayおよびWSGatewayClientを選択します。
- 「ss」と入力し、WSGatewayClientのバンドルIDを見つけ、これを開始します。出力された結果がコンソール・タブに表示されます(図10参照)。
図10. コンソール

まとめ
この記事では、IBM Rational Application DeveloperにインストールされたIBM
Lotus Expeditor Toolkitを使用して、IBM Lotus ExpeditorでWebサービスとして実行されるOSGiサービスをプログラマチックに公開する方法を解説しました。同じ作業を個々のクライアント上でGUIツールを使用して行うこともできますが、大量のインストールを実行するとき、または多数のクライアントでこの種のサービスを自動的に更新するときは、プログラマチックに行うと効率が大幅に向上します。また、この機能は、IBM
Lotus Expeditorで実行されている各サービスをWebサービスとして公開し、IBM
Lotus Expeditorの外部から呼び出せるようにするときも役立ちます。これは、IBM
Lotus Expeditorが他のアプリケーションとの良好な相互運用性を提供することを意味し、サービス指向アーキテクチャー(SOA)のソリューションを構築する上で、IBM
Lotus Expeditorが優れたフレームワークとなることを示します。
リソース
筆者について
 |
|
 |
John Hsuは台湾(台北)にあるIBM China Software Development Labのソフトウェア技術者です。
Johnは、ソフトウェア開発と実験の経験があり、現在はIBM Lotus Expeditorの開発に取り組んでいます。
|
|