OSGi アプリケーションの探索

org.apache.aries.blueprint パッケージ内 のクラスを使用して、OSGi アプリケーション・プログラミング・モデルを拡張できます。 このサード・パーティー SPI は blueprint-1.0 サーバー・フィーチャー を通して提供されます。拡張を適用するには、OSGi アプリケーション・バンドルに アクセスする必要があります。Liberty では、OSGi アプリケーションはサブシステムとして実行されます。OSGi アプリケーションを見つけるために、 ユーザー・フィーチャー内に ServiceTracker を作成できます。

このタスクについて

このトピックは、ユーザー・フィーチャーの開発者が、実行中の OSGi アプリケーション を見つける方法について説明します。このタスクは、OSGi アプリケーション に対するプログラミング・モデル拡張を提供する多くのユーザー・フィーチャー で必要とされます。例えば、新規ユーザー・フィーチャーがそのような拡張を提供するために、 新規バンドル・エクステンダー (コンテナー と呼ばれることもある) を実装 したり、もっと単純に、特定の OSGi アプリケーション内から公開されたサービスを 追跡して起動したりすることが考えられます。

そのようなユーザー・フィーチャー は、特定の実行中の OSGi アプリケーションの BundleContext を使用して、 新規 BundleTracker インスタンスおよび ServiceTracker インスタンスを作成する必要があります。この BundleContext は、OSGi アプリケーションと関連付けられた org.osgi.service.subsystem.Subsystem から 取得できます。以下の手順は、その SubSystem サービスを取得する方法を説明しています。

手順

ユーザー・フィーチャー内で ServiceTracker を 作成することによって OSGi アプリケーションを見つけるには、以下のステップを実行します。

  1. 見つけたいサブシステムをターゲットとする org.osgi.framework.Filter を作成します。
  2. ステップ 1 で作成したフィルターを使用して、見つけたい OSGi アプリケーションと関連付けられた org.osgi.service.subsystem.Subsystem サービス を取得する、org.osgi.util.tracker.ServiceTracker を作成します。 この Subsystem サービス・インスタンスは、 OSGi アプリケーションに関する作業に必要なものをすべて提供します。

以下の例は、ユーザー・フィーチャー内で ServiceTracker を 使用して、シンボル名が my.app のアプリケーションを見つける方法を示しています。
import org.osgi.framework.BundleContext;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
以下のコード抜粋では、変数 ctx は、 ユーザー・フィーチャーのバンドルのうちの 1 つのバンドルの BundleContext です。
String SERVICE_FILTER = "(&(objectClass=org.osgi.service.subsystem.Subsystem)                           (subsystem.type=osgi.subsystem.application)(subsystem.symbolicName=my.app))"
    
      org.osgi.framework.Filter filter = ctx.createFilter(SERVICE_FILTER);
最後のヌル・パラメーターを、ServiceTrackerCustomizer<Subsystem, Subsystem> を実装するクラスのインスタンスで置き換えることができます。
org.osgi.util.tracker.ServiceTracker<Subsystem, Subsystem> str = new ServiceTracker<Subsystem, Subsystem>(ctx, filter, null);
SERVICE_FILTER を、次のような定数を使用する ように構成することができます。
org.osgi.framework.Constants.OBJECTCLASS;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY;

トピックのタイプを示すアイコン タスク・トピック

ファイル名: twlp_locate_osgi.html