12.5. OSGi サービスへのアクセス

12.5.1. 概要

このセクションでは、OSGi コンテナーで単純な OSGi クライアントの生成、構築、およびデプロイ方法について説明します。クライアントは、OSGi レジストリーで単純な Hello World サービスを見つけ、そのサービスで sayHello() メソッドを呼び出します。

12.5.2. 前提条件

Maven クイックスタートアーキタイプを使用してプロジェクトを生成するには、次の前提条件を満たす必要があります。

  • Maven インストール: Maven は Apache の無料のオープンソースビルドツールです。最新バージョンは http://maven.apache.org/download.html からダウンロードできます (最小値は 2.0.9 です)。
  • インターネット接続: ビルドの実行中、Maven は追加設定を必要とせずに動的に外部リポジトリーを検索し、必要なアーティファクトをダウンロードします。これを機能させるには、ビルドマシンがインターネットに接続されている 必要 があります。

12.5.3. Maven プロジェクトの生成

maven-archetype-quickstart アーキタイプは汎用の Maven プロジェクトを作成し、それを目的に合わせてカスタマイズできます。コーディネート org.fusesource.example:osgi-client を使用して Maven プロジェクトを生成するには、次のコマンドを入力します。

mvn archetype:create
-DarchetypeArtifactId=maven-archetype-quickstart
-DgroupId=org.fusesource.example
-DartifactId=osgi-client

このコマンドの結果は、生成されたプロジェクトのファイルを含むディレクトリー ProjectDir/osgi-client です。

注記

既存の製品のグループ ID と競合するアーティファクトのグループ ID を 選択しない ように 注意 してください。これにより、プロジェクトのパッケージと既存の製品のパッケージが競合する可能性があります (通常、グループ ID はプロジェクトの Java パッケージ名のルートとして使用されるため)。

12.5.4. POM ファイルのカスタマイズ

OSGi バンドルを生成するには、次のように POM ファイルをカスタマイズする必要があります。

  1. 「バンドルプロジェクトの生成」 で説明されている POM のカスタマイズ手順に従います。
  2. クライアントは osgi-service バンドルで定義される HelloWorldSvc Java インターフェイスを使用するため、osgi-service バンドルに Maven 依存関係を追加する必要があります。osgi-service バンドルの Maven コーディネートが org.fusesource.example:osgi-service:1.0-SNAPSHOT であることを想定する場合、以下の依存関係をクライアントの POM ファイルに追加する必要があります。

    <project ... >
      ...
      <dependencies>
        ...
        <dependency>
            <groupId>org.fusesource.example</groupId>
            <artifactId>osgi-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
      </dependencies>
      ...
    </project>

12.5.5. Blueprint ファイルの書き込み

Blueprint ファイルをクライアントプロジェクトに追加するには、最初に次のサブディレクトリーを作成します。

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

ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint ディレクトリーの下で、お気に入りのテキストエディターを使用して config.xml ファイルを作成し、例12.6「サービスをインポートするための Blueprint ファイル」から XML コードを追加します。

例12.6 サービスをインポートするための Blueprint ファイル

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

  <reference id="helloWorld"
        interface="org.fusesource.example.service.HelloWorldSvc"/>

  <bean id="client"
        class="org.fusesource.example.client.Client"
        init-method="init">
    <property name="helloWorldSvc" ref="helloWorld"/>
  </bean>

</blueprint>

reference 要素は、OSGi レジストリーで HelloWorldSvc タイプのサービスを見つける参照マネージャーを作成します。bean 要素は Client クラスのインスタンスを作成し、サービス参照を Bean プロパティー helloWorldSvc として注入します。さらに、init-method 属性は、Bean の初期化フェーズ中 (つまり、サービス参照がクライアント Bean に注入された) に Client.init() メソッドが呼び出されるように指定します。

12.5.6. クライアントクラスの作成

ProjectDir/osgi-client/src/main/java/org/fusesource/example/client ディレクトリーの下で、お気に入りのテキストエディターを使用して Client.java ファイルを作成し、例12.7「クライアントクラス」から Java コードを追加します。

例12.7 クライアントクラス

package org.fusesource.example.client;

import org.fusesource.example.service.HelloWorldSvc;

public class Client {
    HelloWorldSvc helloWorldSvc;

    // Bean properties
    public HelloWorldSvc getHelloWorldSvc() {
        return helloWorldSvc;
    }

    public void setHelloWorldSvc(HelloWorldSvc helloWorldSvc) {
        this.helloWorldSvc = helloWorldSvc;
    }

    public void init() {
        System.out.println("OSGi client started.");
        if (helloWorldSvc != null) {
            System.out.println("Calling sayHello()");
            helloWorldSvc.sayHello();  // Invoke the OSGi service!
        }
    }

}

Client クラスは helloWorldSvc Bean プロパティーの getter メソッドおよび setter メソッドを定義します。これによりインジェクションによる Hello World サービスへの参照を受け取ることができます。init() メソッドは、プロパティーインジェクションの後に Bean 初期化フェーズ中に呼び出されます。つまり、通常、このメソッドのスコープ内で Hello World サービスを呼び出すことができます。

12.5.7. クライアントバンドルの実行

osgi-client プロジェクトをインストールおよび実行するには、以下の手順を実行します。

  1. プロジェクトをビルドします — コマンドプロンプトを開き、ProjectDir/osgi-client ディレクトリーに移動します。Maven を使用して、次のコマンドを入力してデモをビルドします。

    mvn install

    このコマンドが正常に実行される場合、ProjectDir/osgi-client/target ディレクトリーには、バンドルファイル osgi-client-1.0-SNAPSHOT.jar が含まれている必要があります。

  2. osgi-service バンドルをインストールして開始する: Red Hat Fuse コンソールで、次のコマンドを入力します。

    karaf@root()> bundle:install -s file:ProjectDir/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar

    ProjectDir は Maven プロジェクトを含むディレクトリーで、-s フラグはバンドルをすぐに起動するように指示します。たとえば、Windows マシンのプロジェクトディレクトリーが C:\Projects の場合、以下のコマンドを入力します。

    karaf@root()> bundle:install -s file:C:/Projects/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
    注記

    Windows マシンでは、file URL のフォーマット方法に注意してください。file URL ハンドラーが認識する構文の詳細は 「ファイル URL ハンドラー」 を参照してください。

  3. クライアント出力: クライアントバンドルが正常に開始されると、コンソールに次のような出力がすぐに表示されます。

    Bundle ID: 239
    OSGi client started.
    Calling sayHello()
    Hello World!