IBM Lotus ExpeditorのWebサービスとしてOSGiサービスを開発する

IBM Lotus Expeditor ToolkitおよびIBM Rational Application Developer V6を使用して、IBM Lotus Expeditorで実行されるOSGiサービスをWebサービスとしてプログラマチックに公開する方法を理解しましょう。また、この記事では、IBM Lotus Expeditorランタイムを使用して、サービスをデプロイおよびテストする方法についても解説します。

John Hsu (johnhsu@tw.ibm.com), Software engineer, IBM

John Hsuは台湾(台北)にあるIBM China Software Development Labのソフトウェア技術者です。 Johnは、ソフトウェア開発と実験の経験があり、現在はIBM Lotus Expeditorの開発に取り組んでいます。



2006年 11月 28日

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のインストールも必要です。

Eclipse 3.x(US)

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. 1. Rational Application Developerで、「ウィンドウ」->「パースペクティブを開く」->「プラグイン開発」を選択し、「プラグイン開発」パースペクティブに切り替えます。
  2. 「ファイル」->「新規」->「プロジェクト」を選択します。
  3. 「新規プロジェクト(New Project)」ウィザードで、「Client ServicesProject」を選択し、「次へ(Next)」をクリックします(図1参照)。

    図1. 「新規プロジェクト」ウィザード
    図1. 「新規プロジェクト」ウィザード
  4. 「Client ServiceProject」パネルで、「プロジェクト名」フィールドに「WSGateway」と入力し、「次へ」をクリックします。
  5. ウィザードの次のパネルで、デフォルト設定を受け入れ、「完了」をクリックします。
  6. Client Serviceプロジェクトが作成された後、「ファイル」->「新規」->「インターフェース」を選択し、インターフェース名「OSGiService」およびパッケージ名「wsgateway」を入力します。Rational Application Developerによって、パブリック・インターフェースOSGiServiceが作成されます。インターフェースのコードをリスト1に示します。getResultメソッドはテスト・メソッドです。ここでは、OSGiサービスを開発し、Webサービスとして公開するため、どちらのサービスにも、他からの呼び出しを受けるパブリック・メソッドが少なくとも1つ必要です。
    リスト1. OSGiServiceインターフェース
    package wsgateway;
    
    public interface OSGiService {
    public String getResult();
    }
  7. 次に、「ファイル」->「新規」->「クラス」を選択し、クラス「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";
    	}
    }
  8. リスト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);
    	}
  9. 完了したら、このClient Servicesプロジェクトを実行し、サービスをOSGiフレームワークに登録できるかどうか確認します。Rational Application Developerで、「実行」->「実行」を選択します。
  10. 「実行」ダイアログ・ボックスで、「Client Services」を選択し、「新規」をクリックします。
  11. 「プラグイン(Plug-ins)」タブを選択し、「ワークスペース・プラグイン(Workspace Plug-ins)」の選択を解除し、「WSGateway」を選択します(図2参照)。
  12. 「必須プラグインの追加」ボタンをクリックし、「実行」をクリックします。
    図2. 「実行」ダイアログ・ボックスの「プラグイン」タブ
    図2. 「実行」ダイアログ・ボックスの「プラグイン」タブ
  13. 「コンソール(Console)」タブを選択し、「ss」と入力し、WSGatewayのバンドル番号を見つけます(図3参照)。
    図3. コンソール
    図3. コンソール
  14. WSGatewayのバンドル番号を見つけた後、コンソールで「start xxx」と入力します。xxxはWSGatewayのバンドル番号です。
  15. 次に、コンソールで「s」と入力し、wsgateway.OSGiServiceがOSGiフレームワークに登録されていることを確認します(図4参照)。
    図4. wsgateway.OSGiServiceが表示されたコンソール
    図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)」タブ
図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プロジェクトをデプロイします。

  1. 前の「OSGiサービスを登録するClient Servicesプロジェクトの作成」セクションの手順9から13を繰り返します(ただし、構成はすでに実行済みなので、手順10はスキップします)。手順11で、「引数(Arguments)」タブを選択し、「-Dcom.ibm.pvc.webcontainer.port=0」を「8777」に変更します(図6参照)。
    図6. 「引数Arguments」タブ
    図6. 「引数Arguments」タブ
  2. コンソールで、com.ibm.pvcws.osgiおよびorg.eclipse.equinox.httpを見つけ、これらを開始します。
  3. もう一度コンソールで、WSGatewayを見つけて開始します。
  4. Webブラウザーを開き、コンソールに表示されたURLを入力します。成功すると、Webサービス記述言語(WSDL)が表示されます(図7参照)。
    図7. Webブラウザーに表示されたWSDL
    図7. Webブラウザーに表示されたWSDL

デプロイしたWebサービスのテスト

これで、Webサービスをデプロイすることができました。正しくデプロイされているか、確認してみましょう。IBM Lotus Expeditor Toolkitには、それを行うための簡単な機能があります。WSDLファイルが存在する限り、IBM Lotus Expeditor Toolkitはそれを解析し、JSR 172にしたがって必要なスタブ・コードを生成できます。これらのスタブを使用して、Webサービスをテストできます。

次の手順にしたがって、デプロイされたWebサービスをテストします。

  1. 前の「OSGiサービスを登録するClient Servicesプロジェクトの作成」セクションの手順1から5を繰り返し、WSGatewayClientというプロジェクト名を持つ別のClient Servicesプロジェクトを作成します。
  2. 「ファイル」->「新規」->「その他」を選択します。
  3. 「Client Services」->「モバイルWebサービス」->「モバイルWebサービス・クライアント」を選択し、「次へ」をクリックします(図8参照)。
    図8. 「新規」ウィザード
    図8. 「新規」ウィザード
  4. 「モバイルWebサービス・クライアント」ダイアログ・ボックスのフィールドに、次の値を入力します(図9参照)。
    • ソース・フォルダー:/WSGatewayClient/src
    • パッケージ: wsgatewayclient
    • WSDLのロケーション: http://localhost:8777/ws/pid/wsgateway.OSGiService
    図9. 「モバイルWebサービス・クライアント」ダイアログ・ボックス
    図9. 「モバイルWebサービス・クライアント」ダイアログ・ボックス
  5. 「次へ」をクリックし、「完了」をクリックします。
  6. 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());
    	}
  7. WSGatewayサービスがpid方式を使用してWebサービスを公開していることを確認します。sidを使用する場合は、クライアントを作成するときに、WSDL URL内のsid番号が正しくなければなりません。プログラムの引数として「-clean」を追加すると、この番号が変わる可能性があるからです。
  8. 前のセクションで起動したIBM Lotus Expeditorランタイムを停止します。次に、「プロジェクトのデプロイ」セクションの手順1から3を繰り返し、IBM Lotus Expeditorランタイムを再び実行します。ただし、手順1ではWSGatewayおよびWSGatewayClientを選択します。
  9. 「ss」と入力し、WSGatewayClientのバンドルIDを見つけ、これを開始します。出力された結果がコンソール・タブに表示されます(図10参照)。
    図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が優れたフレームワークとなることを示します。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=341128
ArticleTitle=IBM Lotus ExpeditorのWebサービスとしてOSGiサービスを開発する
publish-date=11282006