レベル: 中級 Naveen Balani, Enterprise Architect, IBM Rajeev Hathi, Technical Architect, Consultant
2009年 03月 30日 Felix コンテナー内で Spring DM (Spring Dynamic Modules) フレームワークを使用して、Java クラスを OSGi バンドルとして作成し、パッケージ化してください。この連載の第 2 回では、Spring フレームワークを使ってバンドルを作成し、そのバンドルを Felix ランタイム環境にデプロイする方法を説明します。単純な Spring ベースの構成によって、コアとなる OSGi フレームワークの依存関係が取り除かれる仕組みを学んでください。
はじめに
この記事では、連載第 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 と組み合わせることで、エンタープライズ規模のアプリケーション開発に確固たる基盤を提供することができます。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| OSGi Spring Order Application | osgispring_orderapp.zip | 11KB | HTTP |
|---|
参考文献
著者について  | 
|  | Naveen Balani は、IBM India Software Labs (ISL) のアーキテクトで、ISLでは WebSphere Business Services Fabric の設計および開発作業のリーダーを務めています。新しい技術の調査に積極的な彼は、IBM developerWorks ではお馴染みの寄稿者でもあり、今まで Web サービス、ESB、JMS、SOA、アーキテクチャー、オープンソース・フレームワーク、セマンティック Web、J2ME、パーベイシブ・コンピューティング、Spring、Ajax、そしてさまざまな IBM 製品についての記事を書いています。また、『Beginning Spring Framework 2』、『Getting Started with IBM WebSphere Business Services Fabric V6.1』の共著者でもあります。 |
 | 
|  | Rajeev Hathi は、J2EE プラットフォームのソフトウェア・コンサルタントとして働いてきました。彼の専門は、J2EE をベースとしたアプリケーションの設計です。得意とするサブジェクトは Web サービスで、Web サービスを通じて SOA の概念を適用し、吸収するという方法を好んでいます。趣味は、スポーツ観戦とロックを聴くことです。 |
記事の評価
|