典型的なJ2EEアプリケーションはエンタープライズJavaビーン、つまりEJBを含んでいることがあります。このビーンはアプリケーションのビジネス・ロジックや最新のビジネス・データを含んでいます。ビジネス・ロジックとビジネス・データを保管するには通常のJavaオブジェクトを使うこともできますが、EJBを使用すれば、単純なJavaオブジェクトを使用した場合のスケーラビリティ、ライフサイクルの管理、状態の管理、などの問題を解消することができます。
この文書では、EJBの1種類、セッションEJBについて述べています。セッションEJBはビジネス・プロセス・フロー(またはそれに似たアプリケーションの考え方)をマッピングするのに有用です。セッションEJBにはステートレス、ステートフルの2種類があります。この記事では両方のセッション・ビーンに言及し、と個々のシナリオにおいてそれらを使う方法をご紹介します。
EJBはクライアントと対話をします。対話は基本的にEJBとクライアントの間で行われ、この対話はクライアントからEJBに対するメソッド呼び出しにより行われます。ステートフル・セッション・ビーンはあるクライアントから見た状態を保持しています。反対に、ステートレス・セッション・ビーンはメソッド間での会話の状態を保持しません。別の言葉で言えば、ただ一度のメソッド呼び出しの間だけで会話の状態を保持することを期待されている、とも言えます。
この文章は以下のセクションで構成されています。
EJB実装の分析
EJBの実装は各々のベンダー毎に異なっています。このセクションの目的はJBossとApache Geronimo間でのセッション・ビーンの機能毎の比較を提供し、両者の違いを明確にしたうえで移行の前に計画を立てられるようにすることです。
機能 |
JBoss v4.0.5 |
Apache Geronimo (OpenEJB) |
---|---|---|
ステートフルおよびステートレス・セッション・ビーン |
サポートあり |
サポートあり |
BMP (Bean Managed Persistence) エンティティ・ビーン |
サポートあり |
サポートあり |
CMP (Container Managed Persistence) エンティティ・ビーン |
サポートあり |
サポートあり |
メッセージ・ドリブン・ビーン (MDBs) |
サポートあり |
サポートあり |
RMI-IIOP または JAXRPCを使用したインター・オペラビリティ |
サポートあり |
サポートあり |
ステートレス・セッション・ビーンまたはMDBをWebサービスとして公開 |
サポートあり |
サポートあり |
Webサービス経由でのメッセージの送受信 |
サポートあり |
サポートあり |
EJB 及び JMXベースのWebサービスの容易なプロビジョニングとホット・デプロイメント |
サポートあり |
サポートあり |
外部のCORBAオブジェクトからのEJBへの容易なアクセス |
サポートあり |
サポートあり |
サンプル・アプリケーション
今回のサンプルは単純なeコマースのWebサイトで、コンピューター関係の商品を小売、および卸売りマーケット向けに販売しています。商品を卸売り向けの値段で買うためには、顧客は最低限の決められた数量を購入する必要があります。そうでない場合は、顧客は一般小売向けの値段で商品を購入することになります。このアプリケーションの利用者はショッピング・カートに商品を追加します。商品の割引率を計算するビジネス・ワークフローにはステートレス・セッション・ビーンが使われ、ショッピング・カートの部分にはステートフル・セッション・ビーンが使われています。
下の図はアプリケーションの流れを示しています。
このアプリケーションの顧客は、商品リストのページに直接ログオンします。このページで、在庫のある商品の詳細をすべて見ることができます。顧客は、在庫のある商品を買うため、各々の商品についている「購入」リンクを使います。結果、「商品をカートに入れる」ページに飛びます。購入するなら、買いたい商品の数を入力します。もし購入数が最低購入数を超えているなら、ディスカウント価格が適用され、顧客のショッピング・カートに商品が追加されます。ショッピング・カートWebページはカート登録済みの商品を表示しますが、カートから取り除くこともできます。このアプリケーションでは同じ商品を二度購入することはできません。
アプリケーションのクラスとJSPページ
- org.apache.geronimo.samples.computer.dto
- ItemDTO - Web層とEJB層の間で商品に関する情報を転送するデータ転送オブジェクト
- TransactionDTO - Web層とEJB層の間でショッピング・カートに関する情報を転送するデータ転送オブジェクト
- org.apache.geronimo.samples.computer.ejb
- ItemServiceBean - 商品に関するワークフロー・アクティビティを処理するステートレス・セッション・ビーン
- ShoppingCartBean - ショッピング・カートに関するワークフロー・アクティビティを処理するステートレス・セッション・ビーン
- org.apache.geronimo.samples.computer.web
- ItemServiceDispatchServlet - フロント・エンドからWeb層へ商品サービス関連のアクティビティを振り分けるサーブレット
- ShoppingCartDispatchServlet - フロント・エンドからWeb層へショッピング・カート関連のアクティビティを振り分けるサーブレット
このeコマース・サンプル・アプリケーションは以下のJSPページも含んでいます。
- buy_item.jsp - 顧客の購入した商品の数量を受け入れます
- error.jsp - アプリケーションのエラー状況を表示します
- index.jsp - アプリケーションの商品リストへ転送します
- list_items.jsp - 在庫のある商品を表示します
- shopping_cart.jsp - ショッピング・カートに追加された買い物のリストを表示します
利用したツール
コンピューター・アクセサリーの販売アプリケーションを開発・ビルドするために利用するツールは:
Eclipse
サンプル・アプリケーションの開発にはEclipse統合開発環境を使用しました。これは非常にパワフルで有名なオープンソースの開発ツールです。 JBoss と Geronimo用の統合プラグインが利用可能です。Eclipseは下記のURLからダウンロードできます。
http://www.eclipse.org
Apache Ant
AntはピュアJavaのビルド・ツールです。今回はwarファイルをビルドし、オンラインでの仲介アプリケーション用のデータベースを操作する際にAntを用いました。Antは下記のURLからダウンロードできます。
http://ant.apache.org
JBoss環境
このセクションでは、JBoss環境がどのような方法で、どの場所に導入されたかを示しますので、このシナリオを貴方の環境に読み替えてください。この移行シナリオではJBoss v4.0.5を使った点にご留意ください。
JBossのインストール、構成、管理の詳細な方法については製品のドキュメントに記載されています。製品のWebサイトで最新のドキュメントをチェックしてください。
以下のリストがサンプル・アプリケーションをデプロイする際の出発点として、初めの環境のインストール・構成を完了する際に必要となるタスクの概要のハイライトです。
- 製品ドキュメントのガイドに従ってJBoss v4をダウンロードし、インストールします。以降、導入ディレクトリーは <jboss_home> と記載します。
- デフォルトのJBoss v4アプリケーション・サーバーのコピーを作成します。<jboss_home>\server\default 以下の内容を <jboss_home>\server\<your_server_name> の下へサブディレクトリーも含め、すべてコピーします。
- <jboss_home>\bin ディレクトリーから run.sh -c <貴方のサーバーの名前> コマンドで新しいサーバーを開始します。
- サーバーが開始したら、WebブラウザーでURL: http://localhost:8080 を指定してJBossが稼動していることを確認します。
JBossの「Welcome」画面が表示され、JBossコンソールにアクセスできるはずです。 - アプリケーション・サーバーが開始して稼動したら、次のステップとして、サンプル・アプリケーションに必要な残りの前提ソフトウエアをインストール・構成します。
前提ソフトウエアのインストールと構成
この記事に含まれているサンプル・アプリケーションをビルド・実行するには、Antビルド・ツールをインストール・構成する必要があります。
Antの構成
前述の通り、オンライン仲介アプリケーションのバイナリーをビルドするためにApache Antを使っています。もし貴方がAntをインストールしていなければ、これが丁度よい機会です。インストール後、システムのpath変数に <ant_home>\bin ディレクトリーが追加されていることを確認してください。
Apache Antは以下のURLからダウンロードできます。
http://ant.apache.org
XDocletの構成
構成ファイルを生成するためのビルド・ツールにはXDocletが使われています。これはオープンソースのコード生成エンジンです。XDoctletにより、Javaで属性(Attribute)志向のプログラミングが可能になります。要するに、貴方のソースコードにメタ・データ(属性)を記述することにより、貴方のコードに様々な意味を付加できる、ということです。これな特殊なJavaDocタグにより行われます。
XDocletは元々はEJBを作成するためのツールですが、より汎用的なコード生成エンジンに進化しました。XDocletはコア部分と、日々拡張されているいくつかのモジュールから構成されています。もし新しい種類のコンポーネントのための新しいモジュールが必要になったら、それを書くのは比較的簡単なことです。
http://xdoclet.sourceforge.net/xdoclet/index.html
XDocletの最新バージョンを展開して、build.properties ファイル中に xdoclet.home パラメーターをセットしてください。
サンプル・アプリケーションのビルド
この記事のコンピューター・アクセサリー販売アプリケーションは貴方がアプリケーションをビルドする際に利用できるAntスクリプトを提供しています。以下のリンクからコンピューター・アクセサリー販売アプリケーションをダウンロードしてください。
zipファイルを展開すると computer ディレクトリーが作成されます。そのディレクトリーにあるbuild.properties ファイルを開いて、以下の例のように、貴方の環境に合わせてプロパティを編集してください。
## Set the Geronimo 1.1 home here geronimo.home=<geronimo_home> ## Set XDoclet 1.2.3 Home xdoclet.home=<xdoclet_home>
ビルド・プロセスを開始する前に config ディレクトリーの build.properties ファイル中の geronimo.home と xdoclet.home に正しいパスを設定してください。
コマンド・プロンプトかシェルで computer ディレクトリーに移動して ant jboss を実行してください。この操作でearファイルが作成され、 release/jboss ディレクトリー上に配置されます。
サンプル・アプリケーションのデプロイ
サンプル・アプリケーションをデプロイする際は、computer.ear を computer/releases/jboss フォルダーから <jboss_home>/server/<your_server_name>/deploy フォルダーにコピーするだけです。
既にJBossが開始しているなら、自動的にデプロイされ、アプリケーションが開始します。JBossが開始していなければ、次回の始動時にデプロイされ、開始されます。
サンプル・アプリケーションのテスト
アプリケーションをテストするには、Webブラウザーを開いて以下のURLへアクセスしてください。
http://localhost:8080/computer
コンピュータ・アクセサリー販売アプリケーションの商品リスト・ページが立ち上がります。このアプリケーションでコンピュータのアクセサリーを購入できます。このアプリケーションは既に構成され稼動しています。
以下がサンプル・アプリケーションのショッピング・カートのデモです。
Back to Top
Geronimo環境
以下のURLからGeronimoをダウンロードしてインストールしてください。
http://geronimo.apache.org/downloads.html
URLにあるリリース・ノートには、システム要件、Geronimoのインストールや構成のための方法が正確に記載されています。以降、当記事では以降、Geronimoの導入ディレクトリーを <geronimo_home> と表記します。
TCP/IPポートの競合
もしJBossとGeronimoを同じマシンで動かそうとしているなら、少なくともどちらかひとつのサーバーのデフォルトのポート番号を変更することを検討する必要があります。
ステップ・バイ・ステップの移行
コンピュータ・アクセサリー販売のサンプル・アプリケーションをビルドすると、Antはサンプル・アプリケーションで提供されたようにJBoss用には jboss.xml 、Geronimo用には openejb-jar.xml というデプロイメント記述子をパッケージします。これらのファイルは computer/config ディレクトリーに配置されています。
以下のサンプルはJBossのデプロイメント記述子です。
<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>ShoppingCart</ejb-name> <local-jndi-name>ShoppingCart</local-jndi-name> <method-attributes> </method-attributes> </session> <session> <ejb-name>ItemService</ejb-name> <local-jndi-name>ItemService</local-jndi-name> <method-attributes> </method-attributes> </session> </enterprise-beans> <resource-managers> </resource-managers> </jboss>
これらを以下に示されているGeronimo 用のデプロイメント記述子と比べてみてください。
<?xml version="1.0" encoding="UTF-8"?> <openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"> <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2"> <dep:moduleId> <dep:groupId>org.apache.geronimo.samples</dep:groupId> <dep:artifactId>ComputerEJB</dep:artifactId> <dep:version>1.0</dep:version> <dep:type>car</dep:type> </dep:moduleId> <dep:dependencies/> <dep:hidden-classes/> <dep:non-overridable-classes/> </dep:environment> <enterprise-beans> <session> <ejb-name>ShoppingCart</ejb-name> <ejb-ref> <ref-name>ejb/ItemServiceLocal</ref-name> <ejb-link>ItemService</ejb-link> </ejb-ref> </session> <session> <ejb-name>ItemService</ejb-name> </session> </enterprise-beans> </openejb-jar>
初めに気づく違いはGeronimoの固有構成はJBossよりも多くの追加情報を含んでいるということでしょう。Geronimoの構成ファイルのある部分はMaven2のビルド・スクリプトと非常によく似ています。いずれの構成ファイルのEJBに関する情報を含んでいます。JBossはEJBとの関連付けにローカルJNDI名を使いますが、GeronimoではEJBの名前を直接指定します。上記の違い以外にも openejb-jar.xml ファイルは jboss.xml ファイルよりも明示的にEJBリファレンス情報を指定しています。
webアーカイブ・ファイル関連の構成ファイルを見ると、更にいくつかの違いがわかります。
<?xml version="1.0" encoding="UTF-8"?> <jboss-web> <!-- EJB Local References --> <ejb-local-ref> <ejb-ref-name>ejb/ItemServiceLocal</ejb-ref-name> <local-jndi-name>ItemService</local-jndi-name> </ejb-local-ref> <ejb-local-ref> <ejb-ref-name>ejb/ShoppingCartLocal</ejb-ref-name> <local-jndi-name>ShoppingCart</local-jndi-name> </ejb-local-ref> </jboss-web>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1" xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1"> <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1"> <dep:moduleId> <dep:groupId>org.apache.geronimo.samples</dep:groupId> <dep:artifactId>ComputerWeb</dep:artifactId> <dep:version>1.0</dep:version> <dep:type>car</dep:type> </dep:moduleId> <dep:dependencies/> <dep:hidden-classes/> <dep:non-overridable-classes/> </dep:environment> <naming:ejb-local-ref> <naming:ref-name>ejb/ItemServiceLocal</naming:ref-name> <naming:ejb-link>ItemService</naming:ejb-link> </naming:ejb-local-ref> <naming:ejb-local-ref> <naming:ref-name>ejb/ShoppingCartLocal</naming:ref-name> <naming:ejb-link>ShoppingCart</naming:ejb-link> </naming:ejb-local-ref> </web-app>
上記のように jboss-web.xml ファイルはEJBをJNDI名とマップしていますが、geronimo-web.xml ではEJBの名前を直接指定します。それぞれのマッピングでの参照名はサーブレットからEJBを使用する場合に使われるものです。WARファイル中の web.xml は個々のEJB参照名についてより多くの情報を含んでいますが、このアプリケーションではGeronimo版 もJBoss版も共通のものです。
サンプル・アプリケーションのビルド
computer ディレクトリーから以下のコマンドを実行し、移行されたGeronimo版のサンプル・アプリケーションをビルドします。
ant geronimo
結果、computer/releases/geronimo フォルダーに computer.ear が作成されます。
移行されたアプリケーションのデプロイ
移行後のコンピューター・アクセサリー販売アプリケーションをデプロイするために、Geronimoサーバーが起動していることを確認してください。
貴方のブラウザーでGeronimoコンソールを開いて、以下の手順に沿ってください。
- コンソール・ナビゲーションからDeploy New を選択します。
- Archive 入力ボックスに computer/releases/geronimo フォルダーの computer.ear を指定します。
- Install ボタンを押してアプリケーションをサーバーにデプロイします。
アプリケーションがデプロイされたら、Webブラウザーを開いて以下のURLを入力してください。
http://localhost:8080/computer
サマリー
この記事では、セッション・ビーンを使ったサンプル・アプリケーションをJBoss v4.0.5からGeronimoアプリケーション・サーバーに移行する方法を示しました。アプリケーションをビルド、デプロイ、実行してからGeronimo環境へ移行する手順を順番に行いました。
以下のリストはサンプル・アプリケーションの移行の過程で見つかった2つの大きな違いを要約しています。
- JBossへEJB jarファイルをデプロイするにはdeployディレクトリーにコピーするだけですが、Geronimoではデプロイヤー・ツール、コンソール、またはホット・デプロイメント・ディレクトリーを利用できます。
- JBoss と Geronimoのデプロイメント・プランは非常に似通っていますが、Geronimoでは初めの部分がMaven2のビルド・ファイルにとてもよく似ています。