はじめに
エンタープライズアプリケーション開発において結合の緩いサービスが受け入れられるようになったこと、さらにSOA(サービス志向アーキテクチャ)をめぐる以前からの動向を受けて、企業の間では、リモートからの起動と実行が可能なコンシューマブルサービスについての関心が高まっています。またサービスドリブン型アーキテクチャを実現する媒体としてSOAPベースのWebサービスがもつ価値と重要性についても、この数年間で広く認識されるようになりました。
Webサービスの構築法はさまざまですが、特に企業の場合は、ビジネス機能を実装している既存アプリケーションに既にかなりの投資をしているのが普通です。そのためこうしたケースでは、既存のドメイン機能を安全で簡単かつ効率的な方式でWebサービスとして提供できるデザインが求められています。
本稿ではAxis2を用いることで、十分なスケーラビリティを維持しつつ、既存のPOJOドリブンJ2EEアプリケーションをWebサービスとして公開する方法について説明します。これらのサービス作成と制御には、現在多くのJ2EEアプリケーションにおいてDI(Dependency Injection:依存性注入)コンテナとして利用されているSpringを利用します。また最後にAxis2エンタープライズWebサービスの配備戦略を解説し、IBM WebSphereなどのアプリケーションサーバに固有の問題についても触れることにします。
アプリケーション
通常のJ2EEアプリケーションは階層構造を取っており、プレゼンテーション層とビジネス/ドメイン層とが分離しているのが普通です。すべてのコンポーネントを統合するのは、Springなどのフレームワークまたはカスタムファクトリ/コントローラの役割です。本稿では、簡単なWeb層とドメイン層を用いてビジネスロジックをカプセル化するアプリケーションを考えることにします。
今回のサンプルアプリケーションでは、単純化のためWeb層とドメイン層を共通のプロジェクト構造に統合していますが、本来これらは明確に区別されるものです。図1に、サンプルアプリケーションAccountWebの構成を示します。
このアプリケーションは、フロントエンドで使われるAccountManagerというドメイン機能を持ちます。AccountManagerはAccountManagerImplとして実装され、ドメインオブジェクトAccount
を使用します。ここでも便宜上、ロジックをハードコーディングし、事前定義された各種の入力に基づいた値を返すようにしてあります。実際のアプリケーションであれば、より高度なドメイン/ビジネス層を用意し、データアクセスおよび統合コンポーネントによるデータ入力が行われるはずです。
ドメインロジックインターフェイスを見ると分かるようにAccountManagerには下記の2つのメソッドが定義されています。
public interface AccountManager { public Account getAccount(String accountId); public void setStatus(String accountId, Boolean status); }
本稿の残りの部分では、Axis2およびSpringを用いてAccountManager機能とその2つのメソッドを公開し、コンシューマブルなWebサービスとして外部から利用させる方法について説明します。
Axis2を用いたWebサービスの構築
Webサービスを構成するコードのうち、プロバイダサイドのコード部分は「スケルトン」と呼ばれ、コンシューマサイドのコード部分は「スタブ」と呼ばれます。スタブとスケルトンは、マーシャリングおよびアンマーシャリングのリクエストで使用されます。よって、まず目的とするサービスのプロデューササイドのコンポーネントを作成する必要があります。
Webサービスの構築法には、ボトムアップ形式とトップダウン形式のアプローチがあります。ボトムアップのアプローチでは、最初にJavaクラスを構築しておき、そこからサービス記述子やWSDLを生成します。トップダウン形式のアプローチでは、WSDLを構築しておき、そこからJavaクラスを生成します。今回のサンプルアプリケーションでは、ビジネス機能が既にJavaクラスとして実装されているので、ボトムアップのアプローチを採用します。
Axis2は同期および非同期サービスをサポートしていますが、今回のサンプルでは同期サービスのみを使用します。Axis2とSpringを用いて既存のドメインクラスからWebサービスを生成するステップを簡単にまとめると次のようになります。
- 既存の実装を基にWSDLを生成する。
- このWSDLからプロデューササイドのスケルトンおよびクライアントサイドのスタブを生成する。
- Springのワイヤリング設定を行い、スケルトン実装を編集して既存クラスにフックする。
サービスの生成と設定が終わったら、次の作業を行います。
- サービスを配備する。
- クライアント側からのテストを行う。
ここから先の手順を実行するには、Axis2バイナリをダウンロードし、アプリケーションクラスパスのライブラリディレクトリにインストールしておく必要があります。WebSphereやWebLogicなど一部のアプリケーションサーバでは、サーバにデフォルトで使われるライブラリとこれらのライブラリが競合する場合があります。この問題については、配備の手順を解説する際に説明します。現段階では、こうした競合はクラスローダおよびその他のクラスパスポリシーを操作することで回避できることを知っておけば十分でしょう。本稿のダウンロードファイルには、すべてのサンプルコードが収録されています。