| Sun ONE Application Server 7, Enterprise Edition サーバーアプリケーションの移行および再配備 |
第 5 章
iBank アプリケーションの移行手順この章では、Sun ONE Application 6.0 または 6.5 から Sun ONE Application Server 7 に、標準的な J2EE アプリケーションの主要コンポーネントを移行するプロセスについて説明します。各種コンポーネントの移行中に生じる問題に焦点をあてて、これらの問題に役立つ解決策を紹介します。
ここでは、iBank と呼ばれる J2EE アプリケーションを使用し、バージョン 6.0 または 6.5 の Sun ONE Application Server から Sun ONE Application Server 7 への、iBank アプリケーションの実際の移行作業を基にしたプロセスが示されています。iBank はオンラインバンキングサービスをシミュレートし、通常の J2EE アプリケーションに付随するあらゆる特徴を持っています。
iBank アプリケーションに適用される J2EE 仕様の重要なポイントを以下に示します。
iBank アプリケーションの詳細については、付録 A 「iBank アプリケーションの仕様」を参照してください。
iBank アプリケーションの移行の準備
移行プロセスを開始する前に、配備記述子の相違点を把握しておきましょう。詳細については、「配備記述子の移行」を参照してください。
ターゲットの選択
アプリケーションがフェイルオーバー機能をサポートしている場合、移行のターゲットサーバーとして Sun ONE Application Server 7, Enterprise Edition を選択する必要があります。持続型 ha は、Sun ONE Application Server 7, Enterprise Edition のフェイルオーバー機能を必要とする本稼働環境に対応しています。移行対象アプリケーションでフェイルオーバー機能を有効にする方法の詳細については、『管理者ガイド』を参照してください。
アプリケーションが高可用性機能を使用しない場合は、アプリケーションのターゲットサーバーとして Sun ONE Application Server 7, Standard Edition あるいは Sun ONE Application Server 7, Platform Edition を選択できます。
ターゲットサーバーを選択したら、移行環境にサーバーをインストールします。ソフトウェアの詳しいインストール方法については、『インストールガイド』を参照してください。
コンポーネントの移行に Sun ONE Migration Tool を使用する場合は、このツールをインストールする必要があります。Sun ONE Migration Tool は、次の URL からダウンロードできます。
ツールの使用方法については、Sun ONE Migration Tool のオンラインヘルプを参照してください。
開発環境
Sun ONE Application Server 6.5 の iBank アプリケーションは、Sun ONE Application Server 6.5 および Sun ONE Studio で開発されています。Sun ONE Application Server 6.5 は、次の機能をサポートします。
iBank アプリケーションのコンポーネントの識別
iBank アプリケーションのソース (iBank65.zip) は、移行サイト http://www.sun.com/migration/sunonetools.html から入手できます。iBank65.zip ファイルを解凍すると、次のようなディレクトリ構造が作成されます。
iBank
/docroot
/session
/entity
/misc
- /docroot のルートには、HTML ファイル、JSP ファイル、および画像ファイルが含まれます。また、サーブレットや EJB のソースファイルも、パッケージ構造 com.sun.bank.* に従って、サブフォルダ WEB-INF¥classes に含まれます。WAR ファイルは、このディレクトリの内容から生成されます。
- /session には、パッケージ構造 com.sun.bank.ejb.session に従ってセッション Beans のソースコードが含まれます。このディレクトリはセッション Beans の EJB モジュールを形成します。
- /entity には、パッケージ構造 com.sun.bank.ejb.entity に従ってエンティティ Beans が含まれます。このディレクトリはエンティティ Beans の EJB モジュールを形成します。
- /misc には、データベースセットアップ用の SQL スクリプトが含まれます。
スキーマのセットアップ
/misc フォルダに入っている SQL スクリプトを実行して、iBank アプリケーションのスキーマをセットアップします。これらのスクリプトは、Oracle データベース用です。これらのスクリプトによって、ユーザーの作成、表の作成、および表へのデータの挿入が行われます。次の順序で、スクリプトを実行します。
iBank アプリケーションの手動移行
Sun ONE Application Server 7 で CMP 1.1 がサポートされているため、手動の移行でソースコードを大幅に修正する必要はありません。ただし、アプリケーションを手動で移行する場合、以下の点について、いくつか変更が必要になります。
Web アプリケーションの変更
Sun ONE Application Server 6.0/6.5 から Sun ONE Application Server 7 に iBank を移行する場合、iBank アプリケーションの Web アプリケーション部分を変更する必要はありません。ソースディレクトリから ias-web.xml ファイルを削除します。これは Sun ONE Application Server 7 の配備記述子 sun-web.xml ファイル内の対応するデータにアクセスできる情報がこのファイルに入っていないからです。web.xml を変更する必要はありません。
ただし、一般的には、サーバー固有のリソースにマップする必要がある web.xml 内に情報が含まれていることがあるため、sun-web.xml での宣言が必要となります。たとえば、web.xml ファイルで javax.sql.Datasource タイプのリソース参照が宣言されている場合、sun-web.xml 内で、サーバー上の実際のデータソースの JNDI 名に、その参照をマップする必要があります。
sun-web.xml は新たに作成する必要があります。以下に、Sun ONE Application Server 固有の配備記述子 sun-web.xml の作成プロセスの概要を示します。
- 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
'http://www.sun.com/software/sunone/appserver/dtds/sun-web-app_2_3- 0.dtd'>
sun-web.xml という名前で、このファイルを保存します。
- DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-web です。DTD では、この要素は次のように定義します。
<!ELEMENT sun-web-app (security-role-mapping*, servlet*, session-config?, resource-env-ref*, resource-ref*, ejb-ref*, cache?, class-loader?, jsp-config?, locale-charset-info?, property*)>
上記の宣言から、すべてのタグがオプションであることは明白です。したがって、デフォルトの sun-web.xml は次のようになります。
<!DOCTYPE sun-web-app SYSTEM "http://www.sun.com/software/sunone/appserver/dtds/sun-web-app_2_3-0.dtd">
</sun-web-app>
- リソース参照を宣言するには、次のように定義します。
<!ELEMENT resource-ref (res-ref-name, jndi-name, default-resource-principal?)> サブ要素は、次のようになります。
<!ELEMENT res-ref-name (#PCDATA)>
<!ELEMENT default-resource-principal (name, password)>
<!ELEMENT jndi-name (#PCDATA)>iBank アプリケーションの場合、sun-web.xml に次のリソース参照宣言を含める必要があります。
<sun-web-app>
<resource-ref>
<res-ref-name>jdbc/IBank</res-ref-name>
<jndi-name>jdbc/IBank</jndi-name>
<default-resource-principal>
<name>ibank_user</name>
<password>ibank_user</password>
</default-resource-principal>
</resource-ref>
</sun-web-app>
EJB の変更
Sun ONE Application Server 6.5 から Sun ONE Application Server 7 に iBank を移行する場合、EJB のコードを変更する必要はありません。
セッション Beans :
ejb-jar.xml : ejb-jar.xml では、最新の DTD URL を示すように、<!DOCTYPE 定義を変更します。この新しい定義は、次のようになります。
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN'
'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>Sun ONE Application Server 6.5 の ias-ejb-jar.xml は、Sun ONE Application Server 7 では sun-ejb-jar.xml に置き換えられています。これらの 2 つの XML ファイルの DTD は根本的に異なっているため、ejb-jar.xml と ias-ejb-jar.xml から必要な情報を抽出して、新しい sun-ejb-jar.xml を作成する必要があります。以下に、ejb-jar.xml ファイルの作成プロセスの概要を示します。
- 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>
このファイルに sun-ejb-jar.xml という名前を付けて、修正した ejb-jar.xml と一緒に保存します。
- DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-ejb-jar です。DTD では、この要素は次のように定義します。
<!ELEMENT sun-ejb-jar (security-role-mapping*,enterprise-beans)>
security-role-mapping タグは、ejb-jar.xml で宣言されているセキュリティロールをマッピングするためのものです。iBank アプリケーションの ejb-jar.xml ファイルにはセキュリティの宣言がないので、このタグの宣言は省略できます。enterprise-beans タグに注目してください。現在、sun-ejb-jar.xml ファイルの内容は、次のようになっています。
<sun-ejb-jar>
<enterprise-beans>
</enterprise-beans>
</sun-ejb-jar>
注 : ここでは、ドキュメントのヘッダー部分、すなわち、XML 宣言と DOCTYPE 定義は省略しています。
- enterprise-beans 要素は、次のように DTD で定義します。
<!ELEMENT enterprise-beans (name?, unique-id?, ejb*, pm-descriptors?, cmp-resource?)>
オプションの名前の要素には、<enterprise-beans> の正準名が入ります。この要素には、任意の名前を付けることができます。
<unique-id> 要素は、Sun ONE Application Server で使用されるもので、アプリケーションの配備時に、Application Server によって自動的に挿入されます。
最も重要なタグは、EJB 要素タグです。この要素は、単一の EJB の実行時バインドを指定します。これは、次のように DTD で定義します。
<!ELEMENT ejb (ejb-name, jndi-name?, ejb-ref*, resource-ref*, resource-env-ref*, pass-by-reference?, cmp?, principal?, mdb-connection-factory?, jms-durable-subscription-name?, jms-max-messages-load?, ior-security-config?, is-read-only-bean?, refresh-period-in-seconds?, commit-option?, gen-classes?, bean-pool?, bean-cache?)>
この場合、ejb 要素に ejb-name 要素が含まれます。ejb-name 要素には、EJB の正準名が入ります。この名前は、EJB の ejb-jar.xml の ejb-name 要素内に宣言した名前と一致している必要があります。また、この要素には、EJB の jndi-name も含まれます。Sun ONE Application Server 6.5 から 7 で改善された点の 1 つは、Bean の開発者が EJB の ejb-name と jndi-name を自由に変更できるようになったという柔軟性です。Sun ONE Application Server 6.5 では、EJB の JNDI 名はデフォルトで ejb/<ejb-name> に設定されていました。
移行を円滑に行うため、EJB の jndi-name をそのままの状態にしておき、その他のすべてのリソースについても Sun ONE Application Server 6.5 のときと同じものにしておきます。このため、ここではすべての EJB の ejb-name を ejb/<ejb-name> と宣言します。
上記のロジックを使用すると、sun-ejb-jar.xml の内容は、次のようになります。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>BankTeller</ejb-name>
<jndi-name>ejb/BankTeller</jndi-name>
</ejb>
<ejb>
<ejb-name>InterestCalculator</ejb-name>
<jndi-name>ejb/InterestCalculator</jndi-name>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
- ejb-jar.xml 内の各 <ejb-ref> 要素について、sun-ejb-jar.xml 内に対応する <ejb-ref> 要素が存在します。ejb-jar.xml 内の <ejb-ref> 要素は、その EJB の Bean クラス内から、参照されるすべての EJB を宣言するために使用します。Bean クラスコードは、<ejb-ref-name> を使用して、EJB を参照するときに、この <ejb-ref-name> をアプリケーションサーバー上の Bean の実際の <jndi-name> にマップする必要があります。このため、これは EJB 実装で参照される名前と Bean の実際の JNDI 名の間に、抽象化層を追加するためのメカニズムとして機能します。
上記で説明したロジックを使用して、BankTeller EJB について見てみます。ejb-jar.xml では、2 つの <ejb-ref> 宣言がこの EJB 内に存在します。最初の宣言は Customer EJB (エンティティ Bean モジュール内のエンティティ Bean) 用です。前述の手順 3 で説明したように、すべての EJB の JNDI 名は、ejb/<ejb-name> のままにしておき、この宣言を sun-ejb-jar.xml 内に追加します。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>BankTeller</ejb-name>
<jndi-name>ejb/BankTeller</jndi-name><ejb-ref>
<ejb-ref-name>Customer</ejb-ref-name>
<jndi-name>ejb/Customer</jndi-name</ejb-ref>
</ejb>
<ejb>
<ejb-name>InterestCalculator</ejb-name>
<jndi-name>ejb/InterestCalculator</jndi-name></ejb>
</enterprise-beans>
</sun-ejb-jar>
同様に、Account EJB 用の <ejb-ref> タグを追加します。InterestCalculator Bean の場合、<ejb-ref> タグは、ejb-jar.xml 内に存在しないため、sun-ejb-jar.xml 内でも必要ありません。現在、sun-ejb-jar.xml ファイルの内容は、次のようになっています。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>BankTeller</ejb-name>
<jndi-name>ejb/BankTeller</jndi-name><ejb-ref>
<ejb-ref-name>Customer</ejb-ref-name>
<jndi-name>ejb/Customer</jndi-name></ejb-ref>
<ejb-ref>
<ejb-ref-name>Account</ejb-ref-name>
<jndi-name>ejb/Account</jndi-name></ejb-ref>
</ejb>
<ejb>
<ejb-name>InterestCalculator</ejb-name>
<jndi-name>ejb/InterestCalculator</jndi-name></ejb>
</enterprise-beans>
</sun-ejb-jar>
- ejb要素には、pass-by-reference 要素 <!ELEMENT pass-by-reference (#PCData) が含まれます。
pass-by-reference 要素は、pass-by-reference (参照渡し) セマンティクスの使用を制御します。EJB 仕様では、デフォルトの動作モードとなる参照渡しを必要としています。これは、対応できない操作やより高速なパフォーマンスに向けて、true を設定することができます。これは、閉ざされた環境にある EJB モジュールすべてに適用できます。設定できる値は、true と false です。デフォルト値は false です。
- ejb 要素には、<bean-cache> 要素も含まれます。
<!ELEMENT bean-cache (max-cache-size?, is-cache-overflow-allowed?, cache-idle-timeout-in-seconds?, removal-timeout-in-seconds?, victim-selection-policy?)>
この要素は、ステートフルセッション Bean とエンティティ Bean だけで使用されます。iBank アプリケーションの場合、BankTeller セッション Bean だけが、このエントリを含みます。
このタグでは、max-cache-size によって、キャッシュ内の Beans の最大数を定義します。cache-idle-timeout-in-seconds では、ステートフルセッション Bean やエンティティ Bean がアイドル状態でキャッシュ内に存在できる最大時間を指定しますこの時間を過ぎると、Bean はバックアップストアで非活性化されます。この時間はサーバーが参考にします。cache-idle-timeout-in-seconds のデフォルト値は 10 分です。
Bean が非活性化される (バックアップストアでアイドル状態になっている) 時間は、removal-timeout-in-seconds パラメータによって制御されます。Bean は removal-timeout-in-seconds の値を超えた時間アクセスされなかった場合、バックアップストアから削除されてしまうので、クライアントからアクセスできなくなります。removal-timeout-in-seconds のデフォルト値は 60 分です。
上記のエントリが追加されて、sun-ejb-jar.xml ファイルは、次のようになります。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>BankTeller</ejb-name>
<jndi-name>ejb/BankTeller</jndi-name>
<ejb-ref>
<ejb-ref-name>Customer</ejb-ref-name>
<jndi-name>ejb/Customer</jndi-name>
</ejb-ref>
<ejb-ref>
<ejb-ref-name>Account</ejb-ref-name>
<jndi-name>ejb/Account</jndi-name>
</ejb-ref>
<pass-by-reference>false</pass-by-reference>
<bean-cache>
<cache-idle-timeout-in-seconds>
0
</cache-idle-timeout-in-seconds>
<removal-timeout-in-seconds>
0
</removal-timeout-in-seconds>
</bean-cache>
</ejb>
<ejb>
<ejb-name>InterestCalculator</ejb-name>
<jndi-name>ejb/InterestCalculator</jndi-name>
<pass-by-reference>false</pass-by-reference>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
- ステートレスセッション Bean とメッセージ駆動型 Bean のプールを定義するためだけに使用される要素は、<bean-pool> です。
<!ELEMENT bean-pool (steady-pool-size?, resize-quantity?, max-pool-size?, pool-idle-timeout-in-seconds?, max-wait-time-in-millis?)>
Beans の初期数と最小数を指定する steady-pool-size は、プールで保持する必要があります。
resize-quantity では、プールが「プールマネージャ」によってサービスが実行されている場合に、作成または削除する Bean の数を指定します。
max-pool-size は、プールの最大サイズを指定します。指定できる値は、0 から MAX_INTEGER の範囲です。
max-pool-size は、プールの最大サイズを指定します。
pool-idle-timeout-in-seconds では、ステートレスセッション Bean やメッセージ駆動型 Bean がアイドル状態でプール内に存在できる最大時間を指定します。
最終的に sun-ejb-jar.xml ファイルの内容は、次のようになります。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>BankTeller</ejb-name>
<jndi-name>ejb/BankTeller</jndi-name>
<ejb-ref>
<ejb-ref-name>Customer</ejb-ref-name>
<jndi-name>ejb/Customer</jndi-name>
</ejb-ref>
<ejb-ref>
<ejb-ref-name>Account</ejb-ref-name>
<jndi-name>ejb/Account</jndi-name>
</ejb-ref>
<pass-by-reference>false</pass-by-reference>
<bean-cache>
<cache-idle-timeout-in-seconds>
0
</cache-idle-timeout-in-seconds>
<removal-timeout-in-seconds>
0
</removal-timeout-in-seconds>
</bean-cache>
</ejb>
<ejb>
<ejb-name>InterestCalculator</ejb-name>
<jndi-name>ejb/InterestCalculator</jndi-name>
<pass-by-reference>false</pass-by-reference>
<bean-pool>
<pool-idle-timeout-in-seconds>
0
</pool-idle-timeout-in-seconds>
</bean-pool>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
エンティティ Beans :
ejb-jar.xml : ejb-jar.xml に備えて、最新の DTD URL を示すように、<!DOCTYPE 定義を変更します。この新しい定義は、次のようになります。
ejb-jar.xml のすべての CMP に対して、1.1 の値を指定した <cmp-version> タグを挿入します。
エンティティ Bean のエントリは、次のようになります。
<エンティティ>
<description>Account CMP entity bean</description>
<ejb-name>Account</ejb-name>
<home>com.sun.bank.ejb.entity.AccountHome</home>
<remote>com.sun.bank.ejb.entity.Account</remote>
<ejb-class>com.sun.bank.ejb.entity.AccountEJB</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>
com.sun.bank.ejb.entity.AccountPK
</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>1.x</cmp-version>
<cmp-field>
<field-name>branchCode</field-name></cmp-field>
<cmp-field>
<field-name>accTypeId</field-name></cmp-field>
<cmp-field>
<field-name>accBalance</field-name></cmp-field>
<cmp-field>
<field-name>custNo</field-name></cmp-field>
<cmp-field>
<field-name>accNo</field-name></cmp-field>
</entity>
同様に、すべての CMP Beans にこのエントリが含まれます。
セッション Beans の場合と同様に、Sun ONE Application Server 6.5 の ias-ejb-jar.xml は、Sun ONE Application Server 7 では sun-ejb-jar.xml に置き換えられています。これらの 2 つの XML ファイルの DTD は根本的に異なっているため、ejb-jar.xml と ias-ejb-jar.xml から必要な情報を抽出して、新しい sun-ejb-jar.xml を作成する必要があります。以下に、sun-ejb-jar.xml ファイルの作成プロセスの概要を示します。
- 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>
このファイルに sun-ejb-jar.xml という名前を付けて、修正した ejb-jar.xml と一緒に保存します。
- DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-ejb-jar です。DTD では、この要素は次のように定義します。
<!ELEMENT sun-ejb-jar (security-role-mapping*, enterprise-beans) >
security-role-mapping タグは、ejb-jar.xml で宣言されているセキュリティロールをマッピングするためのものです。iBank アプリケーションの場合、ejb-jar.xml ファイルで宣言されているセキュリティがないので、オプションタグである security-role-mapping の宣言を省略して、enterprise-beans タグに重点を置きます。現在、sun-ejb-jar.xml ファイルの内容は、次のようになっています。
<sun-ejb-jar>
<enterprise-beans>
</enterprise-beans>
</sun-ejb-jar>
注 : ここでは、ドキュメントのヘッダー部分、すなわち、XML 宣言と DOCTYPE 定義は省略しています。
- <enterprise-beans> 要素は、次のように DTD で定義します。
<!ELEMENT enterprise-beans (name?, unique-id?, ejb*, pm-descriptors?, cmp-resource?)>
オプションの名前の要素には、<enterprise-beans> の正準名が入ります。この要素には、任意の名前を付けることができます。
<unique-id> 要素は、Sun ONE Application Server で使用されるもので、アプリケーションの配備時に、Application Server によって自動的に挿入されます。
ejb 要素は、単一の EJB の実行時バインドを指定します。これは、次のように DTD で定義します。
<!ELEMENT ejb (ejb-name, jndi-name?, ejb-ref*, resource-ref*, resource-env-ref*, pass-by-reference?, cmp?, principal?, mdb-connection-factory?, jms-durable-subscription-name?, jms-max-messages-load?, ior-security-config?, is-read-only-bean?, refresh-period-in-seconds?, commit-option?, gen-classes?, bean-pool?, bean-cache?)>
この場合、ejb 要素に ejb-name 要素が含まれます。ejb-name 要素には、EJB の正準名が入ります。この名前は、その EJB 用の ejb-jar.xml の ejb-name 要素内で宣言された名前と同じになります。また、この要素には、EJB の jndi-name も含まれます。Sun ONE Application Server 6.5 から 7 で改善された点の 1 つは、Bean の開発者が EJB の ejb-name と jndi-name を自由に変更できるようになったという柔軟性です。Sun ONE Application Server 6.5 では、EJB の JNDI 名はデフォルトで ejb/<ejb-name> に設定されていました。
移行を円滑に行うため、EJB の jndi-name をそのままの状態にしておき、その他のすべてのリソースについても Sun ONE Application Server 6.5 のときと同じものにしておきます。ここではすべての EJB の ejb-name を ejb/<ejb-name> と宣言します。
上記のロジックを使用すると、sun-ejb-jar.xml に次のエントリができます。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name> Account</ejb-name>
<jndi-name>ejb/Account</jndi-name>
</ejb>
<ejb> --- </ejb>
<ejb> --- </ejb>
other ejb's
<ejb> --- </ejb>
<ejb> --- </ejb>
</enterprise-beans>
</sun-ejb-jar>
- ejb 要素には、pass-by-reference 要素 <!ELEMENT pass-by-reference (#PCData) が含まれます。
pass-by-reference 要素は、pass-by-reference (参照渡し) セマンティクスの使用を制御します。EJB 仕様では、デフォルトの動作モードとなる参照渡しを必要としています。これは、対応できない操作やより高速なパフォーマンスに向けて、true を設定することができます。これは、閉ざされた環境にある EJB モジュールすべてに適用できます。設定できる値は、true と false です。デフォルト値は false です。
- CMP エンティティ Beans の場合、cmp 要素を宣言し、EJB1.1 および EJB2.0 の Beans の CMP EntityBean オブジェクトに関する実行時情報を記述します。
<!ELEMENT cmp (mapping-properties?, is-one-one-cmp?, one-one-finders?)>
この mapping-properties タグには、持続性ベンダー固有の O/R マッピングファイルの場所が入ります。is-one-one-cmp フィールドは古い記述子を使用した CMP 1.1 の識別に使用されます。CMP 1.1 を古い記述子とする場合、このフィールドに true を指定します。one-one-finders には、CMP 1.1 のファインダが入ります。
このルート要素 <finder> には、メソッド名とクエリパラメータを持つ CMP 1.1 のファインダが入ります。
<!ELEMENT finder (method-name, query-params?, query-filter?, query-variables?)>
method-name 要素には、クエリフィールドのメソッド名が入ります。query-params 要素には、CMP 1.1 ファインダのクエリパラメータが入ります。
query-filter は、CMP 1.1 ファインダのクエリフィルタが入る任意指定の要素です。
上記の iBank のエントリを作成すると、sun-ejb-jar.xml は、次のようになります。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name> Account</ejb-name>
<jndi-name>ejb/Account</jndi-name>
<pass-by-reference>false</pass-by-reference>
<cmp>
<mapping-properties>
META-INF/sun-cmp-mappings.xml
</mapping-properties>
<is-one-one-cmp>true</is-one-one-cmp>
<one-one-finders>
<finder>
<method-name>
findOrderedAccountsForCustomer
</method-name>
<query-params>int custNo</query-params>
<query-filter>
custNo == custNo
</query-filter>
</finder>
</one-one-finders>
</cmp>
</ejb>
<ejb> --- </ejb>
<ejb> --- </ejb>
other ejb's
<ejb> --- </ejb>
<ejb> --- </ejb>
</enterprise-beans>
</sun-ejb-jar>
Account は、主キー以外のファインダを持つエンティティ Bean だけです。このため、上記のファインダのエントリは、Account Bean の場合だけになります。
- <!ELEMENT commit-option (#PCDATA)> では、コミットのオプションを指定します。
- <ejb> 要素には、<bean-cache> 要素も含まれます。
<!ELEMENT bean-cache (max-cache-size?, is-cache-overflow-allowed?, cache-idle-timeout-in-seconds?, removal-timeout-in-seconds?, victim-selection-policy?)>
この要素は、ステートフルセッション Bean とエンティティ Bean だけで使用されます。このタグでは、max-cache-size によって、キャッシュ内の Beans の最大数を定義します。cache-idle-timeout-in-seconds では、ステートフルセッション Bean やエンティティ Bean がアイドル状態でキャッシュ内に存在できる最大時間を指定します。この時間を過ぎると、Bean はバックアップストアで非活性化されます。この時間はサーバーが参考にします。cache-idle-timeout-in-seconds のデフォルト値は 10 分です。
Bean が非活性化される (バックアップストアでアイドル状態になっている) 時間は、removal-timeout-in-seconds パラメータによって制御されます。Bean は removal-timeout-in-seconds の値を超えた時間アクセスされなかった場合、バックアップストアから削除されてしまうので、クライアントからアクセスできなくなります。removal-timeout-in-seconds のデフォルト値は 60 分です。
上記のエントリが追加されて、sun-ejb-jar.xml ファイルは、次のようになります。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name> Account</ejb-name>
<jndi-name>ejb/Account</jndi-name>
<pass-by-reference>false</pass-by-reference>
<cmp>
<mapping-properties>
META-INF/sun-cmp-mappings.xml
</mapping-properties>
<is-one-one-cmp>true</is-one-one-cmp>
<one-one-finders>
<finder>
<method-name>
findOrderedAccountsForCustomer
</method-name>
<query-params>int custNo</query-params>
<query-filter>
custNo == custNo
</query-filter>
</finder>
</one-one-finders>
</cmp>
<commit-option>C</commit-option>
<bean-cache>
<max-cache-size>60</max-cache-size>
<cache-idle-timeout-in-seconds>
0
</cache-idle-timeout-in-seconds>
</bean-cache>
</ejb>
<ejb> --- </ejb>
<ejb> --- </ejb>
other ejb's
<ejb> --- </ejb>
<ejb> --- </ejb>
</enterprise-beans>
</sun-ejb-jar>
- <!ELEMENT enterprise-beans (name?, unique-id?, ejb*, pm-descriptors?, cmp-resource?)>
<pm-descriptors> 要素は次のようになります。
<!ELEMENT pm-descriptors ( pm-descriptor+, pm-inuse)>
持続マネージャ記述子には 1 つまたは複数の pm 記述子を含めることができます。ただし一度に使える記述子は 1 つだけです。
<pm-descriptor> は、エンティティ Bean に関連付けられた持続マネージャのプロパティを示します。pm-identifier 要素は、PM 実装を提供したベンダーを示します。さらに、pm-version では、使用する PM ベンダー製品のバージョンを指定します。pm-config では、使用するベンダー固有の設定ファイルを指定します。pm-class-generator では、ベンダー固有の具象クラスジェネレータを指定します。このクラスの名前はベンダーによって異なります。pm-mapping-factory では、ベンダー固有のマッピングファクトリを指定します。このクラスの名前はベンダーによって異なります。pm-insue では、この特定の PM を使用する必要があるかどうかを指定します。
<cmp-resource> 要素には、ejb-jar の CMP Bean を格納するのに使用するデータベースが入ります。
<!ELEMENT cmp-resource (jndi-name, default-resource-principal?)>
jndi-name 要素では、JNDI 名の文字列を指定します。default-resource-principal 要素には、リソースへのアクセス時に何も指定しない場合に使用する要素名とパスワードがあります。
<!ELEMENT default-resource-principal (name, password)>
これで、sun-ejb-jar.xml ファイルの内容は、次のようになります。
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name> Account</ejb-name>
<jndi-name> ejb/Account</jndi-name>
<pass-by-reference>false</pass-by-reference>
<cmp>
<mapping-properties>
META-INF/sun-cmp-mappings.xml
</mapping-properties>
<is-one-one-cmp>true</is-one-one-cmp>
<one-one-finders>
<finder>
<method-name>
findOrderedAccountsForCustomer
</method-name>
<query-params>int custNo</query-params>
<query-filter>
custNo == custNo
</query-filter>
</finder>
</one-one-finders>
</cmp>
<commit-option>C</commit-option>
<bean-cache>
<max-cache-size>60</max-cache-size>
<cache-idle-timeout-in-seconds>
0
</cache-idle-timeout-in-seconds>
</bean-cache>
</ejb>
<ejb> --- </ejb>
<ejb> --- </ejb>
other ejb's
<ejb> --- </ejb>
<ejb> --- </ejb>
<pm-descriptors>
<pm-descriptor>
<pm-identifier>IPLANET</pm-identifier>
<pm-version>1.0</pm-version>
<pm-class-generator>
com.iplanet.ias.persistence.
internal.ejb.ejbc.JDOCodeGenerator
</pm-class-generator>
<pm-mapping-factory>
com.iplanet.ias.cmp.NullFactory
</pm-mapping-factory>
</pm-descriptor>
<pm-inuse>
<pm-identifier>IPLANET</pm-identifier>
<pm-version>1.0</pm-version></pm-inuse>
</pm-descriptors>
<cmp-resource>
<jndi-name>jdo/pmf</jndi-name>
</cmp-resource>
</enterprise-beans>
</sun-ejb-jar>
Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリに格納されている capture-schema ユーティリティを使用して、dbschema を生成します。¥bin ディレクトリに格納されている capture-schema.bat ファイルを実行して、データベース URL、ユーザー名、パスワードについて有効な値を指定した後、スキーマを生成する必要がある表を指定します。デフォルトでは、アプリケーションで使用されるすべての表について、スキーマを生成する必要があります。iBank の場合、スキーマを生成する必要がある表は 6 つです。このスキーマファイルには、myschema.dbschema という名前を付けます。iBank で使用される表を以下に示します。
ACCOUNT
ACCOUNT_TYPE
BRANCH
CUSTOMER
TRANSACTION_HISTORY
TRANSACTION_TYPE
この myschema.dbschema ファイルをエンティティ Beans の META-INF フォルダ上に格納します。
<ejb-name>-ias-cmp.xml : Sun ONE Application Server 6.0/6.5 のすべての <ejb-name>-ias-cmp.xml ファイルを 1 つの sun-cmp-mappings.xml ファイルに置き換えます。このファイルは、少なくとも 1 つの Beans のセットを特定の dbschema の表およびカラムにマップします。これらの 2 つの XML ファイルの DTD は、根本的に異なっているため、以下に示す手順に従って、新しいファイルを実際に作成する必要があります。
- 最上部に、次のような DOCTYPE 定義を記述した新しい XML ファイルを作成します。
'http://www.sun.com/software/sunone/appserver/dtds/sun-cmp_mapping_1_0.dtd'>
sun-cmp-mappings.xml という名前で、このファイルを保存します。
- DOCTYPE 定義から見て分かるように、この XML ファイルのルートタグは sun-cmp-mappings です。DTD では、この要素は次のように定義します。
<!ELEMENT sun-cmp-mappings ( sun-cmp-mapping+ ) >
sun-cmp-mapping 要素は、次のようになります。
<!ELEMENT sun-cmp-mapping ( schema, entity-mapping+) >
この場合、schema 要素は、スキーマファイルへのパス名になります。
CMP Bean は、名前、主表、1 つ以上のフィールド、0 個以上の関係、0 個以上の二次表、および整合性チェック用フラグを持ちます。entity-mapping 要素は、次のような要素を保持します。
<!ELEMENT entity-mapping (ejb-name, table-name, cmp-field-mapping+, cmr-field-mapping*, secondary-table*, consistency?)>
ejb-name 要素は、標準 ejb-jar DTD の EJB 名です。table-name 要素は、データベース表の名前です。cmp-field-mapping は、フィールド、すなわち、cmr-field mapping にマップする 1 つ以上のカラムを持ちます。cmr フィールドは、関係を定義する名前および 1 組以上のカラムペアを持ちます。secondary-table 要素は、使用する二次表です。iBank では、二次表は使用しません。
上記の変更後、Account エンティティ Bean のエントリを持つ sun-cmp-mappings.xml ファイルは、次のようになっています。
<sun-cmp-mapping>
<schema>mySchema</schema>
<entity-mapping>
<ejb-name>Account</ejb-name>
<table-name>ACCOUNT</table-name>
<cmp-field-mapping>
<field-name>custNo</field-name>
<column-name>CUST_NO</column-name>
</cmp-field-mapping>
<cmp-field-mapping>
<field-name>branchCode</field-name>
<column-name>BRANCH_CODE</column-name>
</cmp-field-mapping>
<cmp-field-mapping>
<field-name>accTypeId</field-name>
<column-name>ACCTYPE_ID</column-name>
</cmp-field-mapping>
<cmp-field-mapping>
<field-name>accNo</field-name>
<column-name>ACC_NO</column-name>
</cmp-field-mapping>
<cmp-field-mapping>
<field-name>accBalance</field-name>
<column-name>ACC_BALANCE</column-name>
</cmp-field-mapping>
</entity-mapping>
</sun-cmp-mapping>
注 : ここでは、ドキュメントのヘッダー部分、すなわち、XML 宣言と DOCTYPE 定義は省略しています。
すべての CMP エンティティ Beans について、エントリを作成する必要があります。
配備用アプリケーションのアセンブル
Sun ONE Application Server 7 では、主に J2EE モデルがサポートされます。このモデルでは、アプリケーションがエンタープライズアーカイブ (EAR) ファイル (拡張子は .ear) の形式でパッケージ化されます。アプリケーションはさらに J2EE モジュールの集まりに分割され、EJB 用の Java アーカイブ (拡張子が .jar の JAR ファイル) とサーブレットおよび JSP 用の Web アーカイブ (拡張子が .war の WAR ファイル) にパッケージ化されます。
すべての JSP とサーブレットが WAR ファイルに、またすべての EJB が JAR ファイルに、それぞれパッケージ化され、最終的には WAR ファイルと JAR ファイルが配備記述子と一緒に EAR ファイルにパッケージ化されます。この EAR ファイルは、配備が可能なコンポーネントです。
asadmin ユーティリティを使用した Sun ONE Application Server 7 での iBank アプリケーションの配備
最後の作業は、Sun ONE Application Server 7 のインスタンスでのアプリケーションの配備です。アプリケーションを配備するプロセスは、以下に示すとおりです。
Sun ONE Application Server 7 の asadmin には、「Help (ヘルプ)」メニューからアクセスできる配備に関するヘルプ項目が含まれています。
コマンド行ユーティリティ asadmin を起動するには、Windows の場合は asadmin.bat ファイルを、Solaris オペレーティング環境の場合は asadmin ファイルをそれぞれ実行します。これらのファイルは、Sun ONE Application Server 7 のインストールディレクトリ内の bin ディレクトリ (Install_dir/AppServer7/appserv/bin など) に格納されています。
asadmin プロンプトから、次のような配備用のコマンドを入力します。
asadmin> deploy -u username -w password -H hostname -p adminport [--type application|ejb|web|client|connector] [--contextroot contextroot] [--force=true] [--name component-name] [--upload=true] [--instance instancename] filepath
サーバーインスタンスを再起動してから、ブラウザに http://<machine_name>:<port_number>/IBank という URL を入力して、アプリケーションをテストします。使用可能なユーザー名とパスワードを指定してテストします。これによって、iBank アプリケーションのメインメニューページが表示されます。