第2回 XdocletでEJB作成を簡単にする

EJBコンソーシアム
2004/8/12



主な内容
EJBの構成要素
JBossIDEを使ってEJBを作ろう
JBoss上でEJBを動かそう

 本連載の第1回「EJBの学習の準備」にてEJBが難しいと思われる理由として以下のものを挙げました。

  • EJBを開発する環境や実行する環境を作るのは難しいのでは?
  • デプロイメントディスクリプタや各種インターフェイスなど付加的なものがあって難しそう
  • EJBを使うメリットが分かりづらい

 さらに第1回では、JBoss、Eclipse、JBossIDEを用いて開発環境を整えることにより、1つ目の問題点に答えました。

 今回は、前回整えた環境のうえで、XDocletを用いてSession Beanを作ることにより、付加的なファイルを自動生成できることを示し、2つ目の問題に答えていきます。

 なお、今回からEclipseを操作していきますが、慣れていない方は「連載:Eclipseを使おう!」を参考にしてください。

EJB の構成要素

 EJBにはSession Bean、Entity Bean、Message-driven Beanの3種類があります。Session Beanは主にビジネスロジックを扱うEJBで、クライアントとのやりとりの状態を保持できるStateful Session Beanと保持しないStateless Session Beanがあります。Entity Beanは、主にデータベースなどのデータソースのデータを扱うEJBで、データソースとのやりとりをコンテナが行うCMP Entity BeanとBean開発者が行うBMP Entity Beanがあります。Message-driven BeanはEJB 2.0で登場したEJBで、JMS(Java Messaging Service)のキューやトピックに送られたデータを処理するEJBです。

 また、EJBはEJBで行う処理を実装したBean実装ファイルのほかに、EJBの生成、検索、破棄の際にアクセスされるホームインターフェイス、ビジネスメソッドを呼び出す際に呼び出されるビジネスインターフェイス、EJBコンテナにデプロイする際の情報を記述したXMLファイルのデプロイメントディスクリプタが必要です。ホームインターフェイス/ビジネスインターフェイスには、同じプロセス内から呼び出されるときに使われるローカルインターフェイス、外部のプロセスから呼び出される場合に使われるリモートインターフェイスがあります。

 EJBを使用するためにはこれらのファイルを決められた形式で1つのjarファイルとしてアーカイブし、EJBコンテナにデプロイします。

参考:EJBの構成についてさらに詳しく知りたい方は「EJBの役割とメリット」「EJBのアーキテクチャ」「パフォーマンス問題を解決したEJBは実用期を迎える」を参考にしてください。

JBossIDEを使ってEJBを作ろう

 ここでは、簡単な銀行口座を扱うサービスをStateless Session Beanを用いて作成してみます。この際、XDocletを用いてJBossIDE上で開発を進めていきます。

 まず、Eclipseを立ち上げて、Javaプロジェクトを1つ作ります。この手順は以下のようになります。

1.Javaパースペクティブのパッケージ・エクスプローラー上でマウスの右ボタンをクリックし、[新規]→[プロジェクト]を選択する

2. [新規プロジェクト]ダイアログ上で[Java]→[Javaプロジェクト]を選択し[次へ]、プロジェクト名を入力し[次へ]を押す

3. [ソースタブ]ソースフォルダを[src]フォルダに指定し、[ライブラリ]タブで[外部JARの追加]をクリックし、%JBOSS_HOME%\server\default\lib\jboss-j2ee.jarを追加する

4.[終了]ボタンをクリックする

Bean実装ファイルの作成

 次に、EJBのBean実装ファイルを作成します。このクラスは、javax.ejb.SessionBeanインターフェイスを実装している必要があります。ここでは、このクラスのパッケージをsample、クラス名をBankBeanとします。このクラスを作成するには、以下の手順になります。

1. 作成したプロジェクトの「src」フォルダ上で、マウスの右ボタンをクリックし、[新規]→[クラス]を選択する

2. [パッケージ]フィールドに「sample」、[名前]フィールドに「BankBean」と入力する

3. [インターフェイス]フィールドの[追加]ボタンをクリックし、表示されたダイアログ上で「インターフェイスを選択してください」と書いてあるフィールドに「SessionBean」と入力し、マッチした[javax.Ejb.SessionBean]を選択し、[OK]ボタンをクリックする

設定を終了したところ

4. [終了]ボタンをクリックする

 エディタ上にいま作成されたクラスが表示されていると思います。ここでは、SessionBeanインターフェイスで定義されていたメソッドが自動的に追加されています。今回はここで特別な処理をしませんので、これらのメソッドはこのままにしておきます。

 SessionBeanはビジネスロジックを受け持つEJBです。ここでは、このEJBのビジネスメソッドとして以下のメソッドを定義します。

メソッド

機能
public int balance(int accountNumber) 指定した口座の残高を照会する
public void withdraw(int accountNumber, int amount) 指定した口座から指定した金額を引き出す
public void deposit(int accountNumber, int amount) 指定した口座に指定した金額を預け入れる

 これらのメソッドでは、データベースから対応する口座の情報を参照・更新します。データベースのデータを扱う処理は次回に説明しますので、今回は仮に簡単な実装をしておきます。

 次に、このクラスからXDocletがEJBに関連するファイルを自動生成できるように、このクラスに付加情報を付けていきます。

 まず、クラスレベルのXDocletコメントを作成します。クラス作成時に作成されたクラスレベルのJavaDocコメント(/**で始まるブロックコメント)の中で、@を入力し、その後ろでCtl+Spaceキーを押します。すると、補完の候補が表示されます。ここでは、XDoclet用の要素やJavaDoc要素が選択できます。それに加えて、Tで始まるものもいくつかあると思います。これは、JBossIDEが提供しているXDocletコメントのテンプレートです。ここでは、このテンプレートの中から「Stateless Session EJB」を選択します。すると、@ejb.beanで始まるコメントが生成されます。ここで生成されたコメントを自分の環境に合わせて変更します。ここでは、description属性とdisplay属性とjndi-name属性を変更し、以下のようなコメントとしました。

/**
 * @ejb.bean description="Sample Bank EJB"
 *           display-name="Bank"
 *           jndi-name="ejb/sample/Bank"
 *           name="Bank"
 *           type="Stateless"
 *           view-type="remote"
 * @author Kaz Kawamura
 */
public class BankBean implements SessionBean {
      ……

 EJBをデプロイしたとき、このEJBのリモートホームインターフェイスが、jndi-name属性で指定した名前でJNDIレポジトリに登録されます。ローカルホームインターフェイスのJNDI名はlocal-jndi-name属性で指定します。また、view-type属性にはremote、local、bothが指定でき、remoteを指定した場合はリモートからアクセスされるEJBとして、localを指定した場合はローカルからアクセスされるEJBとして、bothを指定した場合はその両方からアクセスされるEJBとしてデプロイされます。これ以外にもさまざまな要素が指定できますので、詳しくはXDocletのサイト(http://xdoclet.sourceforge.net/xdoclet/index.html)を参照してください。

 次にメソッドレベルのXDocletコメントを記述します。先ほど作成したメソッドをEJBのビジネスメソッドとして公開するためには、これらのメソッドがビジネスインターフェイス上に定義されている必要があります。先ほど作成したメソッドにJavaDocコメントがなければ、そのメソッド内でマウスを右ボタンクリックし、「ソース→JavaDocコメントの追加」を選択するとJavaDocコメントのひな型が生成されます。通常のJavaDocコメントに加えてXDocletコメントも追加します。ここでは、@ejb.と入力しCtl+Spaceキーを押してみます。すると、指定できる要素の補完候補が表示されますので、この中からinterface-methodを選択します。これで、このメソッドはEJBのビジネスメソッドとしてマークされました。

/**
     * @ejb.interface-method 
     * @param accountNumber 口座番号
     * @return 残高
     */
    public int balance(int accountNumber) {
        ……

 これで、Bean実装ファイルの実装が完了しました。

    
EJB関連ファイルの生成

 ここでは、いま作成したBean実装ファイルからXDocletを用いてインターフェイスやデプロイメントディスクリプタを生成します。この手順は、以下のようになります。

1.プロジェクトを選択し、右ボタンをクリックして[プロパティ]を選択する

2.「XDoclet Configurations」を選択する

3.右上の領域で、右ボタンをクリックし[Add Standard]を選択する

4.ダイアログ上で[Standard EJB]を選択し、[OK]ボタンをクリックする

5.これで、ダイアログ上に設定が追加される

ダイアログ上に設定が追加されたところ (クリックすると拡大)

注:テンプレートではjboss用のデプロイメントディスクリプタの出力先の設定が不十分です。jboss→destDirのチェックボックスにチェックを入れます

6. [OK]ボタンを押してダイアログを閉じる

 これで、XDoclet用の設定が完了しました。

 次にXDocletを呼び出します。これは、プロジェクトを選択し、右ボタンをクリックし、「Run XDoclet」を選択することによって呼び出されます。これで、インターフェイスやユーティリティクラス、デプロイメントディスクリプタが生成されました。

JBoss上でEJBを動かそう

 最後にJBoss上でこのEJBを動かしてみましょう。EJBをアプリケーションサーバにデプロイするためには、初めにEJB jarファイルを生成する必要があります。この手順は以下のようになります。

1.プロジェクトを選択し、右ボタンをクリックして「プロパティ」を選択する

2. 「Packaging Configurations」を選択する

3.右側の領域で、右ボタンをクリックし「Add Std. Archive」を選択する

4.ダイアログ上で「Standard-EJB.jar」を選択し、[OK]ボタンをクリックする

5.これでダイアログ上に設定が追加される

ダイアログ上に設定が追加されたところ (クリックすると拡大)

注:テンプレートではエラーが出るので、MANIFEST.MFのチェックボックスをオフにします

6.[OK]ボタンを押してダイアログを閉じる

 これで、EJB-jar用の設定が完了しました。次にEJB-jarを生成します。これは、プロジェクトを選択し、右ボタンをクリックし、「Run Packaging」を選択することによって呼び出されます。これで、プロジェクトの直下にStandard-EJBというファイルが生成されました。

 次に、ここで生成されたEJB-jarをJBoss上にデプロイします。

1.先ほど生成したEJB-jarファイルを選択し、[Deployment]→[Deploy To…]を選択する

2.ダイアログ上にデプロイ先の候補がリストされるので、その中から1つ選択し、[OK]ボタンを押す(ここではdefaultを選ぶ)

3.デプロイがうまくいったことを示すダイアログが出るので、[OK]を押す

 デプロイが成功すると、デプロイしたアーカイブファイルのアイコンに緑色の矢印が表示されるはずです。

 最後にJBossサーバを起動し、作成したEJBがうまくデプロイされていることを確認します。[Server Navigator]ビュー上で前回設定したサーバを選択し、右ボタンをクリックし[Start]を選択します。コンソール上に以下のような出力が表示され、このサーバ上で作成したEJBが起動されたことが分かります。

09:26:39,104 INFO [MainDeployer] Starting deployment of package: file:/C:/jboss-3.2.3/server/default/deploy/Standard-EJB.jar
09:26:39,975 INFO [EjbModule] Deploying Bank
09:26:40,316 INFO [StatelessSessionInstancePool] Started jboss.j2ee:jndiName=ejb/sample/Bank,plugin=pool,service=EJB
09:26:40,316 INFO [StatelessSessionContainer] Started jboss.j2ee:jndiName=ejb/sample/Bank,service=EJB
09:26:40,316 INFO [EjbModule] Started jboss.j2ee:module=Standard-EJB.jar,service=EjbModule
09:26:40,316 INFO [EJBDeployer] Deployed: file:/C:/jboss-3.2.3/server/default/deploy/Standard-EJB.jar
09:26:40,416 INFO [MainDeployer] Deployed package: file:/C:/jboss-3.2.3/server/default/deploy/Standard-EJB.jar

 次回は、Entity Beanを用いてデータベースにアクセスする手順を説明します。そこでは、CMP Entity Beanによる簡単なデータベースアクセスを例にEJBを使う利点を説明します。

筆者プロフィール
河村嘉之
EJBコンソーシアム オープンソース研究会 副主査(日立ソフトウェアエンジニアリング株式会社 インターネットビジネス部)


鷲尾典俊
EJBコンソーシアム オープンソース研究会 JBossチーム リーダー(日立ソフトウェアエンジニアリング株式会社 インターネットビジネス部)

【筆者あとがき 】
EJBコンソーシアムでは、オープンソースプロダクトを題材にJ2EE技術者のすそ野を広げる目的で、J2EEオープンソース研究会を立ち上げ、第1期としてJBossとJUnitに関する教材を作成いたしました。なお、この原稿はEJBコンソーシアムJ2EEオープンソース研究会JBossチームの成果を基に書かれています。このチームの成果は、以下の各社の皆さまの努力によるものです。

 川鉄情報システム株式会社
 株式会社電通国際情報サービス
 株式会社トスコ
 日立ソフトウェアエンジニアリング株式会社
 富士通株式会社
 株式会社豆蔵




Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間