Menu Close

第12章 OSGi サービス

概要

OSGi コアフレームワークは、OSGi サービスレジストリーで Java オブジェクトをサービスとして登録することで、バンドルが対話する簡単なメカニズムを提供する OSGi Service Layer を定義します。OSGi サービスモデルの長所の 1 つは、任意の Java オブジェクトをサービスとして提供できることです。サービスクラスに適用する必要のある特定の制約、継承ルール、またはアノテーションはありません。本章では、OSGi Blueprint コンテナーを使用して OSGi サービスをデプロイする方法を説明します。

12.1. Blueprint コンテナー

概要

Blueprint コンテナーは、OSGi コンテナーとの対話を簡素化する依存性注入フレームワークです。Blueprint コンテナーは、OSGi サービスレジストリーを使用する設定ベースのアプローチをサポートします。たとえば、OSGi サービスをインポートおよびエクスポートするための標準の XML 要素を提供します。

12.1.1. Blueprint の設定

JAR ファイルの Blueprint ファイルの場所

バンドル JAR ファイルのルートを基準にすると、Blueprint 設定ファイルの標準の場所は次のディレクトリーです。

OSGI-INF/blueprint

このディレクトリーの接尾辞( .xml )のファイルは、Blueprint 設定ファイルとして解釈されます。つまり、パターンに一致するファイルはすべて OSGI-INF/blueprint/*.xml として解釈されます。

Maven プロジェクトの Blueprint ファイルの場所

Maven プロジェクト ProjectDir のコンテキストでは、Blueprint 設定ファイルの標準的な場所は次のディレクトリーです。

ProjectDir/src/main/resources/OSGI-INF/blueprint

Blueprint namespace とルート要素

Blueprint の設定要素は、以下の XML namespace に関連付けられています。

http://www.osgi.org/xmlns/blueprint/v1.0.0

Blueprint 設定のルート要素は Blueprint であるため、通常、Blueprint XML 設定ファイルの形式は以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
  ...
</blueprint>
注記

Blueprint のルート 要素では、スキーマの場所が Blueprint フレームワークにすでに知られているため、xsi:schemaLocation 属性を使用して Blueprint スキーマの場所を指定する必要はありません。

Blueprint マニフェストの設定

Blueprint 設定の一部の側面は、以下のように JAR のマニフェストファイル META-INF/MANIFEST.MF のヘッダーで制御されます。

カスタムの Blueprint ファイルの場所

Blueprint 設定ファイルを標準以外の場所(つまり、OSGI-INF/blueprint/*.xml以外の場所)に配置する必要がある場合は、マニフェストファイルの Bundle-Blueprint ヘッダーに、コンマ区切りの場所一覧を指定することができます。以下に例を示します。

Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml

必須の依存関係

OSGi サービスの依存関係は、デフォルトで必須です(参照要素で availability 属性を optional または reference -list 要素で optional に設定)。依存関係を必須として宣言すると、バンドルはその依存関係なしで適切に機能しなくなり、依存関係が常に利用可能である必要があります。

通常、Blueprint コンテナーの初期化中、猶予期間 を経過し、その間にすべての必須の依存関係を解決しようとします。この時間内に必須の依存関係を解決できない場合 (デフォルトのタイムアウトは 5 分) 、コンテナーの初期化は中断され、バンドルは起動されません。以下の設定を Bundle-SymbolicName マニフェストヘッダーに追加して、猶予期間を設定できます。

blueprint.graceperiod
true (デフォルト)の場合、猶予期間が有効で、Blueprint コンテナーは必須の依存関係を初期化中に解決されるのを待ちます。false の場合、猶予期間は省略され、コンテナーは必須の依存関係が解決されているかどうかを確認しません。
blueprint.timeout
猶予期間のタイムアウトをミリ秒単位で指定します。デフォルトは 300000 (5 分) です。

たとえば、10 秒の猶予期間を有効にするには、マニフェストファイルに以下の Bundle-SymbolicName ヘッダーを定義できます。

Bundle-SymbolicName: org.fusesource.example.osgi-client;
 blueprint.graceperiod:=true;
 blueprint.timeout:= 10000

Bundle-SymbolicName ヘッダーの値はセミコロン区切りリストです。1 つ目の項目は実際のバンドルシンボリック名、2 つ目の項目、Blueprint.graceperiod:=true )で、猶予期間および 3 つ目のアイテム、Blueprint.timeout:= 10000 を 10 秒のタイムアウトを指定します。

12.1.2. サービス Bean の定義

概要

Blueprint コンテナーを使用すると、bean 要素を使用して Java クラスをインスタンス化できます。このように、メインアプリケーションオブジェクトすべてを作成できます。特に、bean 要素を使用して OSGi サービスインスタンスを表す Java オブジェクトを作成できます。

Blueprint Bean 要素

Blueprint Bean 要素は、Blueprint スキーマ名前空間 http://www.osgi.org/xmlns/blueprint/v1.0.0 で定義されます。

サンプル Bean

以下の例は、Blueprint の bean 要素を使用して異なるタイプの Bean を作成する方法を示しています。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <bean id="label" class="java.lang.String">
    <argument value="LABEL_VALUE"/>
  </bean>

  <bean id="myList" class="java.util.ArrayList">
    <argument type="int" value="10"/>
  </bean>

  <bean id="account" class="org.fusesource.example.Account">
    <property name="accountName" value="john.doe"/>
    <property name="balance" value="10000"/>
  </bean>

</blueprint>

最後の Bean の例によって参照される Account クラスは以下のように定義できます。

package org.fusesource.example;

public class Account
{
    private String accountName;
    private int balance;

    public Account () { }

    public void setAccountName(String name) {
        this.accountName = name;
    }

    public void setBalance(int bal) {
        this.balance = bal;
    }
    ...
}

参考資料

Blueprint Bean の定義に関する詳細は、以下の参考資料を参照してください。

12.1.3. プロパティーを使用した Blueprint の設定

概要

ここでは、Camel コンテキスト外にあるファイルに保持されるプロパティーを使用して、Blueprint を設定する方法を説明します。

Blueprint Bean の設定

Blueprint Bean は、外部ファイルのプロパティーを置換できる変数を使用して設定できます。ext 名前空間を宣言し、Blueprint の xml に プロパティープレースホルダー Bean を追加する必要があります。Property-Placeholder Bean を使用して、プロパティーファイルの場所をブループリントに宣言します。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0">

    <ext:property-placeholder>
      <ext:location>file:etc/ldap.properties</ext:location>
    </ext:property-placeholder>
    ...
    <bean ...>
        <property name="myProperty" value="${myProperty}" />
    </bean>
</blueprint>

プロパティープレースホルダーの 設定オプションは http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd にあります。