目次


OSGi と Spring

第 2 回 Felixを使用して OSGi の Spring バンドルを作成し、デプロイする

オープンソースの OSGi コンテナーである Apache Felix を使用して、Java コンポーネントを OSGi ベースの Spring バンドルとして作成し、パッケージ化するための開発者向けステップバイステップ・ガイド

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: OSGi と Spring

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:OSGi と Spring

このシリーズの続きに乞うご期待。

はじめに

この記事では、連載第 1 回で開発した注文用アプリケーションを再び取り上げます。今回このアプリケーションでバンドルの作成およびパッケージ化に使用するのは、Spring DM (Spring Dynamic Modules) です。アプリケーションのクライアントがサービス・コンポーネントを起動することで注文を処理し、サーバー・コンポーネントが注文 ID を出力します。この記事を参考に、Spring DM の概念、そして Spring DM を Felix ベースの OSGi コンテナーで使用する方法を理解してください。

システム要件

この記事のサンプル・コードを実行するには、お使いのマシンに必ず以下のソフトウェアをインストールして、セットアップしてください。

  • Java 5 以降
  • Ant ビルド・ツール
  • Felix バイナリー・ディストリビューション 1.0.4
  • Spring DM バンドル

上記のディストリビューションをインストールしたら、以下の環境変数を設定します (一例として、set ANT_HOME=C:\apache-ant-1.7.0)。

  • JAVA_HOME (Java 用)
  • ANT_HOME (Ant 用)

続いて PATH 環境変数に以下の内容を追加します。

  • JAVA_HOME\bin
  • ANT_HOME\bin

Spring DM

Spring DM には、Spring アプリケーションを OSGi 環境にデプロイする際に役立つ JAR またはバンドルが含まれています。Spring DM ベースのアプリケーションは、OSGi 環境が提供するサービスを利用することができます。そして Spring DM ベースのアプリケーションによって、OSGi をベースとしたアプリケーションの開発には、容易さと利便性がもたらされます。Spring DM は、以下のメリットを OSGi 環境に提供します。

  • アプリケーションを動的なバンドルにモジュール化し、これらのバンドルにランタイム・サービスを提供します。
  • モジュールにバージョン管理機能を提供します。
  • モジュールは、動的に検出して使用可能なサービスとしてバンドルされます。
  • モジュールは動的にインストール、更新、およびアンインストールすることができます。
  • アプリケーションを OSGi モジュールとして構成する際に、Spring フレームワークを活用します。
  • ビジネス・ロジックと構成を切り離し、それによって開発を簡単かつ便利にします。

注文用アプリケーションの再登場

今回も、連載第 1 回で開発した注文用アプリケーションを取り上げます。ご存知のとおり、現時点ではクラスが OSGi フレームワークに密接に結合されていますが、今回は Spring DM を使用して、この密結合を取り除き、クラスを単純な POJO にします。以下に記載する改良後の OrderClient.java を見てください。

リスト 1. クライアント・コンポーネント (OrderClient)
package order.client;

import order.OrderService;

public class OrderClient {

	private OrderService orderService;

	public void setOrderService(OrderService orderService) {
		this.orderService = orderService;
	}

	public void removeService() {
		this.orderService = null;
	}

	public void start() {
		orderService.processOrder();
	}

	public void stop() {
		System.out.println("Bundle stopped");
    }

}

上記では、OSGi フレームワークの依存関係が完全に取り除かれています。このクラスは、start() メソッドで注文を処理するだけの単純な POJO です。ServiceTracker クラスは一切使用されていません。

リスト 2. OrderService の実装
package order.impl;

import order.OrderService;

public class OrderServiceImpl implements OrderService {

	public void start() {
		System.out.println("Order Service registered");
    }

	public void stop() {
		System.out.println("Order Service stopped");
    }

	public void processOrder() {
		System.out.println("Order id: ORD123") ;
	}
}

上記の OrderServiceImpl も同じく単純な POJO で、processOrder() メソッドが用意されています。ここには、OSGi コア・コンポーネントとの関連付けはありません。また、クライアントとサービスのいずれのクラスにしても、BundleActivator を実装していません。バンドルのライフサイクルはこの場合、Spring DM によって管理されます。

以上の単純な 2 つの POJO は、どのようにして OSGi コンポーネントとして機能するのでしょうか。その仕掛けは Spring 構成ファイルにあります。OSGi のパーツを定義する場所は、この構成ファイルです。

しかし XML ファイルを定義する前に、マニフェスト・ファイルに加えなければならない変更がいくつかあります。その変更とは、マニフェストにインポート・パッケージを組み込み、これらのインポート・パッケージに Spring DM ファイルを組み込むことです。こうすることによって、Spring が確実に OSGi バンドルの管理とライフサイクルを引き継ぐことになります。以下のコード・スニペットに、サービスおよびクライアントのマニフェスト・ファイルを記載します。

リスト 3. サービスのマニフェスト・ファイル
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service
Bundle-SymbolicName: orderservice
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml, 
org.springframework.aop, org.springframework.aop.framework, 
org.aopalliance.aop, org.xml.sax, org.osgi.framework, 
org.springframework.osgi.service.importer.support, 
org.springframework.beans.propertyeditors, 
org.springframework.osgi.service.exporter.support, 
org.springframework.osgi.service.exporter
Export-Package: order
リスト 4. クライアントのマニフェスト・ファイル
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service Client
Bundle-SymbolicName: orderclient
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml, 
org.springframework.aop, org.springframework.aop.framework, 
org.aopalliance.aop, org.xml.sax, org.osgi.framework, 
org.springframework.osgi.service.importer.support, 
org.springframework.beans.propertyeditors, 
org.springframework.osgi.service.importer, 
org.springframework.osgi.service.exporter.support, 
order

サービス・コンポーネントとクライアント・コンポーネントのそれぞれに、2 つの XML ファイルを作成します。サービスについては、orderservice.xml という XML ファイルで注文サービスの実装 Bean を定義し、orderservice-osgi.xml という XML ファイルで注文サービス・インターフェースを定義して、その実装を参照します。クライアントについても同じように、XML ファイルで注文クライアント Bean を定義して、注文サービス・コンポーネントを参照します。サービスおよびクライアントの XML ファイルは、それぞれの META-INF/spring フォルダー内に配置します。以下のコードは、サービスの XML ファイルです。

リスト 5. サービスの XML ファイル (orderservice.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean name="orderService" class="order.impl.OrderServiceImpl"/>

</beans>
リスト 6. サービスの OSGi XML ファイル (orderservice.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean name="orderService" class="order.impl.OrderServiceImpl"/>
</beans>

実際には、1 つの XML ファイルに Bean と OSGi 定義の両方を指定しても構いません。2 つの別個のファイルを作成する必要はありませんが、ここではインターフェース定義と構成を区別するために 2 つのファイルに分けています。2 つのファイルに分けて、それぞれのファイルを管理および保守するほうが、作業としては楽になります。Spring ベースの構成ならではの長所は、注文サービスの Bean を OSGi コンテナーの外部でテストできることです。

実際に OSGi コンテナー外部でテストできるようにするには、関連する Spring DM の jar ファイルを Felix にインストールする必要があります。

リスト 7. Felix 構成の部分
felix.auto.start.1= \
 file:/felix-1.0.4/bundle/org.apache.felix.shell-1.0.1.jar \
 file:/felix-1.0.4/bundle/org.apache.felix.shell.tui-1.0.1.jar \
 file:/felix-1.0.4/bundle/org.apache.felix.bundlerepository-1.0.3.jar \
 file:/osgi_spring/order/springlib/aopalliance.osgi-1.0-SNAPSHOT.jar \
 file:/osgi_spring/order/springlib/jcl104-over-slf4j-1.4.3.jar \
 file:/osgi_spring/order/springlib/log4j.osgi-1.2.15-SNAPSHOT.jar \
 file:/osgi_spring/order/springlib/org.apache.felix.main-1.0.1.jar \
 file:/osgi_spring/order/springlib/slf4j-api-1.4.3.jar \
 file:/osgi_spring/order/springlib/slf4j-log4j12-1.4.3.jar \
 file:/osgi_spring/order/springlib/spring-aop-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-beans-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-context-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-core-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-osgi-core-1.0.2.jar \
 file:/osgi_spring/order/springlib/spring-osgi-extender-1.0.2.jar \
 file:/osgi_spring/order/springlib/spring-osgi-io-1.0.2.jar

上記に示した内容からわかるように、Felix 構成ファイルには Spring DM バンドルが定義されます。Spring DM バンドルをダウンロードして、任意のフォルダーに配置してください。jar ファイルを適切なフォルダーに配置したら、Felix 構成ファイルに関連するエントリーを作成し、これらの jar ファイルを Felix の起動時にインストールするように指定します。

この設定が完了すれば、Felix ランタイム環境にクライアント・バンドルとサービス・バンドルをインストールする手順に進めます。これらのバンドルのインストールが済むと、バンドルを起動および停止できるようになり、OSGi バンドルでの場合と同じ結果が表示されます。ただし Felix ベースの OSGi とは異なり、この場合にバンドルのライフサイクルを管理しているのは Spring DM です。

まとめ

この記事で説明したように、Spring フレームワークを利用することで OSGi アプリケーションの開発は一層単純かつ効率的になります。OSGi 自体でも、Java アプリケーションをバンドルする方法が大幅に変わってきます。OSGi を Spring と組み合わせることで、エンタープライズ規模のアプリケーション開発に確固たる基盤を提供することができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services, Open source
ArticleID=385313
ArticleTitle=OSGi と Spring: 第 2 回 Felixを使用して OSGi の Spring バンドルを作成し、デプロイする
publish-date=03302009