Menu Close

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「エンドポイントを公開するためのバンドルアクティベーターの start メソッド」に、サービスプロバイダを公開するためのコードを示します。

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

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「エンドポイントを公開するためのバンドルアクティベーターの start メソッド」のコードは、以下を行います。

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

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

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

stop メソッドの実装

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

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

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

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