第12章 OSGi サービス

概要

OSGi コアフレームワークは OSGi サービスレイヤー を定義します。これは、Java オブジェクトを OSGi サービスレジストリー にサービスとして登録して、バンドルによる単純な対話メカニズムを提供します。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 の名前空間とルート要素

Blueprint 設定要素は、次の XML 名前空間に関連付けられています。

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 ファイルの場所

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

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

必須の依存関係

OSGi サービスの依存関係はデフォルトで必須です (ただし、reference 要素または reference-list 要素の availability 属性を 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 ヘッダーの値はセミコロン区切りのリストです。最初の項目は実際のバンドルシンボリック名で、2 番目の項目 blueprint.graceperiod:=true は猶予期間を有効にし、3 番目のアイテム blueprint.timeout:= 10000 は 10 秒のタイムアウトを指定します。

12.1.2. サービス Bean の定義

概要

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

Blueprint Bean 要素

Blueprint bean 要素は、Blueprint スキーマ namespace 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;
    }
    ...
}

References

Blueprint Bean の定義の詳細は、次のリファレンスを参照してください。

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

概要

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

Blueprint Bean の設定

Blueprint Bean は、外部ファイルのプロパティーを置換できる変数を使用して設定できます。ext namespace を宣言し、Blueprint xml に property placeholder Bean を追加する必要があります。Property-Placeholder Bean を使用して、プロパティーファイルの場所を Blueprint に宣言します。

<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>

property-placeholder 設定オプションの指定は http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd にあります。