31.4. OSGi コンテナーでのサービスの公開

概要

OSGi コンテナーにデプロイされるアプリケーションを開発するときは、エンドポイントの公開と停止を、それがパッケージ化されているバンドルのライフサイクルと調整する必要があります。バンドルの開始時にエンドポイントを公開し、バンドルの停止時にエンドポイントを停止する必要があります。

OSGi バンドルアクティベーターを実装することにより、エンドポイントのライフサイクルをバンドルのライフサイクルに結び付けます。バンドルアクティベーターは、開始時にバンドルのリソースを作成するために OSGi コンテナーによって使用されます。コンテナーは、バンドルアクティベータを使用して、停止時にバンドルリソースをクリーンアップします。

バンドルアクティベーターインターフェイス

org.osgi.framework.BundleActivator インターフェイスを実装することにより、アプリケーションのバンドルアクティベーターを作成します。例31.4「バンドルアクティベーターインターフェイス」 に示す BundleActivator インターフェイス、実装する必要のある 2 つのメソッドがあります。

例31.4 バンドルアクティベーターインターフェイス

interface BundleActivator
{
  public void start(BundleContext context)
  throws java.lang.Exception;

  public void stop(BundleContext context)
  throws java.lang.Exception;
}

start() メソッドは、バンドルの開始時にコンテナーによって呼び出されます。ここで、エンドポイントをインスタンス化して公開します。

stop() メソッドは、バンドルを停止する際にコンテナーによって呼び出されます。これは、エンドポイントを停止する場所です。

start メソッドの実装

バンドルアクティベーターの start メソッドは、エンドポイントを公開する場所です。エンドポイントを公開するには、start メソッドは次のことを行う必要があります。

  1. 「サービスプロバイダーのインスタンス化」 サービスプロバイダーの javax.xml.ws.Endpoint オブジェクト。
  2. サービスプロバイダーを公開するときに使用する任意のサーバーコンテキストを作成します。
  3. 「サービスプロバイダーの公開」 publish() メソッドのいずれかを使用するサービスプロバイダー。

例31.5「エンドポイントを公開するためのバンドルアクティベーター開始メソッド」 は、サービスプロバイダーを公開するためのコードを示しています。

例31.5 エンドポイントを公開するためのバンドルアクティベーター開始メソッド

package com.widgetvendor.osgi;

import javax.xml.ws.Endpoint;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class widgetActivator implements BundleActivator
{
  private Endpoint endpt;
  ...

  public void start(BundleContext context)
  {
    WidgetOrderImpl impl = new WidgetOrderImpl();
    endpt = Endpoint.create(impl);
    endpt.publish("http://localhost:9000/SoapContext/SoapPort");
  }

  ...

}

例31.5「エンドポイントを公開するためのバンドルアクティベーター開始メソッド」 のコードは、以下を行います。

サービスの実装オブジェクトのコピーをインスタンス化します。

サービス実装の未公開の Endpoint を作成する。

http://localhost:9000/SoapContext/SoapPort でサービスプロバイダーを公開します。

stop メソッドの実装

バンドルアクティベーターの停止メソッドは、アプリケーションで使用されるリソースをクリーンアップする場所です。その実装には、アプリケーションによって公開されたすべてのエンドポイントを停止するためのロジックを含める必要があります。

例31.6「エンドポイントを停止するためのバンドルアクティベータ停止方法」 は、公開されたエンドポイントを停止するための停止メソッドを示しています。

例31.6 エンドポイントを停止するためのバンドルアクティベータ停止方法

package com.widgetvendor.osgi;

import javax.xml.ws.Endpoint;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class widgetActivator implements BundleActivator
{
  private Endpoint endpt;
  ...

  public void stop(BundleContext context)
  {
    endpt.stop();
  }

  ...

}

コンテナーへの通知

アプリケーションのバンドルにバンドルアクティベーターが含まれていることをコンテナーに通知する必要があります。これを行うには、Bundle-Activator プロパティーをバンドルのマニフェストに追加します。このプロパティーは、バンドルをアクティブ化するときにバンドル内のどのクラスを使用するかをコンテナーに指示します。その値は、バンドルアクティベーターを実装するクラスの完全修飾名です。

例31.7「バンドルアクティベーターマニフェストエントリー」に、アクティベーターがクラス com.widgetvendor.osgi.widgetActivator で実装されているバンドルのマニフェストエントリーを示します。

例31.7 バンドルアクティベーターマニフェストエントリー

Bundle-Activator: com.widgetvendor.osgi.widgetActivator