Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド リリース 4.0.8.2 2000 年 11 月 部品番号 : J01406-01 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド , リリース 4.0.8.2 部品番号 : J01406-01 原本名:Oracle Application Server Release 4.0.8.2 Developer's Guide: EJB, ECO/Java, and CORBA Applications 原本部品番号:A69966-04 原本著者:Sanjay Singh 原本協力者:Sheryl Maring, Kai Li,Philippe Le Mouel, Jose Fernando, Raymond Ng, Seshu Adunuthula, Aninda Sengupta, Azariah Jeyakumar, Olga Peschansky, Yongwen Xu, Gerald Ingalls, Liujin Yu Copyright © 1996, 2000 Oracle Corporation. All rights reserved. Printed in Japan. 制限付権利の説明 プログラムの使用、複製または開示は、オラクル社との契約に記された制約条件に従うものとします。 著作権、特許権およびその他の知的財産権に関する法律により保護されています。 当ソフトウェア(プログラム)のリバース・エンジニアリングは禁止されております。 このドキュメントの情報は、予告なしに変更されることがあります。オラクル社は本ドキュメントの無 謬性を保証しません。 * オラクル社とは、Oracle Corporation(米国オラクル)または日本オラクル株式会社(日本オラクル) を指します。 危険な用途への使用について オラクル社製品は、原子力、航空産業、大量輸送、医療あるいはその他の危険が伴うアプリケーション を用途として開発されておりません。オラクル社製品を上述のようなアプリケーションに使用すること についての安全確保は、顧客各位の責任と費用により行ってください。万一かかる用途での使用により クレームや損害が発生いたしましても、日本オラクル株式会社と開発元である Oracle Corporation(米 国オラクル)およびその関連会社は一切責任を負いかねます。当プログラムを米国国防総省の米国政府 機関に提供する際には、『Restricted Rights』と共に提供してください。この場合次の Legend が適用さ れます。 Restricted Rights Legend Programs delivered subject to the DOD FAR Supplement are "commercial computer software" and use, duplication and disclosure of the Programs shall be subject to the licensing restrictions set forth in the applicable Oracle license agreement. Otherwise, Programs delivered subject to the Federal Acquisition Regulations are "restricted computer software" and use, duplication and disclosure of the Programs shall be subject to the restrictions in FAR 52.227-14, Rights in Data -- General, including Alternate III (June 1987). Oracle Corporation, 500 Oracle Parkway, Redwood City, CA 94065. このドキュメントに記載されているその他の会社名および製品名は、あくまでその製品および会社を識 別する目的にのみ使用されており、それぞれの所有者の商標または登録商標です。 目次 はじめに ........................................................................................................................................................................ 1 xvii 概要 - EJB と ECO/Java 概要 ........................................................................................................................................................................... 1-2 Enterprise JavaBeans(EJB)......................................................................................................................... 1-4 Enterprise CORBA for Java(ECO/Java).................................................................................................. 1-4 EJB と ECO/Java の比較 ............................................................................................................................... 1-5 Java アプリケーション開発ガイド ...................................................................................................................... 1-6 Oracle Application Server 4.0.7 アプリケーションのサポート ..................................................................... 1-8 OAS 4.0.7 の JCORBA と ECO/Java の違い .............................................................................................. 1-8 移行オプション ....................................................................................................................................................... 1-9 第I部 2 Enterprise JavaBeans Enterprise JavaBeans Enterprise JavaBeans のコンポーネント・モデル ........................................................................................... 2-1 Oracle Application Server の持つ EJB 機能 ...................................................................................................... 2-2 現行リリースの制約 ....................................................................................................................................... 2-4 Enterprise Beans のクライアント・ビュー ....................................................................................................... 2-4 EJB コンポーネントと Web アプリケーションの相違点 ................................................................................. 2-5 トランスポート・プロトコル ....................................................................................................................... 2-5 クライアント ................................................................................................................................................... 2-6 ツールと開発プロセス ........................................................................................................................................... 2-6 PL/SQL プロシージャの起動 ............................................................................................................................... 2-6 開発のフローチャート ........................................................................................................................................... 2-7 iii 3 Enterprise Beans の作成 セッション Beans 作成のステップ ...................................................................................................................... 3-1 クライアント・インタフェース ........................................................................................................................... 3-2 リモート・インタフェースおよびホーム・インタフェースのインプリメンテーションの要件 ....... 3-3 リモート・インタフェースの作成 ............................................................................................................... 3-3 ホーム・インタフェースの作成 ................................................................................................................... 3-5 例外クラスの作成 ........................................................................................................................................... 3-6 SessionBean クラスの作成 ................................................................................................................................... 3-6 インプリメントされるインタフェース ....................................................................................................... 3-7 セッション Bean の例 .................................................................................................................................. 3-10 セッション Bean のリモート実行 ...................................................................................................................... 3-12 状態を保持するセッション Bean および状態を保持しないセッション Bean ........................................... 3-14 状態を保持するセッション Bean ............................................................................................................... 3-14 状態を保持しないセッション Bean ........................................................................................................... 3-15 状態の設定 ..................................................................................................................................................... 3-16 値によるオブジェクトの受渡しの制約 ............................................................................................................. 3-17 4 配布ファイルの作成 配置記述子 ............................................................................................................................................................... 4-1 配置記述子の作成 ........................................................................................................................................... 4-2 配置記述子の例 ............................................................................................................................................... 4-8 配置記述子クラスのリファレンス ............................................................................................................. 4-10 マニフェスト・ファイル ..................................................................................................................................... インストール用の JAR ファイルの作成 ........................................................................................................... EJB アプリケーションの配布 ............................................................................................................................. EJB アプリケーションの設定 ............................................................................................................................. サーバー・レベルのパラメータ ................................................................................................................. 4-12 4-13 4-14 4-16 4-16 アプリケーション・インスタンスのパラメータ ..................................................................................... 4-17 Bean レベルのパラメータ ........................................................................................................................... 4-17 パラメータの詳細 ......................................................................................................................................... 4-18 アプリケーションの再配布とリロード ............................................................................................................. 4-21 EJB アプリケーションの再配布 ................................................................................................................. 4-21 EJB アプリケーションのリロード ............................................................................................................. 4-22 パフォーマンスの改善 ......................................................................................................................................... 4-22 Just-In-Time コンパイラ .............................................................................................................................. 4-22 iv アプリケーション・インスタンスのパフォーマンス設定の設定 ......................................................... 4-24 EJB アプリケーションのデバッグ ..................................................................................................................... 4-24 Logger クラス ............................................................................................................................................... 4-24 ログ・ファイル ............................................................................................................................................. 4-25 詳細レベル ..................................................................................................................................................... 4-25 ロギング・モード ......................................................................................................................................... 4-26 5 EJB アプリケーションのクライアントの開発 概要 ........................................................................................................................................................................... 5-2 Bean のオブジェクト・リファレンスの取得 ..................................................................................................... 5-3 Oracle Application Server の JNDI .............................................................................................................. 5-3 名前領域の操作 ............................................................................................................................................... 5-3 クライアントからのネーム・サーバーへのアクセス ............................................................................... 5-5 必要なオブジェクトの識別およびルックアップ ....................................................................................... 5-7 C++ および既存の JCORBA アプリケーションへのアクセス .............................................................. 5-13 オブジェクトに対するメソッドの実行 ............................................................................................................. オブジェクトの破棄 ............................................................................................................................................. JNDI がサポートする機能 .................................................................................................................................. クライアントに必要なファイル ......................................................................................................................... アプレットに必須のファイル ..................................................................................................................... 5-13 5-13 5-14 5-15 5-16 APPLET タグ ........................................................................................................................................................ 5-16 JNDI プロバイダのパフォーマンス機能 .......................................................................................................... 5-17 Bean の共同ロケーション ........................................................................................................................... 5-17 キャッシング方法 ......................................................................................................................................... 5-18 キャッシュのクリーン・アップ ................................................................................................................. 5-18 アプリケーション・インスタンスの終了 ................................................................................................. 5-18 6 EJB オブジェクトのトランザクション 概要 ........................................................................................................................................................................... 6-1 配置記述子のトランザクション・パラメータ ........................................................................................... 6-2 JTS を使用可能な JDBC ドライバ ................................................................................................................ 6-3 宣言トランザクション ........................................................................................................................................... 6-4 宣言トランザクションの定義 ....................................................................................................................... 6-4 宣言トランザクションの例 ........................................................................................................................... 6-8 プログラムによるトランザクション ................................................................................................................. 6-13 v UserTransaction オブジェクト ................................................................................................................... 6-14 プログラムによるトランザクションの例 ................................................................................................. 6-15 トランザクションとスレッド ............................................................................................................................. 6-19 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション ............................. 6-20 7 EJB アプリケーションへの移行 OAS 4.0.7 の JCORBA アプリケーションの移行 ............................................................................................. 7-1 リモート・インタフェースの変換 ............................................................................................................... 7-2 ホーム・インタフェースの作成 ................................................................................................................... 7-2 JCORBA オブジェクト・インプリメンテーションの移行 ...................................................................... 7-3 パラメータをシリアライズ可能にする ....................................................................................................... 7-7 JCO.APP の EJB 配置記述子への変換 ......................................................................................................... 7-7 4.0.7 の JCORBA クライアントの移行 ...................................................................................................... 7-11 Enterprise CORBA Objects( (ECO/Java)の移行 )の移行 ......................................................................................... 7-12 OAS ECO/Java クライアントの移行 ........................................................................................................ 7-13 ECO.APP の EJB 配置記述子への変換 ...................................................................................................... 7-13 OAS 4.0.7 EJB アプリケーションの移行 .......................................................................................................... 7-13 OAS 4.0.8.0 および 4.0.8.1 EJB アプリケーションの移行 .............................................................................. 7-14 8 oasdeploy を使用したアプリケーションの配布 oasdeploy の概要 ................................................................................................................................................... oasdeploy 構文 ....................................................................................................................................................... 配布シナリオ ........................................................................................................................................................... プライマリ・ノードへの配布 ....................................................................................................................... 8-1 8-2 8-6 8-6 リモート・ノードへの配布 ........................................................................................................................... 8-6 既存アプリケーションの再配布 ................................................................................................................... 8-7 新規ノードへの配布 ....................................................................................................................................... 8-7 既存アプリケーションの削除 ....................................................................................................................... 8-7 クライアントへのダウンロード ........................................................................................................................... 8-8 クライアント JAR ファイルのダウンロード .............................................................................................. 8-8 セキュリティ ........................................................................................................................................................... 8-8 9 リファレンス Logger クラス ......................................................................................................................................................... 9-3 setSeverity ....................................................................................................................................................... 9-3 vi getSeverity ....................................................................................................................................................... OASApplicationDescriptor クラス .................................................................................................................... OASApplicationDescriptor コンストラクタ .............................................................................................. getOtherApplications .................................................................................................................................... getTxDads ........................................................................................................................................................ getTxEnabled .................................................................................................................................................. isTxEnabled ..................................................................................................................................................... setOtherApplications ..................................................................................................................................... setTxDads ........................................................................................................................................................ setTxEnabled ................................................................................................................................................... getAuthenticationString ................................................................................................................................ getMaxInstances ........................................................................................................................................... getMinInstances ............................................................................................................................................ setAuthenticationString ............................................................................................................................... setMaxInstances ............................................................................................................................................ setMinInstances ............................................................................................................................................ OracleSSLCredential クラス ............................................................................................................................. OracleSSLCredential .................................................................................................................................... addTrustedCert ............................................................................................................................................ getTrustedCert .............................................................................................................................................. removeTrustedCert ...................................................................................................................................... getTrustedCertCount ................................................................................................................................... setPrivateKey ................................................................................................................................................ getPrivateKey ................................................................................................................................................ getPvtKeyPassword ..................................................................................................................................... addCertChain ................................................................................................................................................ getCertChainCert ......................................................................................................................................... removeCertChainCert ................................................................................................................................. getCertChainCount ...................................................................................................................................... 第 II 部 10 9-4 9-5 9-5 9-6 9-6 9-7 9-7 9-8 9-8 9-9 9-9 9-10 9-10 9-11 9-12 9-13 9-14 9-14 9-14 9-15 9-15 9-16 9-16 9-17 9-17 9-17 9-18 9-18 9-19 Enterprise CORBA for Java Enterprise CORBA Objects for Java Enterprise CORBA Objects for Java コンポーネント・モデル ................................................................... 10-1 Oracle Application Server の ECO/Java 機能 ................................................................................................. 10-2 現行リリースの制約 ..................................................................................................................................... 10-4 ECO/Java オブジェクトのクライアント表示 .................................................................................................. 10-4 vii ECO/Java アプリケーションと Web アプリケーションの相違点 ................................................................ 10-5 トランスポート・プロトコル ..................................................................................................................... 10-5 クライアント ................................................................................................................................................. 10-6 ツールと開発プロセス ......................................................................................................................................... 10-6 PL/SQL プロシージャの起動 ............................................................................................................................. 10-6 開発のフローチャート ......................................................................................................................................... 10-7 11 ECO/Java オブジェクトの作成 ECO/Java オブジェクトの作成ステップ .......................................................................................................... 11-2 クライアント・インタフェース ......................................................................................................................... 11-2 リモート・インタフェースおよびホーム・インタフェースのインプリメンテーションの要件 ..... 11-3 リモート・インタフェースの作成 ............................................................................................................. 11-3 ホーム・インタフェースの作成 ................................................................................................................. 11-5 例外クラスの作成 ......................................................................................................................................... 11-6 SessionBean クラスの作成 ................................................................................................................................. 11-6 インプリメントされるインタフェース ..................................................................................................... 11-7 ECO/Java オブジェクトの例 ................................................................................................................... 11-10 ECO/Java オブジェクトのリモート実行 ........................................................................................................ 11-13 状態を保持する ECO/Java オブジェクトおよび状態を保持しない ECO/Java オブジェクト ............... 11-14 状態を保持するオブジェクト ................................................................................................................... 11-15 状態を保持しないオブジェクト ............................................................................................................... 11-16 状態の設定 ................................................................................................................................................... 11-17 CORBA IDL アプリケーションの ECO/Java への変換 ............................................................................... 11-17 マスター IDL ファイルの作成 .................................................................................................................. 11-18 CORBA オブジェクトの Oracle Application Server への移行 ............................................................ 11-19 IDL 定義の Oracle Application Server への移行 ................................................................................... 11-20 EJB への変換を容易にするためのガイドライン ........................................................................................... 11-21 12 配布情報ファイルの作成 概要 ......................................................................................................................................................................... 12-1 配布情報ファイルの構造 ..................................................................................................................................... 12-2 アプリケーション・セクション ................................................................................................................. 12-3 オブジェクト・セクション ......................................................................................................................... 12-4 配布情報ファイル例 ..................................................................................................................................... 12-6 配布情報ファイルからの値の取得 ..................................................................................................................... 12-8 viii インストール用の JAR ファイルの作成 ........................................................................................................... 12-9 ECO/Java アプリケーションの配布 ................................................................................................................ 12-11 ECO/Java アプリケーションの設定 ................................................................................................................ 12-12 サーバー・レベルのパラメータ ............................................................................................................... 12-13 アプリケーション・インスタンスのパラメータ ................................................................................... 12-13 オブジェクト・レベルのパラメータ ....................................................................................................... 12-14 パラメータの詳細 ....................................................................................................................................... 12-14 アプリケーションの再配布とリロード ........................................................................................................... 12-17 ECO/Java アプリケーションの再配布 ................................................................................................... 12-17 ECO/Java アプリケーションのリロード ............................................................................................... 12-18 パフォーマンスの改善 ....................................................................................................................................... 12-18 Just-In-Time コンパイラ ............................................................................................................................ 12-18 アプリケーション・インスタンスのパフォーマンス設定の設定 ....................................................... 12-20 ECO/Java アプリケーションのデバッグ ........................................................................................................ 12-20 Logger クラス ............................................................................................................................................. 12-20 ログ・ファイル ........................................................................................................................................... 12-21 詳細レベル ................................................................................................................................................... 12-21 ロギング・モード ....................................................................................................................................... 12-22 13 ECO/Java アプリケーションのクライアントの開発 概要 ......................................................................................................................................................................... 13-2 オブジェクトのオブジェクト・リファレンスの取得 ..................................................................................... 13-3 Oracle Application Server の JNDI ............................................................................................................ 13-3 名前領域の操作 ............................................................................................................................................. 13-3 クライアントからのネーム・サーバーへのアクセス ............................................................................. 13-5 必要なオブジェクトの識別およびルックアップ ..................................................................................... 13-7 オブジェクトに対するメソッドの実行 ........................................................................................................... オブジェクトの破棄 ........................................................................................................................................... JNDI がサポートする機能 ................................................................................................................................ クライアントに必要なファイル ....................................................................................................................... Java クライアントに必要なファイル ...................................................................................................... 13-13 13-13 13-14 13-15 13-15 Java 以外のクライアントに必要なファイル .......................................................................................... 13-16 アプレットに必要なファイル ................................................................................................................... 13-17 APPLET タグ ...................................................................................................................................................... 13-17 コールバックの作成 ........................................................................................................................................... 13-19 クライアント側の CORBA オブジェクトの作成 .................................................................................. 13-19 ix サーバー側の ECO/Java オブジェクト内でのコールバックの作成 .................................................. 13-20 例 ................................................................................................................................................................... 13-20 JNDI プロバイダのパフォーマンス機能 ........................................................................................................ 13-26 オブジェクトの共同ロケーション ........................................................................................................... 13-26 キャッシング方法 ....................................................................................................................................... 13-27 キャッシュのクリーン・アップ ............................................................................................................... 13-27 アプリケーション・インスタンスの終了 ............................................................................................... 13-28 14 ECO/Java オブジェクトのトランザクション 概要 ......................................................................................................................................................................... 14-1 配布情報ファイルのトランザクション・パラメータ ............................................................................. 14-2 JTS を使用可能な JDBC ドライバ .............................................................................................................. 14-3 宣言トランザクション ......................................................................................................................................... 14-4 宣言トランザクションの設定 ..................................................................................................................... 14-4 宣言トランザクションの例 ......................................................................................................................... 14-8 JCO.APP ......................................................................................................................................................... 14-8 ECO/Java オブジェクトのリモート・インタフェース ......................................................................... 14-8 ECO/Java オブジェクト ............................................................................................................................. 14-8 クライアント ............................................................................................................................................... 14-11 プログラムによるトランザクション ............................................................................................................... 14-11 UserTransaction オブジェクト ................................................................................................................. 14-13 プログラムによるトランザクションの例 ............................................................................................... 14-13 JCO.APP ....................................................................................................................................................... 14-14 トランザクションとスレッド ........................................................................................................................... 14-16 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション ........................... 14-17 15 JCORBA アプリケーションから ECO/Java への移行 JCORBA サーバー・オブジェクトの移行 ....................................................................................................... 15-1 リモート・インタフェース ......................................................................................................................... 15-2 ホーム・インタフェース ............................................................................................................................. 15-2 インプリメンテーション・クラス ............................................................................................................. 15-2 LifeCycle インタフェース ........................................................................................................................... 15-2 ObjectManager .............................................................................................................................................. 15-3 JCO.APP ......................................................................................................................................................... 15-3 例 ..................................................................................................................................................................... 15-3 x JCO.APP から ECO.APP への変換 ................................................................................................................... 15-7 アプリケーション・セクション ................................................................................................................. 15-8 オブジェクト・セクション ......................................................................................................................... 15-8 クライアントの移行 ............................................................................................................................................. 15-9 16 リファレンス ECOBean インタフェース .................................................................................................................................. 16-4 ECOContext インタフェース ............................................................................................................................. 16-5 getCallerIdentity ........................................................................................................................................... 16-5 getEnvironment ............................................................................................................................................ 16-5 getHome ........................................................................................................................................................ 16-6 getRollbackOnly ........................................................................................................................................... 16-6 getUserTransaction ...................................................................................................................................... 16-7 isCallerInRole ................................................................................................................................................ 16-7 setRollbackOnly ............................................................................................................................................ 16-8 ECOMetaData インタフェース ......................................................................................................................... 16-9 getHomeInterfaceClass ............................................................................................................................... 16-9 getECOHome ................................................................................................................................................ 16-9 getPrimaryKeyClass .................................................................................................................................. 16-10 getRemoteInterfaceClass ........................................................................................................................... 16-10 isSession ....................................................................................................................................................... 16-10 Handle インタフェース .................................................................................................................................... 16-11 getECOObject .............................................................................................................................................. 16-11 SessionBean インタフェース ........................................................................................................................... 16-12 setSessionContext ....................................................................................................................................... 16-12 ecoRemove .................................................................................................................................................. 16-13 ecoPassivate ................................................................................................................................................ 16-13 ecoActivate .................................................................................................................................................. 16-14 SessionContext インタフェース ...................................................................................................................... 16-15 getECOObject .............................................................................................................................................. 16-15 UserTransaction インタフェース .................................................................................................................... 16-16 begin ............................................................................................................................................................. 16-17 commit ......................................................................................................................................................... 16-17 getStatus ....................................................................................................................................................... 16-18 rollback ........................................................................................................................................................ 16-18 setRollbackOnly .......................................................................................................................................... 16-19 setTransactionTimeout .............................................................................................................................. 16-19 xi Logger クラス ..................................................................................................................................................... setSeverity ................................................................................................................................................... getSeverity ................................................................................................................................................... PortableRemoteObject クラス ........................................................................................................................ narrow .......................................................................................................................................................... exportObject ................................................................................................................................................ unexportObject ........................................................................................................................................... HeuristicMixedException 例外 ....................................................................................................................... HeuristicMixedException() ....................................................................................................................... HeuristicMixedException(String) ............................................................................................................ HeuristicRollbackException 例外 .................................................................................................................. HeuristicRollbackException() ................................................................................................................... HeuristicRollbackException(String) ........................................................................................................ TransactionRolledbackException 例外 ......................................................................................................... TransactionRolledbackException() .......................................................................................................... TransactionRolledbackException(String) ............................................................................................... OracleSSLCredential クラス ........................................................................................................................... OracleSSLCredential .................................................................................................................................. addTrustedCert .......................................................................................................................................... getTrustedCert ............................................................................................................................................ removeTrustedCert .................................................................................................................................... getTrustedCertCount ................................................................................................................................. setPrivateKey .............................................................................................................................................. getPrivateKey .............................................................................................................................................. getPvtKeyPassword ................................................................................................................................... addCertChain .............................................................................................................................................. getCertChainCert ....................................................................................................................................... removeCertChainCert ............................................................................................................................... getCertChainCount .................................................................................................................................... 第 III 部 17 Oracle Application Server ORB for Java Java から CORBA オブジェクトへのアクセス ORB での CORBA オブジェクトの作成 .......................................................................................................... 開発ステップのプロセス ..................................................................................................................................... 単純なサーバーとクライアントの作成 ............................................................................................................. IDL によるオブジェクトのインタフェースの定義 ................................................................................. xii 16-20 16-21 16-21 16-23 16-23 16-24 16-24 16-25 16-25 16-25 16-26 16-26 16-26 16-27 16-27 16-27 16-28 16-28 16-28 16-29 16-29 16-30 16-30 16-30 16-31 16-31 16-32 16-32 16-33 17-2 17-2 17-3 17-5 IDL ファイルのコンパイル ......................................................................................................................... 17-5 IDL-to-Java コンパイラの使用 .......................................................................................................................... 17-7 インタフェース・メソッドのインプリメント ....................................................................................... 17-10 処理の定義 ................................................................................................................................................... 17-10 サーバー・アプリケーションの作成 ....................................................................................................... 17-11 クライアント・アプリケーションの作成 ............................................................................................... 17-14 サーバーおよびクライアント・アプリケーションの実行 ........................................................................... 17-15 タイ・メカニズムによる既存コードの実行 ................................................................................................... 17-17 インプリメンテーションへの変更 ........................................................................................................... 17-18 サーバーへの変更 ....................................................................................................................................... 17-19 18 IDL の構文とセマンティック IDL について ........................................................................................................................................................ 18-2 IDL と C++ の比較 ....................................................................................................................................... 18-2 字句規則 ................................................................................................................................................................. 18-3 アルファベット文字 ..................................................................................................................................... 18-3 10 進数 ............................................................................................................................................................ 18-4 記号 ................................................................................................................................................................. 18-5 書式記号 ......................................................................................................................................................... 18-6 トークン ......................................................................................................................................................... 18-6 コメント ......................................................................................................................................................... 18-7 識別子 ............................................................................................................................................................. 18-7 キーワード ..................................................................................................................................................... 18-7 句読点文字 ..................................................................................................................................................... 18-8 プリプロセッサ・トークン ......................................................................................................................... 18-8 リテラル ......................................................................................................................................................... 18-8 IDL のプリプロセス .......................................................................................................................................... 18-10 バージョン制御 ........................................................................................................................................... 18-11 IDL の文法 .......................................................................................................................................................... 18-12 IDL の仕様 .......................................................................................................................................................... 18-17 モジュール宣言 ........................................................................................................................................... 18-18 インタフェース宣言 ................................................................................................................................... 18-18 継承 ....................................................................................................................................................................... 18-21 定数宣言 ............................................................................................................................................................... 18-23 構文 ............................................................................................................................................................... 18-23 xiii セマンティック ........................................................................................................................................... 18-24 型宣言 ................................................................................................................................................................... 18-27 基本データ型 ............................................................................................................................................... 18-28 構成体型 ....................................................................................................................................................... 18-30 テンプレート型 ........................................................................................................................................... 18-33 複合宣言子 ................................................................................................................................................... 18-35 native 型 ....................................................................................................................................................... 18-35 例外宣言 ............................................................................................................................................................... 18-36 演算宣言 ............................................................................................................................................................... 18-37 演算属性 ....................................................................................................................................................... 18-37 パラメータ宣言 ........................................................................................................................................... 18-38 Raises 式 ....................................................................................................................................................... 18-38 Context 式 .................................................................................................................................................... 18-39 属性宣言 ............................................................................................................................................................... CORBA モジュール ........................................................................................................................................... 名前と有効範囲 ................................................................................................................................................... 継承された名前 ........................................................................................................................................... 18-39 18-40 18-40 18-42 ネストされた型 ........................................................................................................................................... 18-43 標準例外 ............................................................................................................................................................... 18-44 19 IDL から Java への言語マッピング IDL/Java 言語マッピングの使用 ....................................................................................................................... 19-1 IDL から Java へのマッピングの概要 ....................................................................................................... 19-2 名前 ................................................................................................................................................................. 19-4 予約語 ............................................................................................................................................................. 19-4 モジュール ..................................................................................................................................................... 19-5 基本データ型 ................................................................................................................................................. 19-5 Holder クラス ............................................................................................................................................... 19-7 Helper クラス ............................................................................................................................................. 19-10 Boolean ......................................................................................................................................................... 19-10 文字型 ........................................................................................................................................................... 19-10 Octet ............................................................................................................................................................. 19-10 文字列型 ....................................................................................................................................................... 19-11 整数型 ........................................................................................................................................................... 19-11 定数 ............................................................................................................................................................... 19-11 xiv 列挙(enum)型 ......................................................................................................................................... 19-12 構造体 ........................................................................................................................................................... 19-14 共用体(union).......................................................................................................................................... 19-15 Sequence ...................................................................................................................................................... 19-16 配列 ............................................................................................................................................................... 19-17 インタフェース ........................................................................................................................................... 19-17 例外 ............................................................................................................................................................... 19-20 IDL の Any 型 ............................................................................................................................................. 19-23 インタフェース内でネストされた型 ....................................................................................................... 19-26 Typedef ........................................................................................................................................................ 19-27 Java クライアントの CORBA 擬似オブジェクト API ................................................................................. Environment ....................................................................................................................................................... 例外 ....................................................................................................................................................................... 例外リスト ........................................................................................................................................................... 名前と値のペア ................................................................................................................................................... NV リスト ........................................................................................................................................................... Context ................................................................................................................................................................. ContextList .......................................................................................................................................................... Request ................................................................................................................................................................ ServerRequest .................................................................................................................................................... TCKind ................................................................................................................................................................ TypeCode ............................................................................................................................................................ ORB ...................................................................................................................................................................... list_initial_services ................................................................................................................................... resolve_initial_references ........................................................................................................................ list_initial_services_remote ..................................................................................................................... resolve_initial_references_remote ......................................................................................................... object_to_string ......................................................................................................................................... string_to_object ......................................................................................................................................... connect ......................................................................................................................................................... connect ......................................................................................................................................................... connect ......................................................................................................................................................... connect ......................................................................................................................................................... disconnect ................................................................................................................................................... create_struct_tc ........................................................................................................................................... create_union_tc .......................................................................................................................................... create_enum_tc ........................................................................................................................................... 19-28 19-29 19-29 19-30 19-31 19-32 19-32 19-33 19-33 19-35 19-35 19-37 19-39 19-45 19-45 19-46 19-46 19-47 19-47 19-47 19-48 19-48 19-48 19-49 19-49 19-49 19-50 xv create_alias_tc ............................................................................................................................................. create_exception_tc ................................................................................................................................... create_interface_tc ..................................................................................................................................... create_string_tc .......................................................................................................................................... create_wstring_tc ....................................................................................................................................... create_sequence_tc .................................................................................................................................... create_recursive_sequence_tc ................................................................................................................. create_array_tc ............................................................................................................................................ get_primitive_tc ......................................................................................................................................... create_any ................................................................................................................................................... create_output_stream ................................................................................................................................ init ................................................................................................................................................................ init ................................................................................................................................................................ init ................................................................................................................................................................ bind .............................................................................................................................................................. bind .............................................................................................................................................................. bind .............................................................................................................................................................. run ................................................................................................................................................................ stop ............................................................................................................................................................... shutdown .................................................................................................................................................... 19-50 19-51 19-51 19-51 19-52 19-52 19-52 19-53 19-53 19-53 19-54 19-54 19-54 19-55 19-55 19-56 19-57 19-58 19-58 19-58 Object (CORBA::Object) )................................................................................................................................. _is_a .............................................................................................................................................................. _is_equivalent ............................................................................................................................................. _non_existent .............................................................................................................................................. _hash ............................................................................................................................................................ _duplicate .................................................................................................................................................... _release ......................................................................................................................................................... _get_implementation ................................................................................................................................. _get_interface .............................................................................................................................................. 19-58 19-59 19-60 19-60 19-61 19-61 19-61 19-61 19-62 索引 xvi はじめに 対象読者 このマニュアルは、Oracle Application Server の JCORBA および Enterprise JavaBeans アプ リケーションを開発するユーザー向けに作成されています。 Oracle Application Server のドキュメント・セット この表に、Oracle Application Server のドキュメント・セットのリストを示します。 マニュアル名 部品番号 Oracle Application Server 概要 J01413-01 Oracle Application Server 管理者ガイド J01403-01 Oracle Application Server セキュリティ・ガイド J01411-01 Oracle Application Server パフォーマンス・チューニング・ガイド J01414-01 Oracle Application Server PL/SQL アプリケーション開発者ガイド J01404-01 Oracle Application Server JServlet および JSP アプリケーション開発者ガイド J01408-01 Oracle Application Server LiveHTML および Perl アプリケーション開発者ガイド J01405-01 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド J01406-01 Oracle Application Server C++ CORBA アプリケーション開発者ガイド J01407-01 Oracle Application Server PL/SQL Web Toolkit リファレンス J01419-01 Oracle Application Server PL/SQL Web Toolkit クイック・リファレンス J01420-01 Oracle Application Server JServlet Toolkit リファレンス J01425-01 xvii マニュアル名 部品番号 Oracle Application Server JServlet Toolkit クイック・リファレンス J01426-01 Oracle Application Server カートリッジ・マネージメント・フレームワーク J01412-01 Oracle Application Server エラー・メッセージ J00103-01 マニュアルの表記規則 次の表に、このマニュアルで使用される表記規則を示します。 xviii 表記規則 例 説明 太字 oas.h owsctl wrbcfg www.oracle.com ファイル名、 ユーティリティ、 プロセス、 および URL を表します。 斜体 file1 テキスト内の可変部分を表します。このプレー スホルダを特定の値や文字列に置き換えます。 山カッコ <filename> コード内の可変部分を表します。このプレース ホルダを特定の値や文字列に置き換えます。 固定幅フォント owsctl start wrb 表示どおりに入力するテキスト。関数にも使用 します。 大カッコ [-c string] オプション項目を表します。 [on|off] オプション項目の選択肢がそれぞれ垂直バー (|)で区切って示され、その中のいずれか 1 つ を選択できます。 中カッコ {yes|no} 必須項目の選択肢が垂直バー(|)で区切って 示されます。 省略記号 n,... その前の項目を何回でも繰り返すことができる ことを表します。 1 概要 - EJB と ECO/Java この章では、Oracle Application Server の EJB および ECO/Java インフラストラクチャの概 要を説明します。 内容 ■ 概要 ■ Java アプリケーション開発ガイド ■ Oracle Application Server 4.0.7 アプリケーションのサポート ■ 移行オプション 概要 - EJB と ECO/Java 1-1 概要 概要 業界の焦点は、標準を策定して他のベンダーのソフトウェアと相互に操作できるようにする 方向にますます進んできています。また、技術の進歩によって必ずしも既存のサーバー技術 が捨てられるわけではありません。分散オブジェクト・ネットワーキングでは、2 つの標準 が有力になっています。Enterprise JavaBeans(EJB)と OMG CORBA です。 ■ EJB は Java 言語をベースにした標準で、これにより Java プログラマは、複数のベンダー によるソフトウェアを組み合せて業務ソリューションを実現できます。クライアントお よびサーバーの言語は Java に限られています。 ■ CORBA は複数の言語をベースにした標準で、これによりプログラマは、複数のベン ダーによるソフトウェアを組み合せて業務ソリューションを実現できます。 どちらも広く使用されていますが、どちらもまだ完全に相互操作可能ではありません。 CORBA EJB ■ EJB は、Remote Method Invocation(RMI)を通じてリモート・アクセスを継承します。 その際、EJB は値によるオブジェクトの受渡しをサポートしています。Java は、値に よってオブジェクトを受渡しできる唯一の言語です。このため、EJB コンポーネントは Java クライアントとのみ対話処理が可能です。 ■ CORBA は、CORBA IDL 仕様に準拠しているすべての言語をサポートしています。 CORBA のインタフェース・タイプでは、値によるオブジェクトの受渡しはサポートさ れていません。このため、CORBA では非 Java クライアントのサポートが可能です。た だし、RMI を継承するクライアントとの相互操作はできません。EJB コンポーネントと の相互操作はできません。 1-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 概要 これらの標準の一方のみをサポートし、他方をサポートしないというわけにはいきません。 両方の標準のみではなくすべての言語をサポートできるようにするために、 Oracle Application Server には EJB および CORBA のスタックが用意されています。CORBA と一部の言語は、RMI での値によるオブジェクトの受渡しをサポートする方向へと進んでい ます。これが実現すれば、Oracle Application Server ではすべての言語のクライアントにサー ビスが提供されるため、これらの標準のうち 1 つのみサポートすればよいことになります。 Oracle Application Server は EJB フレームワークにより EJB 1.0 をサポートしており、 CORBA のサポートは Enterprise CORBA Object for Java(ECO/Java)フレームワークによ り提供されています。 CORBA EJB Oracle Application Server 非 Java 言語と CORBA が、値によるオブジェクトの受渡しをサポートするようになると、 両方のフレームワークを提供する必要はなくなります。EJB フレームワークですべての言語 タイプをサポートできるようになります。また、EJB は CORBA をベースに作成されている ため、すべての CORBA クライアントもサポートできるようになります。 現在、将来もサポートを追加できるように、ご使用の ECO/Java アプリケーションを EJB ア プリケーションに変換することが可能です。このため、ECO/Java アプリケーションは第 11 章「ECO/Java オブジェクトの作成」のガイドラインに従って作成してください。今後、ご 使用の ECO/Java アプリケーションを EJB 準拠に変換するのに役立つ変換ツールが提供され る予定です。 次の項では、これら両方の標準を説明した後、EJB と ECO/Java の主な違いをリストします。 概要 - EJB と ECO/Java 1-3 概要 注意 : これらの項では、クライアントが EJB または ECO/Java にアクセ スできるかどうかについて説明しますが、Java クライアントは EJB アプリ ケーションと ECO/Java アプリケーションの両方にアクセス可能です。 Enterprise JavaBeans( JavaBeans(EJB) EJB) Oracle Application Server では、JavaSoft EJB 仕様の EJB 1.0 準拠をサポートしています。 通常の Java アプリケーションでは、リモート・サーバーに存在するオブジェクト・インス タンスにアクセスするためにクライアントを作成します。リモート・サーバーへのアクセス には、IIOP など、数種類の異なるネットワーク・プロトコルを使用できます。EJB と Oracle Application Server の ECO/Java パラダイムにより、リモート・オブジェクト・インスタン スはコンポーネント内にカプセル化されます。コンポーネントは Bean インスタンスに次の ような構造を提供します。 ■ クライアントがインスタンスの作成およびメソッドへのアクセスに使用する 2 つのイン タフェース ■ トランザクション、ライフサイクル、ネーミングなど特定のサポート・サービスへのア クセス サン・マイクロシステムズ社の Enterprise JavaBeans(EJB)標準は、EJB のホーム・インタ フェースとリモート・インタフェースを通じて、Java Remote Method Invocation(RMI)を 継承しています。RMI リモート・インタフェースは、すべてのリモート Java コンポーネン トに関する継承階層のルートです。 EJB フレームワークでは、メソッド引数として提供されたオブジェクトは、すべてシリアラ イズされてネットワーク上に送信されます。RMI は、オブジェクトのシリアライズを使用し て、JVM 間でオブジェクトを転送します。これを値によるオブジェクトの受渡しと呼びま す。値によるオブジェクトの受渡しは Java 内でしか行えないため、EJB コンポーネントにア クセスできるのは Java クライアントのみです。 Enterprise CORBA for Java( Java(ECO/Java) ECO/Java) ECO/Java コンポーネント・モデルは、2 つの原理を念頭において開発されました。 1. 現在 EJB と対話処理ができないクライアントをサポートする。現在 EJB は、EJB 仕様に 準拠し、値によってオブジェクトの受渡しが可能なクライアントのみをサポートしてい ます。一部の言語やブラウザでは、この機能はサポートされていません。 ECO/Java では、CORBA 準拠(バージョン 2.2)の言語によって開発されたクライアン トをすべてサポート可能です。CORBA を使用する際の大きな利点の 1 つは、複数の言 語をサポートしていることです。ECO/Java は、IDL の生成が不要な CORBA オブジェ クト作成方法です。各 ECO/Java アプリケーションに必要な IDL スケルトンは、すべて Oracle Application Server が作成します。 1-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 概要 2. EJB に簡単に移行できるフレームワークを提供する。いずれは CORBA、非 Java クライ アントおよび EJB コンポーネントが相互に操作できるようになります。その時点で、 Oracle Application Server はすべてのサーバー・アプリケーションに対し、EJB 準拠を 完全にサポートする予定です。EJB スタックは CORBA をベースにしているため、すべ ての CORBA クライアントが EJB コンポーネントと相互に操作できるようになります。 このため、現行の ECO/Java コンポーネントは、すべて EJB コンポーネントに段階的に 移行できるように作成してください。これにより、ECO/Java コンポーネントは EJB コ ンポーネントとほぼ同じになります。ECO/Java は EJB と同じ基本フレームワークを 持っています。たとえば、コンテナを使用して ECO/Java コンポーネントをサポートし ています。 EJB と ECO/Java の比較 EJB、ECO/Java とも、同じコンポーネント・ランタイムから派生しています。つまり、 この 2 つのランタイムの大部分は同じものです。この違いをユーザーの立場から示します。 ただし、この 2 つの基本ランタイムでは、両モデルの動作が同じであることが保証されま す。そして、将来的に値によるオブジェクトが両方のランタイムに存在するようになると、 相互に操作可能になります。 次の表は、ECO/Java と EJB インプリメンテーションの違いをまとめたものです。 表 1-1 ECO/Java と Enterprise JavaBeans の違い コンポーネント EJB ECO/Java インタフェース継承 javax.rmi.Remote を継承する インタフェースによるリモート・ アクセス。 org.omg.CORBA.Object を継承す るインタフェースによるリモート・ アクセス。 メソッド引数 EJB は RMI をサポートしています。 パラメータの受渡しは CORBA 2.2 このため、パラメータの受渡しは IDL 方式により定義されています。 RMI 方式により定義されます。 オブジェクトは値により受け渡さ れます。値によるオブジェクトを サポートしているクライアントの みが、EJB アプリケーションを コールできます。 配布情報 配布情報は EJB 仕様により定義さ プレーン・テキスト・ファイルに 格納されています。 れています。現在、配布情報は シリアライズされた配置記述子 ファイル(各アプリケーション および各 Bean に対し 1 つずつ)と マニフェスト・ファイルに格納 されています。 概要 - EJB と ECO/Java 1-5 Java アプリケーション開発ガイド 表 1-1 ECO/Java と Enterprise JavaBeans の違い コンポーネント EJB ECO/Java 例外 すべてのシステム例外は java.rmi.RemoteException から の拡張であり、捕捉して処理する 必要があります。 すべてのシステム例外は org.omg.CORBA.SystemException からの拡張であり、 java.lang.RuntimeException を拡張します。 スレッド・サポート シングル・スレッド シングル・スレッド Microsoft Internet JavaSoft のアクティベーションを Explorer クライアント 使用しているイントラネット環境 からのアクセス でのみサポート インターネットとイントラネット の両方でサポート インプリメン テーション言語 Java のみ Java および C++。次のリリース では、ECO/C++ のフルサポートが 予定されています。 非 Java クライアント からのアクセス いいえ はい ライフサイクル、 トランザクション およびセキュリティ EJB 1.0 サポート EJB 1.0 と同様 Java アプリケーション開発ガイド Oracle Application Server には、リモート Java アプリケーション開発のオプションが 2 つあ ります。 ■ Enterprise JavaBeans(EJB)は、業界標準である Java アプリケーションおよびクライア ントを開発するためのフレームワークです。当社の EJB インプリメンテーションは CORBA を基本としているため、CORBA と EJB のあらゆる利点を活用できます。 詳細は、第 I 部「Enterprise JavaBeans」を参照してください。 ■ Enterprise CORBA Objects for Java(ECO/Java)は、EJB 同様、Java や非 Java クライア ントからアクセス可能なアプリケーションを開発するためのフレームワークです。 また、CORBA IDL ファイルを生成しないため、Java で CORBA アプリケーション作成 がより簡単に行えます。アプリケーションに必要な IDL スタブやスケルトン・ファイル は、Oracle Appication Server が生成します。詳細は、第 II 部「Enterprise CORBA Objects for Java」を参照してください。 1-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Java アプリケーション開発ガイド 注意 : IDL から独自の CORBA アプリケーションを作成する場合、当社 の ORB または IDL コンパイラを使用できます。CORBA Java API は Oracle Application Server 内でサポートされています。ただし、純粋な CORBA アプリケーションは Oracle Application Server のレルムの一部で はないため、Oracle Application Server Manager からこのアプリケーショ ンをモニターしたり管理することはできません。CORBA アプリケーショ ンは、ECO/Java アプリケーションに変換した場合のみ、Oracle Application Server から管理できます。CORBA アプリケーションの作成 方法は、第 III 部「Java から CORBA オブジェクトへのアクセス」を参照 してください。既存の CORBA アプリケーションを ECO/Java アプリケー ションに変換する方法は、第 II 部「Enterprise CORBA Objects for Java」 を参照してください。 次に、EJB または ECO/Java API を使用してアプリケーションを開発する場合のガイドを示 します。どの API を使用するかを決定する際に、この表を参照してください。 次のような場合に EJB を使用 次のような場合に ECO/Java を使用 パラメータの受渡しが RMI 方式によって 定義されている。オブジェクトは値により 受け渡されます。 パラメータの受渡しが CORBA IDL 方式によって 定義されている。 クライアントはすべて Java で作成されてい クライアントが、Java または CORBA がサポート る必要がある。 する他の言語で作成されている。 クライアントは、Java Remote Invocation (RMI)ライブラリを持つブラウザから、 EJB アプリケーションのみを実行する可能 性がある。 クライアントは、Java Remote Invocation(RMI)ライ ブラリを持たないブラウザからも実行可能。たとえば、 ほとんどの Microsoft Internet Explorer ブラウザには、 出荷時に RMI ライブラリが組み込まれていません。 ECO/Java および EJB アプリケーション用の Oracle Application Server には、次のような利 点があります。 ■ EJB アプリケーションの管理用 GUI が、Oracle Application Server の他のアプリケー ションに似ている。この GUI により、ネットワーク上のマシンをモニターして、実行 中のプロセスのステータスをチェックできます。さらに、負荷のバランスを調整して最 大のパフォーマンスを得るために、アプリケーションをネットワーク上の複数のノード に分散できます。 ■ アプリケーションのロギング・レベルを変更できる。たとえば、アプリケーションの開 発中はロギング・レベルの値を大きくして、より多くのメッセージ・ログを出力してデ バッグに使用し、本番モードのときにはロギング・レベルを小さくすることが可能です。 ■ サポート・ファイルは自動的に生成されるので、Bean を CORBA 環境で実行するために CORBA のインフラストラクチャを理解する必要がない。 概要 - EJB と ECO/Java 1-7 Oracle Application Server 4.0.7 アプリケーションのサポート Oracle Application Server 4.0.7 アプリケーションのサポート 4.0.7 アプリケーション 説明 4.0.7 の JCORBA Oracle Application Server 4.0.7 の既存の JCORBA アプリケーションは、 Oracle Application Server 4.0.8 上で透過的に実行されますが、再配布する 必要があります。このようなアプリケーションは、ECO/Java または EJB に 移行することをお薦めします。詳細は、1-9 ページの「移行オプション」の 項を参照してください。新規開発の場合は、EJB または ECO/Java を使用し てください。 4.0.7 の EJB Oracle Application Server 4.0.7 の既存の EJB アプリケーションは、EJB 1.0 仕様に変換する必要があります。4.0.7 の EJB アプリケーションは、0.5 仕様 に合わせて開発されました。0.5 EJB 仕様と 1.0 EJB 仕様には重要な違いがあ ります。 OAS 4.0.7 の JCORBA と ECO/Java の違い 次の表に、4.0.7 の JCORBA と ECO/Java の違いの概略を示します。ECO/Java は、 JCORBA にかわるものとみなされています。 表 1-2 ECO/Java と 4.0.7 の JCORBA の違い 機能 ECO/Java 4.0.7 の JCORBA オブジェクトの 作成と参照 各 ECO/Java コンポーネントには、 EJB コンポーネントのホーム・インタ フェースとリモート・インタフェース と同様の機能を持つ、ホーム・インタ フェースとリモート・インタフェース があります。このホーム・インタ フェースにより、対応する ECO/Java オブジェクト・インスタンスのインス タンスをクライアントが作成可能です。 4.0.7 の JCORBA オブジェクトは、 オブジェクトにアクセスする際に JCORemote インタフェースをイ ンプリメントします。 オブジェクト・リファレンスを 取得するためには ObjectFactory クラスを使用します。 オブジェクト・リファレンスの取出し には、JNDI を使用してください。 ライフサイクル ECO/Java のライフサイクルは、EJB コンポーネントのライフサイクルと 同様です。 OAS 4.0.7 の JCORBA からの LifeCycle インタフェースは独自 のものです。 JNDI サポート ECO/Java は新しい JNDI サーバー・ プロバイダを使用しており、これは CosNaming をベースにしています。 JNDI の新しいパッケージは oracle.oas.naming.jndi です。 4.0.7 の JCORBA は、JNDI サポートに oracle.oas.jndi パッケージを使用しています。 1-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 移行オプション 表 1-2 ECO/Java と 4.0.7 の JCORBA の違い(続き) の違い(続き) 機能 ECO/Java 4.0.7 の JCORBA 状態を保持しない オブジェクト ECO/Java の状態を保持しないオブジェ 4.0.7 JCORBA の状態を保持しない クトのサポートは、EJB 1.0 仕様に準拠 オブジェクトのサポートは、 CORBA 2.0 仕様に準拠しています。 しています。 スレッド・サポート ECO/Java はシングル・スレッドです。 4.0.7 の JCORBA はマルチ・ スレッドです。 移行オプション Oracle Application Server には、ECO/Java または EJB アプリケーションの移行シナリオが いくつか存在します。表 1-3 にオプションを示します。 表 1-3 移行パスおよび関連する章 移行パス 参照する章 OAS 4.0.7 の JCORBA アプリケーションから OAS 4.0.8 の ECO/Java アプリケーションへ 第 15 章「JCORBA アプリケーションから ECO/Java への移行」 OAS 4.0.7 の JCORBA アプリケーションから OAS 4.0.8 の EJB アプリケーションへ 第 7 章「EJB アプリケーションへの移行」 OAS 4.0.7 の EJB アプリケーションから OAS 4.0.8 の EJB アプリケーションへ 第 7 章「EJB アプリケーションへの移行」 OAS 4.0.8 の ECO/Java アプリケーションから OAS 4.0.8 の EJB アプリケーションへ 第 7 章「EJB アプリケーションへの移行」 概要 - EJB と ECO/Java 1-9 移行オプション 1-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 第I部 Enterprise JavaBeans Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 2 Enterprise JavaBeans 内容 ■ Enterprise JavaBeans のコンポーネント・モデル ■ Oracle Application Server の持つ EJB 機能 ■ Enterprise Beans のクライアント・ビュー ■ EJB コンポーネントと Web アプリケーションの相違点 ■ ツールと開発プロセス ■ PL/SQL プロシージャの起動 ■ 開発のフローチャート Enterprise JavaBeans のコンポーネント・モデル Enterprise JavaBeans(EJB)は JavaSoft が開発したコンポーネント・モデルで、これによっ て開発者は、カスタム・コンポーネント・アプリケーションを作成できます。このアプリ ケーションは、ユーザーが開発したサーバー側 Beans またはサードパーティ製の Beans で構 成されています。Beans により、EJB アプリケーションに業務ロジックが提供されます。 異なるベンダーの異なるコンポーネントが使用可能という意味で、EJB モデルには柔軟性が あります。たとえば、ある会社の設定および管理ソフトウェア、別の会社の Bean コンテナ、 さらに業務ロジック Bean を専門としている別の会社の業務ロジック Bean を一緒に使用で きます。Oracle Application Server には、設定および管理ソフトウェア、Bean コンテナおよ びサーバーが用意されています。業務ロジック Bean はユーザーが用意します。自分で作成 するか、サードパーティから入手してください。 Oracle Application Server では、EJB サーバーとコンテナ・インフラストラクチャは、 CORBA 環境上にインプリメントされています。つまり、Enterprise JavaBeans 自体は CORBA オブジェクトであり、他の CORBA オブジェクトとの通信が可能です。 Enterprise JavaBeans 2-1 Oracle Application Server の持つ EJB 機能 Bean は EJB アプリケーション内に存在します。配置記述子内で Bean とアプリケーションを設 定し、その記述子を Oracle Application Server 内で配布します。配布後、特定のアプリケー ション・レベルのパラメータを変更できます。ただし、Bean の設定を Oracle Application Server Manager で変更することはできません。配布ファイルの詳細は第 4 章「配布ファイルの 作成」を、設定と配布の詳細は『Oracle Application Server 管理者ガイド』を参照してくださ い。配布した後は、Oracle Application Server が EJB アプリケーションとアプリケーション内 のすべての Bean を管理します。 Oracle Application Server の持つ EJB 機能 Enterprise JavaBeans 1.0 の仕様には、6 つのロールが規定されています。 Enterprise Bean プロバイダ ユーザーが提供します。Oracle Application Server の EJB フレームワークで稼動するための業務ロジックです。 アプリケーション・ アセンブラ Oracle Application Server では、独自の JNDI 名前領域を持 つアプリケーションに Bean をグループ化できます。これは 大規模なサイトを管理する場合に便利です。 配布者 Oracle Application Server は、その上で Enterprise Bean が稼動 するプラットフォームです。Oracle Application Server は、 Bean の配置記述子を読み込み、これをインプリメントします。 EJB サーバーおよび コンテナ・プロバイダ Oracle Application Server は EJB サーバー・プロセスを提供 します。これにより、EJB コンテナが実行され、サービスが インプリメントされます。 システム管理者 Oracle Application Server には Oracle Application Server Manager が用意されています。これは一連の HTML フォー ムで、これを使用してアプリケーションをモニターし、管理 できます。 Oracle Application Server を EJB アプリケーションの配布プラットフォームとして使用する 場合は、Oracle Application Server がサーバーおよびコンテナ・プロバイダとして機能しま す。アプリケーションのアセンブリ、配布およびシステム管理に役立つ環境も用意されてい ます。ご自分で Enterprise Bean を作成することも、サードパーティ製のものを使用するこ ともできます。EJB アプリケーションをインストールする際に、アプリケーションの各 Bean に対して配置記述子を設定します。それぞれの配置記述子は、 javax.ejb.deployment.SessionDescriptor オブジェクトのシリアライズされたイン スタンスで、Bean(トランザクション・モードなど)や JNDI の場所についての情報を提供 します。 2-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Oracle Application Server の持つ EJB 機能 図 2-1 に、EJB コンポーネント・アプリケーションが Oracle Application Server でどのよう に実行されるかを示します。 図 2-1 Oracle Application Server の EJB コンポーネント Oracle Application Server (JVM) EJB サーバー・プロセス EJB コンテナ アプリケーション・インスタンス Bean Bean Bean RM プロキシ ORB クライアント EJB アプリケーションでは、Bean はアプリケーション・インスタンスに存在します。アプリ ケーション・インスタンス自体は EJB コンテナにあり、ライフサイクル制御、トランザク ション、セキュリティおよび同時実行性などのランタイム・サービスを提供します。EJB ア プリケーションを配布して実行すると、Oracle Application Server によってこれらのコンテ ナが用意されます。 EJB サーバーには EJB コンテナが含まれます。Oracle Application Server では、EJB サー バーはプロセスに相当し、カートリッジ・プロセスのように管理されます。EJB サーバーは、 プロセスとスレッドの管理、ロード・バランシングおよびロギングなどのサービスや、EJB ランタイムに必要な Java パッケージと JVM を提供します。また、EJB アプリケーションが 実行されるフレームワークを提供します。 Oracle Applicatin Server の RM プロキシは、クライアントがアプリケーション・インスタン スに接続するための CosNaming と認証を提供します。クライアントがアプリケーション・ インスタンスに関連付けられると、クライアントとアプリケーション・インスタンスの通信 は EJB サーバーを通じて行われます。 Enterprise JavaBeans 2-3 Enterprise Beans のクライアント・ビュー 現行リリースの制約 Oracle Application Server 4.0 のこのリリースでは、EJB コンポーネントに次の制約がありま す。 ■ javax.ejb.SessionSynchronization インタフェースはサポートされていません。 ■ エンティティ Beans と主キーはサポートされていません。Enterprise JavaBeans の仕様 では、エンティティ Beans とセッション Beans の 2 つのタイプの Bean が定義されてい ます。現在のバージョンの Oracle Application Server は、Enterprise JavaBeans 1.0 のオ プション機能であるエンティティ Beans をサポートしていません。Oracle Application Server は、セッション Beans のみサポートしています。 ■ セキュリティ・モデルは EJB 1.0 準拠ではありません。 ■ IIOP マッピングは、JavaSoft が定義している Java RMI/IIOP の標準マッピングに準拠し ていません。 Enterprise Beans のクライアント・ビュー EJB には、ホーム・インタフェースとリモート・インタフェースの 2 つのクライアント用イ ンタフェースが用意されています。EJB リモート・インタフェースを、RMI リモート・イン タフェースと混同しないでください。今後リモート・インタフェースという場合は、RMI リ モート・インタフェースを拡張する EJB リモート・インタフェースを指します。 ■ ホーム・インタフェース : クライアントはホーム・インタフェースを使用して、Bean の インスタンスを探して作成します。 クライアントは、JNDI(Java Naming and Directory Interface)を通じてホーム・イン タフェースを検索します。アプリケーションの JNDI 名前領域は、Java 仮想マシン (JVM)内に存在します。クライアントがアプリケーションの JNDI 名前領域を通過する と、アプリケーション・インスタンスが自動的にクライアントに関連付けられます。 このアプリケーション・インスタンスには、アプリケーションの名前領域全体が含ま れ、アプリケーション内のオブジェクトのすべてのホーム・インタフェースを検索する ために使用されます。 クライアントは、ホーム・インタフェースの create() メソッドを使用して Bean のイ ンスタンスを作成します。 ■ リモート・インタフェース : クライアントは、Beans のリモート・インタフェースを通 じて Beans のメソッドにアクセスします。このインタフェースは、Bean がコンテナで 実行される際に作成される EJB オブジェクトによりインプリメントされます。 2-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド EJB コンポーネントと Web アプリケーションの相違点 図 2-2 EJB のアーキテクチャ EJB サーバー クライアント EJB ホーム EJB リモート Bean EJB ホーム Bean EJB リモート EJB ホーム Bean EJB リモート EJB コンテナ EJB コンポーネントと Web アプリケーションの相違点 Oracle Application Server 環境では、EJB コンポーネント・アプリケーションと他のアプリ ケーションとの間に大きな違いがあります。 トランスポート・プロトコル Internet Inter-Orb Protocol(IIOP)2.0 は、次の 2 つの間で使用されるトランスポート・ プロトコルです。 ■ クライアントおよび EJB アプリケーション ■ 別の Java 仮想マシンで稼動する Beans 従来の Web アプリケーションでは、トランスポート・プロトコルに HTTP を使用します。 IIOP(Internet Inter-ORB Protocol)は、OMG(Object Management Group、 http://www.omg.org)で定義されている CORBA のトランスポート・プロトコルです。 クライアントやアプリケーションを作成する場合、Oracle Application Server はインフラス トラクチャ・コード(スタブやスケルトンなど)を生成して、CORBA/IIOP アーキテク チャをサポートします。CORBA/IIOP を使用すると、クライアントは Bean に直接接続でき ます。初期化プロセスの後は、クライアントのリクエストとアプリケーションのレスポンス は Oracle Application Server によって調整されません。 Enterprise JavaBeans 2-5 ツールと開発プロセス クライアント EJB アプリケーションのクライアントは、Java アプレット、分散アプリケーションにおける 従来型のスタンドアロン Java クライアント、あるいは同じまたは別のアプリケーションに存 在する Bean などです。HTTP ベースのブラウザや非 Java クライアントは使用できません。 ブラウザの場合、ブラウザに URL を入力して EJB アプリケーションにアクセスはできませ ん。そのかわりに、ブラウザ内で実行されているアプレットが EJB アプリケーションの直接 のクライアントになります。ブラウザから Web ベースのアプリケーションを実行すると、 アプリケーションは処理を実行し、HTTP を使用して HTML ページをブラウザに返します。 次に、ブラウザはその HTML を解釈して表示します。 ツールと開発プロセス EJB アプリケーションの Bean の開発には、Java 1.2 以上をサポートする Java 開発環境なら どれでも使用できます。たとえば、Oracle JDeveloper やサン・マイクロシステムズ社の JDK などを使用できます。Oracle JDeveloper の利点の 1 つは、EJB のローカル・デバッグ機 能を備えていることです。 また、アプリケーションをパッケージ化するには JAR ユーティリティが必要です。JAR はサ ン・マイクロシステムズ社の JDK に付属しています。オブジェクトをシリアライズできる IDE を使用していない場合、Oracle Application Server の eco2ejb ユーティリティを使用し て、シリアライズした記述子を生成できます。 PL/SQL プロシージャの起動 Java アプリケーションから PL/SQL プロシージャおよびファンクションを実行できるよう にするには、pl2java を使用します。これは、PL/SQL プロシージャの Java ラッパー・クラ スを生成するユーティリティです。 pl2java を使用する前に、ご使用のアプリケーションの環境変数に次の値を追加する必要が あります。 表 2-1 pl2java の起動に必要な環境変数 名前 値 LD_LIBRARY_PATH(UNIX のみ) $ORACLE_HOME/ows/cartx/jweb/lib PATH(Windows NT のみ) %ORACLE_HOME%¥ows¥cartx¥jweb¥lib pl2java ユーティリティの詳細は、 『Oracle Application Server JServlet アプリケーション開発 者ガイド』を参照してください。 アプリケーションの環境変数の更新に関する詳細は、 『Oracle Application Server 管理者ガイ ド』を参照してください。 2-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 開発のフローチャート 開発のフローチャート 次のフローチャートに、EJB アプリケーションとそのクライアントの作成に必要な、全体の ステップを示します。 図 2-3 開発プロセスのフローチャート EJB インプリメン テーションの作成 アプリケーションの JAR ファイルの作成 リモートおよび ホーム・インタ フェースの作成 EJB アプリケーションの 配布 サポート・クラスの 作成 クライアント・ アプリケーションの 作成 クラスの コンパイル クライアント JAR ファイルの作成 配置記述子および マニフェスト・ ファイルの作成 クライアントの実行 Enterprise JavaBeans 2-7 開発のフローチャート EJB コンポーネントの作成 — 第 3 章を参照 EJB コンポーネントを作成するには、次のステップを実行してください。 1. EJB インプリメンテーションを作成する 2. EJB リモート・インタフェースおよびホーム・インタフェースを作成する 3. 例外、データ構造などのサポート・クラスの作成 EJB コンポーネントのコンパイルと実行 — 第 4 章を参照 EJB コンポーネントを作成した後に、次のステップを実行してください。 4. クラスのコンパイル 5. 各 Beans およびアプリケーションのマニフェスト・ファイルと配置記述子の作成 6. アプリケーションの JAR ファイルの作成 7. Oracle Application Server 内で EJB アプリケーションを配布する クライアントの作成 — 第 5 章を参照 8. クライアント・アプリケーションの作成 9. クライアントの JAR ファイルの作成 10. クライアントの実行 2-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 3 Enterprise Beans の作成 Enterprise JavaBeans 1.0 仕様では、セッション Beans とエンティティ Beans を定義していま す。Oracle Application Server のこのリリースでは、セッション Beans のみサポートしていま す。さらに、現在 Oracle Application Server では、javax.ejb.SessionSynchronization インタフェースをサポートしていません。Bean は、インタフェースにメソッドをインプリメ ントできますが、コンテナはそれをコールしません。 この章ではセッション Beans の作成および使用方法について説明します。 内容 ■ セッション Beans 作成のステップ ■ クライアント・インタフェース ■ SessionBean クラスの作成 ■ セッション Bean のリモート実行 ■ 状態を保持するセッション Bean および状態を保持しないセッション Bean ■ 値によるオブジェクトの受渡しの制約 セッション Beans 作成のステップ セッション Bean を作成するには、次のステップを実行します。 1. Bean のリモート・インタフェースを作成します。リモート・インタフェースでは、 クライアントが実行できるメソッドを宣言し、javax.ejb.EJBObject を拡張する必 要があります。 2. Bean のホーム・インタフェースを作成します。ホーム・インタフェースでは javax.ejb.EJBHome を拡張する必要があります。さらに、ホーム・インタフェースで は、必要な機能をインプリメントするセッション Bean クラスである bean.sessCreate に create メソッドを定義します。これには、次のメソッドが含まれます。 Enterprise Beans の作成 3-1 クライアント・インタフェース 3. a. リモート・インタフェースで宣言したメソッドのインプリメンテーション。 b. javax.ejb.SessionBean インタフェースに定義されているメソッド。 c. ejbCreate メソッド(ホーム・インタフェースについて定義された create メソッドのパラメータに一致するパラメータを持つ) 。 関連する配置記述子を作成します。 a. 各 Bean に対して配置記述子が 1 つずつ必要です。配置記述子は Bean のプロパティ を指定します。これは Bean を実行した後に変更可能です。このため、Bean を再コ ンパイルせずにカスタマイズできます。第 4 章「配布ファイルの作成」を参照して ください。 b. アプリケーションの配置記述子には、アプリケーションに関する一般情報と、アプ リケーション内のすべての Bean のデフォルト値が含まれています。第 4 章「配布 ファイルの作成」を参照してください。 4. アプリケーションのマニフェスト・ファイルを作成します。マニフェスト・ファイルに は Bean 名や配置記述子名などの管理情報が含まれます。第 4 章「配布ファイルの作成」 を参照してください。 5. セッション Bean、リモートおよびホーム・インタフェース、配置記述子、そしてマニ フェスト・ファイルを含んだ EJB JAR ファイルを作成します。EJB JAR ファイルは、ア プリケーションの全ての Bean を定義する必要があります。詳細は、第 4 章「配布ファ イルの作成」を参照してください。 注意 : 作成した Enterprise Bean が別の Bean にアクセスする場合、Bean から別の Bean を参照するための情報については 5-3 ページの「Bean のオ ブジェクト・リファレンスの取得」の項を参照してください。 クライアント・インタフェース Enterprise セッション Bean には、リモート・インタフェースとホーム・インタフェースの 2 つのクライアント・インタフェースがあります。リモート・インタフェースはオブジェク トのクライアントが実行できるメソッドを指定し、ホーム・インタフェースはクライアント がオブジェクトを作成する方法を定義します(これはオブジェクトへのリファレンスを返し ます) 。いずれのインタフェースにも同様の制限があります。 ■ リモート・インタフェースおよびホーム・インタフェースのインプリメンテーションの 要件 ■ リモート・インタフェースの作成 ■ ホーム・インタフェースの作成 ■ 例外クラスの作成 3-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド クライアント・インタフェース リモート・インタフェースおよびホーム・インタフェースの インプリメンテーションの要件 要件 説明 RMI 規格合致性 javax.ejb.EJBObject インタフェースと javax.ejb.EJBHome インタフェースは java.rmi.Remote を拡張するため、Remote Method Invocation(RMI)仕様に準拠している必要があります。 つまり、これらのメソッドには RMI で認められているデータ型の み使用可能で、どちらのインタフェースのメソッドも java.rmi. RemoteException 例外を発行する必要があります。 RMI の仕様は、JavaSoft のサイト http://www.javasoft.com から 入手できます。 ネーミング規則 インタフェース名、メソッド名およびこれらのインタフェースに 定義されている定数には、先頭にアンダーバー(_)を付けたり ドル記号($)を含めることはできません。また、アプリケー ション名や Bean 名にはスラッシュ(/)を使用できます。 主キー 主キーはエンティティ Beans に使用します。Oracle Application Server は現在エンティティ Beans をサポートしていないため、 ホーム・インタフェースの remove(Object) メソッドなど、 主キーを必要とするメソッドはサポートされていません。 値によるオブジェクトの オブジェクトは、パラメータ・ベースで、値によって受け渡され 受渡しの制約 ます。詳細は、3-17 ページの「値によるオブジェクトの受渡しの 制約」を参照してください。 リモート・インタフェースの作成 Bean のリモート・インタフェースは、クライアントがその Bean のメソッドにアクセスする ためのインタフェースを提供します。リモート・インタフェースでは、リモート・アクセス 用にインプリメントされるメソッドを定義します。 Bean のリモート・インタフェースは、次の定義を持つ javax.ejb.EJBObject インタ フェースを拡張する必要があります。 public interface javax.ejb.EJBObject extends java.rmi.Remote { public abstract EJBHome getEJBHome(); // returns reference to home interface // for this bean public abstract Handle getHandle(); // returns serializeable handle to bean public abstract Object getPrimaryKey(); // not supported // (used for entity beans only public abstract boolean isIdentical(EJBObject obj); public abstract void remove(); //remove the EJB object } Enterprise Beans の作成 3-3 クライアント・インタフェース EJBObject インタフェースのメソッドはインプリメントする必要ありません。これらのメ ソッドはコンテナがインプリメントします。 機能 説明 getEJBHome() この特定の Bean に対応するホーム・インタフェースのオブジェクト・ リファレンスを取り出します。 getHandle() EJB オブジェクト・リファレンスのシリアライズ可能な Java 表現は、 リモート・インタフェースの getHandle メソッドを使用して取得で きます。ハンドルはシリアライズ可能で、Bean インスタンスがアク ティブであるかぎり、これを使用して同じオブジェクトへの接続を再 確立できます。Bean インスタンスを取り出すには、Handle クラスの getEJBObject メソッドを使用します。 getPrimaryKey() getPrimaryKey メソッドは、将来 EJB EntityBeans でサポートされ る場合用に定義されています。今回のリリースではサポートされてい ません。 isIdentical() このメソッドをコールするオブジェクトと、引数のオブジェクトが同 じであること(コンテナに関するかぎり)をテストします。これは、 これらのオブジェクトがあらゆる用途について同一であることを識別 します。 remove() EJB Bean を非アクティブにします。次に、セッション Bean インスタ ンスを破棄します(状態を保持する場合)。 例 次のコード例は、ServerStackRemote というリモート・インタフェースを示しています。 これは、getStackSize、setStackSize、push および pop という 4 つのメソッド(Bean にイン プリメントされている)を宣言します。 package myStack; public interface ServerStackRemote extends javax.ejb.EJBObject { public int getStackSize() throws java.rmi.RemoteException; public void setStackSize(int size) throws StackException, java.rmi.RemoteException; public void push(String value) throws StackException, java.rmi.RemoteException; public String pop() throws StackException, java.rmi.RemoteException; } 3-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド クライアント・インタフェース ホーム・インタフェースの作成 クライアントは、主に Bean のインスタンスを作成するために Enterprise Bean のホーム・ インタフェースを使用します。また、Bean のホーム・インタフェースを使用して、 javax.ejb.EJBMetaData インタフェースを通じて Bean のメタデータ情報を取り出した り、ハンドルがある場合には Bean インスタンスを削除することができます。 ホーム・インタフェースでは、次の定義を持つ javax.ejb.EJBHome インタフェースを拡 張する必要があります。 public interface javax.ejb.EJBHome extends java.rmi.Remote { public abstract EJBMetaData getEJBMetaData(); public abstract void remove(Handle handle); } EJBHome インタフェースのメソッドは、コンテナによりインプリメントされています。 クライアントは、ホーム・インタフェースまたはリモート・インタフェースに定義されてい る remove メソッドのいずれかを使用して、EJB オブジェクトを削除できます。 EJB オブジェクトの作成 ホーム・インタフェースで、適切な create メソッドを Bean に定義してください。クライ アントは、ホーム・インタフェース内で宣言されている create メソッドを実行します。 コンテナが返され、そのコンテナは Bean インプリメンテーション内で適切なパラメータ・ シグネチャを使用して ejbCreate メソッドをコールします。パラメータの引数を使用し て、新規 EJB オブジェクトの状態を初期化できます。 注意 : Oracle Application Server にはメソッドのオーバーロードができな いという制約があるため、複数のシグネチャを持つ複数の create メソッ ドは使用できません。 ご使用の create メソッドで使用できるシグネチャは、Beans が状態を保 持するかしないかに依存します。状態を保持しない Beans の場合は、初期 化時にパラメータを設定できません。詳細は、3-14 ページの「状態を保持 するセッション Bean および状態を保持しないセッション Bean」を参照し てください。 Enterprise Beans の作成 3-5 SessionBean クラスの作成 例 次のサンプル・コードは、ServerStackHome というホーム・インタフェースを示していま す。create メソッドは状態を保持しないセッション Bean であるため、引数がありません。 package myStack; public interface ServerStackHome extends javax.ejb.EJBHome { public ServerStackRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException; } 例外クラスの作成 ServerStack クラスのメソッドには、StackException 例外を発行できるものがあります。 オブジェクトからクライアントに例外を転送する場合は、その例外のクラスを定義する必要 があります。 次のコードで例外クラスを定義しています。これは StackException.java 内に存在します。 package myStack; public final class StackException extends Exception { public StackException() { } } SessionBean クラスの作成 SessionBean には、ご使用の Bean の業務ロジックが含まれています。このオブジェクトは、 次のメソッドをインプリメントします。 ■ リモート・インタフェースに宣言されている Bean メソッド。 アプリケーションの Bean は ServerStack という 1 つのクラスで構成されます。これに は、値の出し入れが可能な、簡単な後入れ先出し方式のスタックがインプリメントされ ています。このクラスには次の 4 つのパブリック・メソッドが含まれています。 ■ ■ setStackSize() は、スタックが保持できる値の数を設定します。 ■ getStackSize() は、スタックが保持できる値の数を返します。 ■ push() は、スタックに値を入れます。 ■ pop() は、スタックから値を取り出します。 SessionBean インタフェース内で宣言されたメソッド。 3-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionBean クラスの作成 ■ ホーム・インタフェースに宣言されている create メソッドに対応する ejbCreate メ ソッド。対応する create メソッドをクライアントが実行すると、コンテナが ejbCreate メソッドを実行します。 インプリメントされるインタフェース SessionBean は、次の定義を持つ javax.ejb.SessionBean インタフェースをインプリメ ントします。 public interface javax.ejb.SessionBean extends javax.ejb.EnterpriseBean { public abstract void ejbActivate(); public abstract void ejbPassivate(); public abstract void ejbRemove(); public abstract void setSessionContext(SessionContext ctx); } 注意 : 現在コンテナは、ejbActivate メソッドと ejbPassivate メソッドを実行しません。それでも、両方のメソッドに空のメソッドを インプリメントする必要があります。また、将来のリリースでこれらの メソッドがサポートされたときに EJB アプリケーションを変更しなくて済 むように、これらのメソッドがコールされていることを想定してインプリ メントすることをお薦めします。 ejbPassivate の使用 セッション Bean が非アクティブな周期に入ると、コンテナによって受動的な状態に設定す ることができます。受動的な状態にすると、セッション Bean の状態が 2 次記憶装置に一時 的に移動されます。このプロセスは、パッシブ化と呼ばれます。 コンテナが Bean をパッシブにする前に、ejbPassivate で次の 2 つを実行する必要があり ます。 ■ Bean がシリアライズ可能であることを確認する。セッション Bean インスタンスの状態 がシリアライズ可能であることを確認する必要があります。インスタンスの状態がシリ アライズ可能でない場合、そのインスタンスはコンテナによって破棄される場合があり ます。このため、シリアライズできないことがわかっている Bean 属性は、一時的なも のと宣言するか、あるいは NULL に設定しておく必要があります。 ■ オープン・リソースをすべてクローズする。パッシブにする前に、オープン・リソース をすべてクローズしてください。たとえば、データベース接続やオープンになっている ファイル・ハンドルはすべてシリアライズ不可能なため、Bean がパッシブになる前に クローズする必要があります。また、ejbActivate 内で容易に再構築可能な ejbPassivate 内に、大きなデータ構造体をリリースできます。実際の Bean のパッシ ブ化はコンテナが行います。 Enterprise Beans の作成 3-7 SessionBean クラスの作成 ejbActivate の使用 パッシブになったセッション Bean をアクティブな状態に再構築するプロセスは、アクティ ブ化と呼ばれます。ejbActivate メソッドにより、セッション Bean インスタンスの状態 を再構築するために必要なタスクが実行されます。これには、データベース接続のオープ ン、必要なファイル・ハンドルのオープン、および ejbPassivate 中に破棄されたデータ 構造体の再構築などが含まれます。ejbActivate が実行される前に、コンテナはシリアラ イズされたインスタンスの状態をロードします。 ejbRemove の使用 コンテナは、Bean オブジェクトをコンテナから削除する前に、ejbRemove メソッドをコー ルします。このメソッドは、通常 Bean が破棄される前に行うクリーン・アップを実行する ために使用されます。これには、データベース接続または他のリソースのクローズなどが含 まれます。 setSessionContext の使用 このメソッドは、コンテキストへのリファレンスを保持するためにセッション Bean インス タンスが使用します。セッション Bean にはセッション・コンテキストが存在します。コン テナはこれを維持し、Bean から使用できるようにします。Bean は、コンテナに対するコー ルバック・リクエストを行うためにセッション・コンテキストのメソッドを使用する場合が あります。 コンテナは、まず Bean を初期化してから setSessionContext メソッドを実行し、Bean がセッション・コンテキストを取り出せるようにします。コンテナが、トランザクション・ コンテキスト内からこのメソッドをコールすることはありません。Bean がこの時点でセッ ション・コンテキストを保存しないと、セッション・コンテキストにアクセスできなくなり ます。 コンテナはこのメソッドをコールする際に、SessionContext オブジェクトのリファレンスを Bean に渡します。その後、Bean はそのリファレンスを後で使用するために保管できます。 次の例では、Bean が sessctx 変数にセッション・コンテキストを保存するところを示して います。 import javax.ejb.*; import oracle.oas.ejb.*; public class myBean { SessionContext sessctx; void setSessionContext(SessionContext ctx) { sessctx = ctx; // session context is stored in // instance variable } // other methods in the bean } 3-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionBean クラスの作成 javax.ejb.SessionContext インタフェースの定義は次のとおりです。 public interface SessionContext extends javax.ejb.EJBContext { public abstract EJBObject getEJBObject(); } また、javax.ejb.EJBContext インタフェースの定義は次のとおりです。 public interface EJBContext { public abstract Properties public abstract UserTransaction public abstract boolean public abstract void public abstract boolean public abstract Identity public abstract EJBHome getEnvironment(); getUserTransaction(); getRollbackOnly(); setRollbackOnly(); isCallerInRole(Identity); // not supported getCallerIdentity(); // not supported getEJBHome(); } Bean は表 3-1 にリストされた処理を行う際に、セッション・コンテキストを必要とします。 表 3-1 SessionContext 操作 メソッド 説明 getEnvironment() Bean のプロパティの値を取得する。 getUserTransaction() プログラムによってトランザクションを区切ることのできる、 トランザクション・コンテキストを取得する。これは、 TX_BEAN_MANAGED でトランザクションを使用可能と指定 された Bean についてのみ有効です。 setRollbackOnly() コミットできないように現行のトランザクションを設定する。 getRollbackOnly() 現行のトランザクションがロールバックのみ行うように設定され ているかどうかチェックする。 getEJBHome() 対応する EJBHome(ホーム・インタフェース)への Bean の オブジェクト・リファレンスを取得する。 Enterprise Beans の作成 3-9 SessionBean クラスの作成 セッション Bean の例 次のコードは、ServerStack というセッション Bean のメソッドをインプリメントしています。 この例では、Oracle Application Server の Logger サービスを使用しています。このサービス は、"oas_service:logger" URL を使用して JNDI を通じてアクセスされます。返される オブジェクトは、oracle.oas.ejb.Logger クラスです。これは、Oracle Application Server のインフラストラクチャを使用してメッセージのログを記録するために使用できます。 package myStack; import javax.ejb.*; import oracle.oas.ejb.*; import java.util.Properties; import javax.naming.*; public class ServerStack implements javax.ejb.SessionBean { private int stackSize = 0; private String stackElements[]; private int top = -1; private SessionContext osc = null; private Logger logger = null; //implement the methods from SessionBean: ejbActivate, ejbPassivate, //ejbRemove, and setSessionContext. //retrieve the session context for future information needs about //the bean. public void setSessionContext(SessionContext ctx) { //save the session context for any future information needs osc = ctx; } //implement ejbCreate, which is called by the container when the //Home create is invoked by the client. public void ejbCreate() throws CreateException { //initialize the logger and the environment properties. try { Context ctx = new InitialContext(); logger = (oracle.oas.ejb.Logger) ctx.lookup ("oas_service:logger"); logger.setSeverity (oracle.oas.ejb.Logger.LOG_SEVERITY_DEBUG); Properties env = osc.getEnvironment(); setStackSize(Integer.parseInt(env.getProperty("initialStackSize"))); } 3-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionBean クラスの作成 catch (Exception e) { e.printStackTrace (System.out); throw new CreateException (e.getMessage()); } } //implement the activation routine. anything that needs to be //done to the bean upon activation should be included here. public void ejbActivate() { } //implement anything that needs to be done before the //bean is passivated. this would include closing any open //resources. however, for this example, no open resources need //to be closed. thus, the method is empty. public void ejbPassivate() { } //implement anything that needs to be done before the //bean is destroyed. this would include closing any open //resources. however, for this example, no open resources need //to be closed. thus, the method is empty. public void ejbRemove() { } //implement the methods for the bean: getStackSize, setStackSize, push //and pop. //getStackSize retrieves the size set for the stack that was set either //within ejbCreate or reset within setStackSize. public int getStackSize() { logger.println(" Getting stack size..."); return stackSize; } //resets the stack size to a new value. public void setStackSize(int size) throws StackException { if (size < 0) throw new StackException(); logger.println(" Setting stack size to " + size + "..."); top = -1; stackSize = size; stackElements = new String[size]; } //push a value on to the stack public void push(String value) throws StackException Enterprise Beans の作成 3-11 セッション Bean のリモート実行 { if (top == stackSize - 1) throw new StackException(); logger.println(" Pushing ¥"" + value + "¥" onto the stack..."); stackElements[++top] = value; } //pop a value off of the stack public String pop() throws StackException { if (top == -1) throw new StackException(); logger.println(" Popping the stack (returning element " + stackElements[top] + ")..."); return stackElements[top--]; } } セッション Bean のリモート実行 セッション Bean に対するリモート・メソッド実行は、シリアライズする必要があります。 どのような場合も、リモート・メソッドは、特定のセッション Bean のリモート・インタ フェースを通じて、1 つしか実行できません。最初の実行中に別のクライアントまたはス レッドから実行されると、2 回目の実行には例外が発行されます。これはすべての種類の セッション Bean に適用されます。EJB フレームワークでは、クライアントがリモート・イ ンタフェースのメソッドを順番に実行するように設計する必要があります。 クライアントがセッション Bean にアクセスする際に発生するイベントを、次の図とステッ プで説明します。 3-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド セッション Bean のリモート実行 図 3-1 セッション Bean のライフサイクルの一連のイベント リモート・ インタフェース X のリファレンス(4) ) ホーム・ インタフェース X のリファレンス (2) ) ルックアップ (1) ) クライアント 1 ホーム・ インタフェース X (4) リモート・ インタフェース X (6) Bean X create()(3) ) メソッド (5) コンテナ remove(7) ) 図内の番号は、次のステップ番号に対応しています。 1. クライアント 1 が Bean X のホーム・インタフェースを参照します。 2. ホーム・インタフェース X のリファレンスがクライアント 1 に返されます。 3. クライアント 1 は、ホーム・インタフェース X 上で create を実行します。 4. ホーム・インタフェース X はリモート・インタフェース X のインスタンスを生成しま す。コンテナは次のいずれかを実行します。 a. 状態を保持する Bean の場合、このクライアントに対して Bean のインスタンスが生 成され、クライアントが remove を実行したときにのみ破棄されます。 b. Bean が状態を保持しない場合、コンテナはクライアントの処理を行うために Bean プールから Bean インスタンスを渡します。remove が実行されるまで、このクライ アントのみがこの Bean インスタンスにアクセスできます。remove が実行される と、Bean は次のクライアント・リクエスト用に Bean プールに返されます。 注意 : 状態を保持する Bean と保持しない Bean の詳細は、3-14 ページの 「状態を保持するセッション Bean および状態を保持しないセッション Bean」を参照してください。 リモート・インタフェース X のオブジェクト・リファレンスがクライアント 1 に返され ます。 5. クライアント 1 はリモート・インタフェース X を使用して、Bean インスタンス X 上で メソッドを実行します。 Enterprise Beans の作成 3-13 状態を保持するセッション Bean および状態を保持しないセッション Bean 6. リモート・インタフェース X は Bean にコールを委任します。 7. クライアント 1 は、Bean インスタンスの使用が終わるとリモート・インタフェース X 上で remove を実行します。これにより、リモート・インタフェースと、場合により Bean インスタンス(状態を保持する場合)が破棄されます。 状態を保持するセッション Bean および 状態を保持しないセッション Bean セッション Bean には、状態を保持するものと保持しないものがあります。 ■ 状態を保持する Bean はシングル・クライアント用です。このオブジェクトは、特定の クライアントにのみ関連した " 状態 " を維持します。クライアントが持つ各リモート・ インタフェース・インスタンスごとに、Bean のインスタンスが生成されます。 ■ 状態を保持しない Bean は状態を維持しないため、複数のクライアントの処理を実行で きます。インスタンス生成される Bean の数は、一定の期間内に同時に実行されるメ ソッドの数に依存します。 状態を保持するセッション Bean 状態を保持するセッション Bean は、その Bean インスタンスを生成したクライアントに直 接関係のある状態やデータを維持します。このため、状態を保持する Bean は、それを作成 したクライアント専用になります。そして、Bean にアクセスするためにクライアントが使 用するリモート・インタフェースの存続期間中、この Bean は存在します。 リモート・インタフェースが、ホーム・インタフェースの create メソッドを通じて作成さ れた場合、状態を保持するセッション Bean のインスタンスが生成され、初期化されます。 リモート・インタフェースまたはホーム・インタフェースの remove メソッドが実行される と、Bean インスタンスはリモート・インタフェースにより破棄されます。状態を保持する セッション Bean の ejbCreate メソッドおよび ejbRemove メソッドは、それぞれ create および remove を使用して実行されます。 3-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 状態を保持するセッション Bean および状態を保持しないセッション Bean 図 3-2 状態を保持するセッション Beans クライアント 1 create() ホーム・ インタフェース X 1 create() ホーム・ インタフェース X 2 クライアント 2 リモート・ インタフェース X 1 リモート・ インタフェース X 2 Bean X1 Bean X2 異なるインスタンスが 固有のリモート・ インタフェースに 統合される コンテナ 図 3-2 を見てみましょう。 ■ クライアント 1 は、Bean X のホーム・インタフェース・インスタンスを参照し、ホー ム・インタフェース X1 に対するオブジェクト・リファレンスを取得します。クライア ント 1 はこのリファレンスを使用して、ホーム・インタフェースの create を実行し、 リモート・インタフェース X1 のインスタンスが生成されます。リモート・インタ フェースとともに、Bean インスタンス X1 のインスタンスが生成されます。 ■ クライアント 2 は、Bean X のホーム・インタフェース・インスタンスを参照し、ホー ム・インタフェース X2 へのオブジェクト・リファレンスを取得します。ホーム・イン タフェースの create が実行され、リモート・インタフェース X2 と Bean インスタンス X2 のインスタンスが生成されます。 クライアント 1 がリモート・インタフェース X1 上でメソッドを実行すると、実行が Bean イ ンスタンス X1 に変換されます。クライアント 2 がリモート・インタフェース X2 上でメソッ ドを実行すると、実行が Bean インスタンス X2 に変換されます。リモート・インタフェース とそれに対応する Bean インスタンスには一対一の関係があります。クライアントが対応す るリモート・インタフェース上で remove を実行すると、リモート・インタフェースおよび それに対応する Bean インスタンスが破棄されます。 状態を保持しないセッション Bean 状態を保持しないセッション Bean には、すべてのリモート・インタフェースに依存しない 存続期間が存在します。状態を保持しないセッション Bean は、特定のクライアントに関す る状態やデータを維持しません。このため、複数のリモート・インタフェースにつき 1 つの 状態を保持しないセッション Bean が存在することが可能です。リモート・インタフェース のメソッドが実行されると、コンテナはリクエストを処理するために Bean プール内にある Bean インスタンスを選択するか、あるいは必要に応じてリクエストを処理するために新規 インスタンスを作成します。メソッド実行を処理するために Bean インスタンスが選択され ると、そのインスタンスは、実行期間中、その実行を行ったリモート・インタフェース専用 になります。 Enterprise Beans の作成 3-15 状態を保持するセッション Bean および状態を保持しないセッション Bean 図 3-3 状態を保持しないセッション Beans クライアント 1 create() ホーム・ インタフェース X 1 リモート・ インタフェース X 1 Bean プール Bean Xa create() ホーム・ インタフェース X 2 クライアント 2 複数のインスタンス が特定のリモート・ インタフェースに 結合されない リモート・ インタフェース X 2 Bean Xb コンテナ 図 3-3 を見てみましょう。 ■ クライアント 1 は、Bean X のホーム・インタフェース・インスタンスを参照し、ホー ム・インタフェース X1 に対するオブジェクト・リファレンスを取得します。クライア ント 1 はこのリファレンスを使用して、ホーム・インタフェースの create を実行し、 リモート・インタフェース X1 のインスタンスが生成されます。クライアント 1 がリ モート・インタフェース X1 に対してメソッドを実行すると、コンテナは Bean インスタ ンス Xa のインスタンスを生成し、実行をインスタンス Xa に委任します。この時点で、 Bean インスタンス Xa はリモート・インタフェース X1 からのリクエストのみ処理しま す。 ■ クライアント 2 はリモート・インタフェース X2 に対してメソッドを実行しますが、Bean インスタンス Xa はリクエストを処理できないため、新規 Bean インスタンス Xb が作成 されてリクエストを処理します。クライアント 2 が実行を行う前にリモート・インタ フェース X1 の実行が完了すると、Bean インスタンス Xa が Bean プールに解放され、リ モート・インタフェース X2 からのリクエストに応答できるようになります(その間に Bean プールを管理するコンテナが、Bean インスタンス Xa を破棄しない場合)。 状態の設定 セッション Bean が状態を保持しないように、または状態を保持するように指定するには、 Bean レベルの記述子クラス javax.ejb.deployment.SessionDescriptor の setStateManagementType メソッドを使用します。このメソッドは、引数で "STATEFUL_SESSION" または "STATELESS_SESSION" のいずれかを受け入れます。詳細 は、4-6 ページの「Bean レベルの配置記述子」を参照してください。 3-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 値によるオブジェクトの受渡しの制約 値によるオブジェクトの受渡しの制約 RMI では、メソッドの引数内で複数回同じオブジェクトの受渡しを行うと、受信された各パ ラメータは同じオブジェクト・インスタンスを参照します。Oracle Application Server では、 受信されたパラメータは別のオブジェクト・インスタンスを参照します。次の例では、リク エストが複数回発生した場合に Oracle Application Server がどのようにオブジェクトを受け 渡すかを示しています。 例 3-1 複数回のオブジェクト受渡し 次の例では、method1 と method2 という 2 つのメソッドを宣言しています。method1 は引 数として 3 つのオブジェクトを渡し、method2 は引数としてオブジェクトの配列を渡しま す。Oracle Application Server は次のものを返します。 ■ method1—Oracle Application Server は 3 つの引数を受け取ります。これらは同じオブ ジェクト(str)であり、同じインプリメンテーションの異なる 3 つのオブジェクト・イ ンスタンスを返す点に注意してください。 ■ method2—Oracle Application Server は 1 つの引数を受け取り、配列内の各エレメントが 同じオブジェクト・インスタンスを指すような配列を返します。 メソッド実行中に同じオブジェクトが引数として複数回受け渡される場合のみ、Oracle Application Server は、値によるオブジェクトの受渡しに関する RMI 仕様とは異なります。 public interface ServerRemote extends oracle.oas.ejb.EJBObject { //declare the two methods with different argument signatures public method1(String, String, String); public method2(String[]); } public class Server implements SessionBean { //declare a single string to pass within method1 and //to initialize the String[]. private String str = "strOne"; //declare the String array for method2 and populate it with String str. private String serverElements[] = new String[] {str, str, str}; //invoke both methods with its own signature. method1(str, str, str); method2(serverElements); } Enterprise Beans の作成 3-17 値によるオブジェクトの受渡しの制約 3-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 4 配布ファイルの作成 Bean を作成した後、配置記述子とマニフェスト・ファイルを作成し、それらを Bean のクラ ス・ファイルとともに JAR ファイルにパッケージ化する必要があります。この章では、配置 記述子、マニフェスト・ファイルおよび JAR ファイルを作成する方法を説明します。さら に、JAR ファイルのインストール方法、アプリケーションのパフォーマンスの改善およびア プリケーションのデバッグ方法についても説明します。 内容 ■ 配置記述子 ■ マニフェスト・ファイル ■ インストール用の JAR ファイルの作成 ■ EJB アプリケーションの配布 ■ EJB アプリケーションの設定 ■ アプリケーションの再配布とリロード ■ パフォーマンスの改善 ■ EJB アプリケーションのデバッグ 配置記述子 配置記述子は、アプリケーションまたは Bean に関する情報を提供するシリアライズされた オブジェクトです。EJB アプリケーションでは、2 種類の配置記述子が必要です。 ■ アプリケーション内の各 Bean ごとに 1 つの配置記述子 Bean レベルで提供する情報は、Bean のクラス名、Bean の JNDI 名、Bean のリモート およびホーム・インタフェースのクラス名、Bean が状態を保持するか保持しないか、 Bean が使用する名前と値のペアのリスト、Bean のトランザクション・モードなどで す。 配布ファイルの作成 4-1 配置記述子 ■ アプリケーション全体に対して 1 つの配置記述子(これは Oracle Application Server 固 有のもので、Enterprise JavaBeans 仕様では指定されていません)。この記述子はオプ ションです。 アプリケーション・レベルでは、アプリケーション名やアプリケーション内のすべての Bean のグローバルなトランザクションおよびチューニング情報などを提供します。 注意 : アプリケーションに配置記述子を使用しない場合、アプリケー ション名は GUI を使用して配布するときに入力するか、あるいは oasdeploy コマンドで -a <application_name> オプションを指定する必要が あります。 アプリケーションをインストールしたら、Oracle Application Server Manager を使用して、 配置記述子の情報を変更できます。アプリケーション名やすべてのオブジェクト名は、アプ リケーションを再インストールしないと変更できません。 配置記述子の作成 EJB の仕様では、記述子は、あらかじめ定義された特定クラスのシリアライズされた JavaBeans の形をとる必要があります。このバージョンの Oracle Application Server では セッション Bean しかサポートされていないため、記述子は javax.ejb.deployment.SessionDescriptor オブジェクトのシリアライズされたイン スタンスです。 Oracle JDeveloper を含め、ほとんどの IDE は、これらのオブジェクトのインスタンスを生 成し、シリアライズする方法を備えています。このようなツールがない場合、次のいずれか の方法で記述子を作成できます。 ■ eco2ejb ユーティリティの使用。これにより、テキスト・ファイルをシリアライズされ た SessionDescriptor オブジェクトに変換します。 ■ Java アプリケーションの作成。これにより、アプリケーションと各 Bean の SessionDescriptor オブジェクトを挿入し、シリアライズします。 eco2ejb ユーティリティの使用 ECO/Java アプリケーションを EJB アプリケーションに移行するユーザー向けに、Oracle Application Server には eco2ejb ユーティリティが用意されています。しかし、これは、テキ スト・ファイルからシリアライズされた記述子を生成するときにも使用できます。 eco2ejb ユーティリティは、ECO/Java アプリケーション用にフォーマットされたメタ情報 が入っている ECO.APP というファイルを使用します。このメタ情報は、アプリケーション と、アプリケーション内の Bean 用のシリアライズされた記述子に変換されます。eco2ejb ユーティリティは、典型的な ECO.APP ファイルと同じフォーマットと内容構造を持ってい るかぎり、どのような名前の入力ファイルにでも使用できます。ECO.APP ファイルの作成 4-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配置記述子 方法の詳細は、12-2 ページの「配布情報ファイルの構造」の ECO/Java の部分を参照してく ださい。 次に ECO.APP ファイルの構造を示します。 [APPLICATION] name=<application name> [<application name>.ENV] <application_property>=<value> [<EJB object name>] className=<name of object class> remoteInterface=<name of remote interface> homeInterface=<name of home interface> [<EJB object name>.ENV] <object property>=<value> このファイルを作成し、EJB アプリケーションに合う適切な名前を入力してから、次のファ イルと同じディレクトリで eco2ejb コマンドを実行します。 eco2ejb <filename> [<application_classpath>] <application_classpath> 引数はオプションです。これは、ECO.APP ファイルがメソッド・ レベルのトランザクション属性を指定する際に使用します。たとえば、次のようにします。 [Bean1] ... transactionMode_setStrVal=TX_REQUIRES_NEW transactionMode_getStrVal=TX_REQUIRED この setStrVal および getStrVal は、Bean1 のメソッドです。2 番目の引数は、このク ラスをロードする際に、Bean のインプリメンテーション・クラスからメソッド・オブジェ クトを抽出するために使用します。メソッド・オブジェクトは、シリアライズされた Bean 記述子に入れる javax.ejb.ControlDescriptor オブジェクトを作成するために使用し ます。 このユーティリティは、MANIFEST.MF ファイル、アプリケーション用の配置記述子ファイ ルおよび各 Bean ごとに 1 つの配置記述子ファイルを作成します。 たとえば、次のような内容を持つ ECO.APP ファイルを使用します。 [APPLICATION] name=myStack [ServerStack] className=myStack.ServerStack remoteInterface=myStack.ServerStackRemote 配布ファイルの作成 4-3 配置記述子 homeInterface=myStack.ServerStackHome [ServerStack.ENV] initialStackSize=20 このファイルを入力ファイルに使用して eco2ejb を実行すると、次のファイルが作成されま す。 ■ MANIFEST.MF ■ ServerStackDeployment.ser ■ myStackDeployment.ser MANIFEST.MF の内容には、EJB マニフェスト・ファイルの典型的な構造が反映されていま す。 Manifest-Version: 1.0 Name: myStackDeployment.ser OAS-Application: True Application-Name: myStack Name: ServerStackDeployment.ser Enterprise-Bean: True Bean-Name: ServerStack 注意 : Bean の配布 JAR ファイルが作成されると、MANIFEST.MF ファ イルに情報が追加されます。EJB マニフェスト・ファイルの詳細は、4-12 ページの「マニフェスト・ファイル」を参照してください。 Java アプリケーションの作成 Java アプリケーションでは、EJB アプリケーションと各 Bean ごとに 1 つずつ記述子オブ ジェクトを作成する必要があります。 1. 各記述子オブジェクトのメソッドは、EJB アプリケーションと Bean のプロパティを設 定するために実行されます。 2. 各記述子ごとに、各記述子を入れるための出力ファイル・オブジェクトを作成します。 3. 各記述子をシリアライズし、出力ファイルにそれを書き込みます。各記述子オブジェク トは、ObjectOutputStream() を使用してファイルに書き込みます。シリアライズさ れたファイルの拡張子は ".ser" です。 アプリケーション・レベルの配置記述子 アプリケーション・レベルの記述子には、アプリ ケーションについての情報(アプリケーション名など)やアプリケーション内のすべての Bean に有効なデフォルト値などの情報が含まれます。アプリケーション・レベルの配置記 述子は、oracle.oas.ejb.deployment.OASApplicationDescriptor クラスです。こ 4-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配置記述子 のクラスは、javax.ejb.deployment.DeploymentDescriptor クラスを拡張する javax.ejb.deployment.SessionDescriptor クラスを拡張します。 このクラスは、EJB 1.0 仕様の Oracle による拡張です。ご使用のアプリケーションの JAR ファイルに OASApplicationDescriptor オブジェクトを含める必要はありません。した がって、Oracle Application Server 専用ではない標準の EJB JAR ファイルを使用し、これを 変更せずに Oracle Application Server アプリケーションとして配布できます。このような JAR ファイルを配布する場合には、アプリケーションの名前を指定する必要があります。ア プリケーションの JAR に OASApplicationDescriptor オブジェクトを含めるようにする と、配布プロセス中に多数のデフォルト・パラメータを設定できるという利点があります (一部のパラメータはこれ以外の方法では設定できません)。 OASApplicationDescriptor と DeploymentDescriptor の両方からのメソッドが、最 もよく使用されます。次のように OASApplicationDescriptor メソッドを定義します。 これは Oracle Application Server アプリケーション用の Oracle 固有のメソッドです。 public class oracle.oas.ejb.deployment.OASApplicationDescriptor extends javax.ejb.deployment.SessionDescriptor { public boolean getTxEnabled(); public boolean isTxEnabled(); public void setTxEnabled(boolean val); public String getTxDads(); public void setTxDads(String dads); public Name[] getOtherApplications(); public void setOtherApplications(Name[] otherApps); public int getMinInstances(); public void setMinInstances(int val); public int getMaxInstances(); public void setMaxInstances(int val); public String getAuthenticationString(); public void setAuthenticationString(String authStr); } 配布ファイルの作成 4-5 配置記述子 OASApplicationDescriptor(およびこれが継承するクラス)のメソッドを使用して、 アプリケーション内の Bean のデフォルト値を指定します。これらのデフォルト値は、個々 の Bean の配置記述子によってオーバーライドされます。次に、アプリケーションの配置記 述子を設定する際によく使用されるメソッドを説明します。また、Oracle Application Server Manager の GUI を使用して、実行後に値を変更可能かどうかも示します。 表 4-1 アプリケーション記述子のメソッド メソッド 定義 フィールド setBeanHomeName() アプリケーションの名前を 指定します。 Oracle Application Server Manager では変更不可。 setTxEnabled() アプリケーションがトランザ クションを使用可能かどうか を指定します。 Oracle Application Server Manager では変更不可。 setTxDads() トランザクションで使用する 「トランザクション・プロパ データベースを定義します。 ティ」フォームのトランザク ションの DAD setOtherApplications() このアプリケーションから コールされる可能性のある、 関連アプリケーションを指定 します。 setMinInstances() 各アプリケーション・プロセ 「チューニング」フォームの スにつき、OAS が事前に開始 「最小インスタンス数」 する最小アプリケーション・ インスタンス数を設定します。 setMaxInstances() プロセスで使用できる最大 「チューニング」フォームの アプリケーション・インスタ 「最大インスタンス数」 ンス数を設定します。 setAuthenticationString() このアプリケーションに必要 「セキュリティ」フォームの なセキュリティの種類を指定 認証文字列 する認証文字列を設定します。 Oracle Application Server Manager では変更不可。 注意 : 「優先順位」と「最小 / 最大サーバー」パラメータは、GUI でのみ 設定可能です。 Bean レベルの配置記述子 javax.ejb.deployment.SessionDescriptor クラスは、 Bean レベルの配置記述子をインプリメントします。また、Bean がトランザクションをサ ポートするかどうかを定義する javax.ejb.deployment.ControlDescriptor オブジェ クトに情報を追加することもできます。 javax.ejb.deployment.AccessControlEntries オブジェクトはサポートされていま せん。 4-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配置記述子 複数の ControlDescriptor オブジェクトを作成して配列に設定し、 SessionDescriptor に追加することができます。 表 4-2 に、Bean レベルの記述子で使用できるメソッドを示します。 表 4-2 Bean 記述子のメソッドとそれに対応する Oracle Application Server Manager のフィールド クラス / メソッド 説明 フィールド DeploymentDescriptor/ setEnterpriseBeanClassName() Bean のクラスを定義します。 Oracle Application Server Manager では変更不可。 DeploymentDescriptor/ setBeanHomeName() Bean の名前を定義します。 Oracle Application Server Manager では変更不可。 DeploymentDescriptor/ setHomeInterfaceClassName() ホーム・インタフェースの 名前を定義します。 Oracle Application Server Manager では変更不可。 DeploymentDescriptor/ setRemoteInterfaceClassName() リモート・インタフェースの 名前を定義します。 Oracle Application Server Manager では変更不可。 DeploymentDescriptor/ setEnvironmentProperties() Bean の環境プロパティを 設定します。 「Java 環境」フォーム SessionDescriptor/ setSessionTimeout() Bean のタイムアウト値を 設定します。 「Bean パラメータ」フォーム の「タイムアウト(秒)」 SessionDescriptor/ setStateManagementType() Bean が状態を保持するか 保持しないかを設定します。 Oracle Application Server Manager では変更不可。 DeploymentDescriptor/ setReentrant() Bean がリエントラントかど うかを定義します。 n/a ControlDescriptor/ setTransactionAttribute() Bean がトランザクションを使 Oracle Application Server 用可能かどうかを宣言します。 Manager では変更不可。 ControlDescriptor/setMethod ControlDescriptor の影響を受 Oracle Application Server けるメソッドを設定します。 Manager では変更不可。 デフォルトはすべてのメソッ ドです。 DeploymentDescriptor/ setControlDescriptors() SessionDescriptor 内の ControlDescriptors の配列を 設定します。 Oracle Application Server Manager では変更不可。 DeploymentDescriptor/ setAccessControlEntries() SessionDescriptor 内の AccessControlEntries の配列 を設定します。 n/a 配布ファイルの作成 4-7 配置記述子 アプリケーション記述子クラスである OASApplicationDescriptor は、 javax.ejb.deployment.SessionDescriptor のサブクラスである点に注意してくださ い。これにより、アプリケーション・レベルで EJB オブジェクトに共通の値を定義し、オブ ジェクト・レベルでメソッドをコールすることで特定のオブジェクトの値をオーバーライド することが可能になります。 配置記述子の例 次のコード例では 2 つの記述子を作成しています。 ■ アプリケーション記述子 — アプリケーション記述子は StackDemoDeployment.ser とい うファイルに書き込まれます。 ■ Bean 記述子 —Bean 記述子は ServerStackDeployment.ser というファイルに書き込まれ ます。 package myStack; import import import import import import javax.ejb.deployment.*; oracle.oas.ejb.deployment.*; javax.naming.CompositeName; java.util.Properties; java.io.*; java.lang.reflect.*; public class ServerStackDescriptor { public static void main(String[] args) { FileOutputStream fos; ObjectOutputStream oos; //Create the descriptors. The SessionDescriptor can contain //ControlDescriptors and the OASApplicationDescriptor //The OASApplicationDescriptor is Oracle-specific and used to //describe the application. The ControlDescriptor is used in //describing the individual beans. OASApplicationDescriptor ad = new OASApplicationDescriptor(); SessionDescriptor sd = new SessionDescriptor(); ControlDescriptor cd = new ControlDescriptor(); ControlDescriptor cdAll[] = new ControlDescriptor[1]; try { //Set the application name-StackDemo-and general properties //such as whether the application is transaction enabled //and the maximum instances allowed. ad.setBeanHomeName (new CompositeName("StackDemo")); 4-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配置記述子 ad.setTxEnabled(false); ad.setMaxInstances(7); // create an output file object, write it to a file // using ObjectOutputStream fos = new FileOutputStream("StackDemoDeployment.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(ad); oos.flush(); //Create the session descriptor and Properties //for the ServerStack bean. Set the Property for //initial stack size for the ServerStack bean. sd.setEnterpriseBeanClassName("myStack.ServerStack"); Properties p = new Properties(); p.put("initialStackSize", "20"); //Set environment properties within the created Properties object //Designate the remote and home interface names and the bean name. sd.setEnvironmentProperties(p); sd.setRemoteInterfaceClassName("myStack.ServerStackRemote"); sd.setHomeInterfaceClassName("myStack.ServerStackHome"); sd.setBeanHomeName(new CompositeName("ServerStack")); //The control descriptor for the bean defines whether the //bean is transaction enabled. cd.setTransactionAttribute(ControlDescriptor.TX_NOT_SUPPORTED); //All control descriptors need to be declared within a single array //and then set within the SessionDescriptor for the bean. cdAll[0] = cd; sd.setControlDescriptors(cdAll); //Set the session timeout and whether the bean is stateful //or stateless. sd.setSessionTimeout(401); sd.setStateManagementType(sd.STATEFUL_SESSION); //Once all values for the descriptor are set... serialize the //SessionDescriptor (and its enclosed ControlDescriptors) //and write it out to a file. fos = new FileOutputStream("ServerStackDeployment.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(sd); oos.flush(); } catch (Exception e) { e.printStackTrace(); 配布ファイルの作成 4-9 配置記述子 System.exit(1); } } } 配置記述子クラスのリファレンス 次に、javax.ejb.deployment.SessionDescriptor および javax.ejb.deployment.DeploymentDescriptor クラスを示します。Oracle Application Server が現在サポートしていないメソッドについてはコメントを参照してくだ さい。 javax.ejb.deployment.SessionDescriptor public class javax.ejb.deployment.SessionDescriptor extends javax.ejb.deployment.DeploymentDescriptor { public final static int STATEFUL_SESSION; public final static int STATELESS_SESSION; public SessionDescriptor(); public int getStateManagementType(); public void setStateManagementType(int value); public int getSessionTimeout(); public void setSessionTimeout(int value); } javax.ejb.deployment.DeploymentDescriptor public class javax.ejb.deployment.DeploymentDescriptor extends java.lang.Object implements java.io.Serializable { protected int versionNumber; public DeploymentDescriptor(); public String getEnterpriseBeanClassName(); public void setEnterpriseBeanClassName(String value); public Properties getEnvironmentProperties(); public void setEnvironmentProperties(Properties value); public String getHomeInterfaceClassName(); public void setHomeInterfaceClassName(String value); public String getRemoteInterfaceClassName(); public void setRemoteInterfaceClassName(String value); 4-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配置記述子 public Name getBeanHomeName(); public void setBeanHomeName(Name value); public public public public ControlDescriptor[] getControlDescriptors(); ControlDescriptor getControlDescriptors(int index); void setControlDescriptors(ControlDescriptor value[]); void setControlDescriptors(int index, ControlDescriptor value[]); // methods below this line are used only by entity beans; thus, // they are not supported. public boolean getReentrant(); public void setReentrant(boolean value); public boolean isReentrant(); public void setAccessControlEntries(AccessControlEntry values[]); public void setAccessControlEntries(int index, AccessControlEntry values[]); public AccessControlEntry getAccessControlEntries(int index); public AccessControlEntry[] getAccessControlEntries(); } javax.ejb.deployment.ControlDescriptor public class javax.ejb.deployment.ControlDescriptor extends java.lang.Object implements java.io.Serializable { //transaction isolation attributes-currently not supported in OAS EJB public final static int TRANSACTION_READ_COMMITTED; public final static int TRANSACTION_READ_UNCOMMITTED; public final static int TRANSACTION_REPEATABLE_READ; public final static int TRANSACTION_SERIALIZABLE; //transaction attributes public final static int TX_BEAN_MANAGED; public final static int TX_MANDATORY; public final static int TX_NOT_SUPPORTED; public final static int TX_REQUIRED; public final static int TX_REQURIES_NEW; public final static int TX_SUPPORTS; public ControlDescriptor(); public ControlDescriptor(Method method); public int getTransactionAttribute(); public void setTransactionAttribute(int value); //The isolation level is always TRANSACTION_SERIALIZABLE. //It cannot be changed. public int getIsolationLevel(); public void setIsolationLevel(int level); 配布ファイルの作成 4-11 マニフェスト・ファイル public Method getMethod(); public void setMethod(Method value); boolean isMethodLevel(); // methods below this line are unsupported public final static int CLIENT_IDENTITY; public final static int SPECIFIED_IDENTITY; public final static int SYSTEM_IDENTITY; public Identity getRunAsIdentity(); public void setRunAsIdentity(Identity value); public int getRunAsMode(); public void setRunAsMode()(int value); } マニフェスト・ファイル マニフェスト・ファイルは、JAR ファイルを EJB JAR ファイルとして識別するテキスト・ ファイル MANIFEST.MF です。次のセクションを含んだ初期マニフェスト・ファイルを作 成する必要があります。 ■ (オプション)アプリケーションごとに 1 つ ■ (必須)EJB アプリケーション内の各 Bean ごとに 1 つ JAR ユーティリティはこの初期マニフェスト・ファイルに関連情報を追加し、META-INF ディレクトリに変更したマニフェスト・ファイルを配置します。ファイル名とディレクトリ 名には大文字・小文字の区別があります。 各セクションは空白行で区切られています。各セクションには <field>: <value> という形式 の行が 3 行含まれており、次のようになっています。 ■ Name フィールドの値は、Bean またはアプリケーションのシリアライズされた配置記述 子です。 ■ Enterprise-Bean フィールドの値または OAS-Application フィールドの値は True です。 ■ Application-Name フィールドの値はアプリケーションの名前です。Bean-Name フィールドの値は Bean の名前です。この 2 つのフィールドは識別用であり、必要に応 じて編集または削除できます。 次の例では、"ServerStack" という Bean を持つ "myStack" というアプリケーションの、 myStack.MF というマニフェスト・ファイルを示しています。 Manifest-Version: 1.0 Name: myStack/myStack.ser OASApplication: True 4-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド インストール用の JAR ファイルの作成 Application-Name: myStack Name: myStack/ServerStack.ser Enterprise-Bean: True Bean-Name: ServerStack インストール用の JAR ファイルの作成 アプリケーションとそのサポート・ファイルを含んだ JAR ファイルを作成する必要がありま す。このファイルは、Oracle Application Server Manager が EJB アプリケーションを Oracle Application Server 環境にインストールし、登録するために使用されます。 JAR ファイルを作成する前に、次のステップを実行する必要があります。 1. CLASSPATH に正しい Oracle Application Server の JAR ファイルが設定されているこ とを確認してください。EJB オブジェクトをコンパイルして実行するには、開発環境の CLASSPATH に、次の JAR ファイルを 1 つ以上追加する必要があります。 ■ $ORAWEB_HOME/classes/ejbapi.jar — EJB の JAR ファイル ■ (UNIX のみ)$ORACLE_HOME/orb/4.0/classes/yoj.jar — ORB の JAR ファイル のみ) ■ (Windows NT のみ)%ORACLE_HOME%¥orb¥classes¥yoj.jar のみ) 注意 : 現在、NT 環境では一部の環境変数(CLASSPATH、 JAVA_HOME など)の拡張時の長さは 512 バイトに制限されています。 一部のカートリッジや EJB オブジェクトは環境変数を拡張しようとするた め、環境変数の長さは常に 250-300 文字以内にしてください。 2. EJB アプリケーションの .java ファイルを .class ファイルにコンパイルします。 3. EJB の配布情報を含んだ、シリアライズされたオブジェクトを作成します。次の 2 つの メソッドのいずれかを使用して、シリアライズされたオブジェクトを作成できます。 a. 配置記述子の .java ファイルを実行モジュールにコンパイルし、そのモジュールを 実行して EJB 配布情報を含んだ、シリアライズされたオブジェクトを作成します。 b. 配布情報を含んだ ECO.APP ファイルを作成し、eco2ejb ユーティリティを実行しま す。 JAR ファイルに含める必要のあるファイルは次のとおりです。 ■ .java ファイルから生成された .class ファイル。これには、インプリメンテーション、 ホーム・インタフェース、リモート・インタフェースおよび例外クラスのクラス・ファ イルが含まれます。javac コンパイラには -d オプションがあり、これを使用してクラ ス・ファイルの宛先ディレクトリを指定できます。たとえば、クラス・ファイルを /test/Stack/classes ディレクトリに入れるには、次のように入力します。 配布ファイルの作成 4-13 EJB アプリケーションの配布 prompt> javac -d /test/Stack/classes *.java ■ EJB アプリケーションの配置記述子を含んだ、シリアライズされたオブジェクト。 ファイル作成後、すべてのファイルをパッケージ・ディレクトリに置き、次の図に示すよう に JAR ファイル内に配置できるようにしておく必要があります。 図 4-1 JAR ファイルに入れるファイルのディレクトリ構造 Stack classes myStack ServerStack.class ServerStackHome.class ServerStackRemote.class StackException.class MANIFEST.MF ServerStackDeployment.ser myStackDeployment.ser すべてのファイルの準備ができたら、JDK 付属の jar ユーティリティを使用して JAR ファイ ルを生成できます。このユーティリティは、完全なマニフェスト・ファイルを作成するため のベースとして、以前に作成した初期マニフェスト・ファイルを使用します。たとえば、 ファイルが myStack というディレクトリに存在する場合、次のコマンドを実行します。 prompt> jar cmf myStack.MF myStack.jar myStack *.ser myStack.jar を解凍して META-INF/MANIFEST.MF ファイルの内容を見ると、jar ユーティ リティによって初期マニフェスト・ファイル myStack.MF が拡張され、正しく定義された JAR ファイルに必要な残りの情報がすべて含まれていることがわかります。 EJB アプリケーションの配布 Oracle Application Server で EJB アプリケーションを配布するには、Oracle Application Server Manager を使用します。指定する必要のある情報は、アプリケーションのファイルが 含まれている JAR ファイルの場所と名前のみです。JAR ファイルに OASApplicationDescriptor オブジェクトが含まれていない場合、アプリケーションの 名前も指定する必要があります。このような場合には JAR ファイルから名前を読み込めない ためです。プライマリ・ノードにのみ配布するか、またはすべてのノードに配布するかを決 4-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド EJB アプリケーションの配布 める必要もあります。EJB アプリケーションの配布方法の詳細は、『Oracle Application Server 管理者ガイド』の第 8 章「アプリケーションの管理」を参照してください。 JAR ファイルをインストールすると、Oracle Application Server Manager は、その JAR ファ イルを使用して次のステップを実行します。 ■ JAR からマニフェスト・ファイルを読み込み、オブジェクトのリストとそのリモートお よびホーム・インタフェースを探す。 ■ リモート・インタフェースとホーム・インタフェースに基づいて IDL ファイル、スタブ およびスケルトンを生成する。 IDL ファイル OASCLIENTInterfaces.idl は、IDL ベースのクライアントをコンパイル するために使用します。このファイルは、次のディレクトリに存在します。 $ORACLE_HOME/ows/apps/ejb/<appName> 注意 : <appName> が複合 JNDI 名の場合、サブディレクトリ階層が作成 されます。たとえば、"corp/bank/branch" という名前のアプリケーショ ンのファイルは $ORACLE_HOME/ows/apps/ejb/corp/bank/branch とい う名前のディレクトリに置かれます。 ■ 生成されたコードをコンパイルする。 ■ アプリケーションの登録に使用する登録ファイルを、Oracle Application Server の設定 ファイル内に生成する。 ■ $ORAWEB_HOME/../apps/ejb/<appName>/_server.jar を生成する。このファイルはア プリケーションの CLASSPATH 環境変数に追加されます。 ■ $ORAWEB_HOME/../apps/ejb/<appName>/_client.jar を生成する。 注意 : 生成されたこれらのファイルのうち 2 つは、クライアントが使用 します。 ■ $ORAWEB_HOME/../apps/ejb/<appName>/_client.jar ファイルは、 クライアントのクラスパスに配置する必要があります。 ■ $ORAWEB_HOME/../apps/ejb/<appName>/ OASClientInterfaces.idl ファイルは、サーバーにアクセスできるよう に CORBA ベースのクライアントをコンパイルする際に使用します。 ナビゲーション・ツリーの「アプリケーション」の下に、追加したアプリケーションが表示 されているはずです。 EJB オブジェクトのコードを変更する場合は、生成されたファイルが更新されるようにアプ リケーションを再配布する必要があります。Oracle Application Server Manager は既存の 配布ファイルの作成 4-15 EJB アプリケーションの設定 ファイルを上書きします。EJB アプリケーションを再配布する方法は、4-21 ページの「アプ リケーションの再配布とリロード」を参照してください。 注意 : oasdeploy を使用してアプリケーションの配布または再配布を行 うことも可能です。これは、EJB および ECO アプリケーションをプライ マリ・ノードまたはリモート・ノード上に配布するためのユーティリティ です。このユーティリティでは、サイト上のすべてのノードにアプリケー ションを配布することもできます。第 8 章「oasdeploy を使用したアプリ ケーションの配布」を参照してください。 EJB アプリケーションの設定 アプリケーションをインストールした後に、必要に応じて一部の設定パラメータの値を変更 できます。実行後に GUI から変更可能なパラメータについては、表 4-1 および表 4-2 を参照 してください。パラメータを変更した場合、アプリケーションをリロードして変更内容を有 効にする必要があります。EJB アプリケーションのリロード方法は、4-21 ページの「アプリ ケーションの再配布とリロード」を参照してください。 Oracle Application Server Manager を使用して、EJB アプリケーションを設定します。EJB アプリケーションの設定パラメータは、次の 3 つのレベルに分かれています。 ■ サーバー・レベルのパラメータ ■ アプリケーション・インスタンスのパラメータ ■ Bean レベルのパラメータ これらのパラメータの完全な説明は、4-18 ページの「パラメータの詳細」を参照してくださ い。 サーバー・レベルのパラメータ 次の表に、サーバー・レベルのパラメータを示します。 表 4-3 サーバー・レベルのパラメータ 設定する内容 使用するパラメータ フォーム アプリケーションの優先順位 優先順位 サーバー 標準 環境変数 Oracle Application Server による設定 ロギング オン Java 環境 配置記述子の setEnvironmentProperties() Java 仮想マシンの環境変数 環境変数 ロギング・パラメータ アプリケーションの名前と値のペア n/a デフォルト 4-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド EJB アプリケーションの設定 表 4-3 サーバー・レベルのパラメータ(続き) サーバー・レベルのパラメータ(続き) 設定する内容 使用するパラメータ アプリケーションのトランザクション・ トランザクション サービスを使用可能にする アプリケーションが使用する トランザクションの DAD トランザクションの DAD フォーム デフォルト Tx プロパティ 配置記述子の setTxEnabled() Tx プロパティ 配置記述子の setTxDads() アプリケーション・インスタンスのパラメータ 次の表に、アプリケーション・インスタンスのパラメータを示します。 表 4-4 アプリケーション・インスタンスのパラメータ 設定する内容 使用するパラメータ フォーム デフォルト アプリケーション・インスタンスの タイムアウト期間 タイムアウト インスタンスの パラメータ 配置記述子の setSessionTimeout() アプリケーション・インスタンスの 最小数と最大数 最小インスタンス数 / 最大インスタンス数 チューニング 配置記述子の setMinInstances() と setMaxInstances() アプリケーションの認証文字列 認証文字列 セキュリティ 配置記述子の setAuthenticationString() オブジェクトの名前と値のペア n/a オブジェクト 環境 配置記述子の setEnvironmentProperties() Bean レベルのパラメータ 次の表に、アプリケーション内のすべての Bean に適用されるパラメータを示します。 表 4-5 Bean レベルのパラメータ 設定する内容 使用するパラメータ フォーム デフォルト Bean の名前と値のペア n/a Java 環境 配置記述子の setEnvironmentProperties() Bean のタイムアウト タイムアウト Bean パラメータ 配置記述子の setSessionTimeout() 配布ファイルの作成 4-17 EJB アプリケーションの設定 パラメータの詳細 優先順位(サーバー・レベル) このパラメータは、アプリケーションが配布されるアプリケーション・サーバー・サイトに 関するアプリケーションの優先順位を設定します。これは、パフォーマンス・チューニン グ・パラメータです。アプリケーションのプロセス、スレッドおよびインスタンスの数は、 そのアプリケーションとコンポーネントのリクエスト・ロードと優先順位レベルに基づいて 自動的に決定されます。詳細は、 『Oracle Application Server パフォーマンス・チューニン グ・ガイド』を参照してください。 パフォーマンスは、アプリケーション・インスタンスに指定された最大値と最小値に基づい てチューニングする( 「最大 / 最小ベースのチューニング」と呼ばれる)こともできます (4-20 ページの「最小インスタンス数と最大インスタンス数(アプリケーション・レベル) 」 を参照してください) 。 ECO.APP ファイルを使用してアプリケーションを配布する場合は、アプリケーション・イ ンスタンスの最小数と最大数しか指定できません。デフォルト値は「標準」です。 環境変数(サーバー・レベル) このフォームでは、Java 仮想マシンのプロセスが使用する環境変数の値を定義します。事前 定義済みの環境変数の値を削除しないでください。ただし、自分の環境変数を定義したり、 事前定義済みの変数に値を追加することは可能です。 4-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド EJB アプリケーションの設定 表 4-6 環境変数 変数 説明 CLASSPATH オブジェクトのクラス・ファイルが入っているディレクトリまた は JAR ファイルのリスト。たとえば、次のようになります。 %ORAWEB_HOME%¥..¥apps¥ejb¥brokerage¥brokerage.jar CLASSPATH はアプリケーションのインストール時に、JAR ファ イル内の実行されるクラスすべてと、その他のサポートされるク ラスにアクセスできるように設定されます。 UNIX プラットフォームでは、CLASSPATH のディレクトリと JAR ファイルはコロンで区切られます。たとえば、 file1.jar:file2.jar などです。 Microsoft Windows NT では、CLASSPATH のディレクトリと JAR ファイルはセミコロンで区切られます。たとえば、 file1.jar;file2.jar などです。 PATH LD_LIBRARY_PATH JAVA_HOME THREADS_FLAG 実行モジュールが入っているディレクトリのリスト(UNIX では コロン区切り、NT ではセミコロン区切り) 。これは %ORAWEB_HOME%¥jdk¥bin を含むように設定する必要があ ります。 (UNIX のみ)バイナリ・ライブラリが入っているディレクトリ のコロン区切りのリスト。 Java がインストールされる最上位のディレクトリ。これは %ORAWEB_HOME%¥jdk に設定する必要があります。 (UNIX のみ)Java 仮想マシンがネイティブのスレッドを使用す るかどうか。これは "native" に設定されます。この値は必須で す。 ロギング・パラメータ(サーバー・レベル) ロギングを使用可能または使用禁止にできます。使用可能の場合、このアプリケーションの ログ・メッセージが書き込まれるディレクトリとファイルを指定できます。また、詳細レベ ル(0 から 15)を指定できます。値が低いほど重大な問題を示します。高い数値を指定する と、その詳細レベルまでのメッセージをすべて書き込むため、ログに出力されるメッセージ 数が多くなります。たとえば、詳細レベルを 3 に設定した場合、Logger は詳細レベルが 0、 1、2 および 3 のメッセージのログを出力します。 Oracle Application Server のすべてのコンポーネントが、同じ方法で詳細レベルの値を使用 します。詳細レベルの詳細は、 『Oracle Application Server 管理者ガイド』を参照してくださ い。 ロギングのデフォルト設定では、システム・ロギングと同じ値が使用されます。 配布ファイルの作成 4-19 EJB アプリケーションの設定 Java 環境(サーバー・レベル) このフォームにより、アプリケーション全体に名前と値のペアを指定できます。名前と値の ペアがオブジェクトのみから参照できるようにする場合は、 「Java 環境(オブジェクト・レ ベル) 」フォームを使用してください。 これらの名前と値のペアは、アプリケーションのインストール時に配置記述子から読み込ま れます。 トランザクション優先順位(サーバー・レベル) アプリケーションは、使用可能または使用禁止に設定できます。使用可能に設定した場合、 トランザクションの DAD をアプリケーションに指定できます。詳細は、第 6 章「EJB オブ ジェクトのトランザクション」を参照してください。 タイムアウト(アプリケーション・レベル) アプリケーション・インスタンスが指定した期間アイドルになっている場合(活動中のオブ ジェクトがなく、ホーム・インタフェースがすべてアイドルの場合) 、Oracle Application Server は、クライアントとアプリケーション・インスタンス間の接続を処理できます。タイ ムアウトは秒単位で指定し、そのデフォルト値は 3600(1 時間)です。接続を切断すると、 Oracle Application Server はアプリケーション・インスタンスを使用して他のクライアント の処理を行うか、またはインスタンスを破棄できます。 最小インスタンス数と最大インスタンス数(アプリケーション・レベ ル) Java 仮想マシンが起動されると、指定した最小数分のアプリケーション・インスタンスが作 成されます。クライアント数が最小数を超えると、Java 仮想マシンは、最小数 / 最大数設定 で指定された最大数に達するまでアプリケーション・インスタンスを作成します。これは、 優先順位をベースにしたチューニング(この項で前述したもう一方のチューニング・モー ド)とは対照的です。 認証文字列(アプリケーション・レベル) 認証サーバー方式を使用してアプリケーションを保護するには、アプリケーションに認証文 字列を割り当てます。認証文字列の形式は次のとおりです。 <scheme>(<realm>) [ {"|" | "&"} & <scheme>(<realm>) ... ] 詳細は、 『Oracle Application Server セキュリティ・ガイド』の「IIOP ベースのアプリケー ションのセキュリティ」を参照してください。 4-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド アプリケーションの再配布とリロード Java 環境(オブジェクト・レベル) このフォームにより、オブジェクトに名前と値のペアを指定できます。名前と値のペアをア プリケーション全体から参照可能にするためには、 「Java 環境(サーバー・レベル)」フォー ムを使用してください。これらの名前と値のペアは、アプリケーションのインストール時に 配置記述子から読み込まれます。 タイムアウト(オブジェクト・レベル) オブジェクト・インスタンスが指定した期間アイドルになっている場合(指定した期間、ク ライアントがリクエストを発行していない場合) 、Oracle Application Server は、クライアン トとオブジェクト・インスタンス間の接続を処理できます。タイムアウトは秒で指定しま す。デフォルト値は 0 で、アプリケーション・インスタンスに指定したものと同じタイムア ウト値です。 アプリケーションの再配布とリロード EJB アプリケーションの再配布 アプリケーションを変更した場合、Oracle Application Server Manager または第 8 章で説明 した oasdeploy ユーティリティを使用してアプリケーションを再配布する必要があります。 アプリケーションを再配布するには、次のステップを実行します。 1. 再配布を要する EJB アプリケーションの実行中のプロセスを停止します。 2. 最初に配布したときと同じ方法でアプリケーションを再配布します。今回は、アプリ ケーションを再配布する際に「強制」オプションを選択します。 3. Oracle Application Server Manager で「すべて」を選択し、 「リロード」アイコン をクリックします。これにより、Oracle Application Server の該当コンポーネン トに通知されます。Oracle Application Server を再起動する必要はありません。 注意 : コマンド・ラインを使用してアプリケーションを配布または再配 布するには、oasdeploy ユーティリティを使用する必要があります。第 8 章「oasdeploy を使用したアプリケーションの配布」を参照してください。 配布ファイルの作成 4-21 パフォーマンスの改善 EJB アプリケーションのリロード Oracle Application Server Manager を使用してアプリケーションの設定を変更した場合、設 定データをリロードする必要があります。アプリケーションを再配布する必要はありませ ん。 設定データをリロードするには、Oracle Application ServerManager で「すべて」を選択し、 「リロード」アイコン をクリックします。これにより、Oracle Application Server の該 当コンポーネントに通知されます。Oracle Application Server を再起動する必要はありませ ん。 パフォーマンスの改善 この項では、EJB アプリケーションのパフォーマンスを改善する方法について説明します。 Just-In-Time コンパイラ 複数のプラットフォーム間での移植性を維持するために、Java では、Java プログラムをバイ トコードにコンパイルするインタプリタを使用しています。バイトコードは Java 仮想マシ ンに対する命令です。それぞれのプラットフォームはソフトウェアで仮想マシンをインプリ メントしています。仮想マシンは、Java プログラムの実行時に仮想マシン命令を解析しま す。このため、Java プログラムのコンパイル済みバイトコードは、特定のプラットフォーム に依存することなく、どのマシン上でも実行できます。 通常、Java プログラムは、ネイティブ・マシン命令にコンパイルされた同じプログラムより も、実行の速度は遅くなります。つまり、移植性を確保するためにパフォーマンスが犠牲に なっています。 バイトコードは、ハードウェア・プラットフォームのネイティブ・マシン命令にコンパイル することが可能です。このようにすると、同じコードのセットをより高速に実行できます。 高速化によるデメリットは、命令のコンパイルに費やされる時間です。 このコンパイルは、Java プログラムが実行される直前に行われるため、Just-In-Time(JIT) コンパイルと呼ばれています。コンパイルは 1 回だけ必要で、再コンパイルされた命令は何 回でも使用できます。多くの JIT コンパイラは、最初に対応する Java メソッドが実行された 後に 1 回だけ仮想マシンの命令を再コンパイルし、それらの命令は終了するまでキャッシュ に入れられます。Java インタプリタには標準インタフェースが定義されているため、どの JIT コンパイラでもプラグインできるようになっています。 次の図に、EJB オブジェクトで JIT コンパイラがどのように動作するかを示します。 4-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド パフォーマンスの改善 図 4-2 Just-In-Time コンパイル foo.class バイトコード EJB サーバー バイトコード JIT コンパイラ キャッシュされた バイトコード ネイティブ・マシン命令 マシン名 JIT コンパイラを使用禁止にする Oracle Application Server には、デフォルトで JIT コンパイラが含まれており、Oracle Application Server 環境で使用できます。JIT コンパイラを使用禁止にする場合は、次のス テップを実行します。 1. 2. Oracle Application Server Manager で、EJB アプリケーションの「環境変数」フォーム (図 4-3)を表示します。 JAVA_COMPILER 環境変数を「NONE」に設定します。 注意 : JIT コンパイル済みのコードでは、例外スタックの出力時に行番号 情報が出力されません。アプリケーションをデバッグする場合、JIT コン パイラを使用禁止にすると、コードの問題点をトレースできます。 図 4-3 「環境変数」フォーム 配布ファイルの作成 4-23 EJB アプリケーションのデバッグ アプリケーション・インスタンスのパフォーマンス設定の設定 Java 仮想マシンの起動などのハウスキーピング・タスクがリクエストの着信前に行われる と、アプリケーションのパフォーマンスが改善します。これにより、Oracle Application Server はより高速にリクエストを処理できます。 アプリケーションに対する最初のリクエストは、後続のリクエストよりも時間がかかる場合 があります。これは Oracle Application Server が、アプリケーション・インスタンスの最初 のリクエストを受け取ったときにのみ Java 仮想マシンを起動するためです。後続のリクエ ストは、すでに実行中の仮想マシンによって処理されます。 次のステップを実行することにより、このようなパフォーマンス・ヒットを回避できます。 ■ 初期起動サーバーまたはアプリケーション・インスタンスの最小数を 0 より大きな値に 設定します。これにより、Oracle Application Server はアプリケーション実行時に、指 定された数のサーバー・プロセスまたはアプリケーション・インスタンスを使用して Java 仮想マシンを起動します。 両方のモードの詳細は、 『Oracle Application Server パフォーマンス・チューニング・ガイ ド』を参照してください。 EJB アプリケーションのデバッグ EJB アプリケーションは、Oracle Application Server の本番プラットフォームでデバッグす る前に、可能な限り開発プラットフォームでデバッグしてください。開発プラットフォーム 上(たとえば、Oracle JDeveloper などの Java IDE)でのデバッグは、制御された環境で行 う方が簡単です。 Oracle JDeveloper は、他の IDE に比べて、Oracle Application Server とより緊密に統合され ています。利点の1つとして、EJB オブジェクトのローカル・デバッグ機能があります。詳 細は Oracle JDeveloper のドキュメントを参照してください。 EJB オブジェクトを開発プラットフォームでテストしてデバッグした後、Oracle Application Server で実行し、テストします。Oracle Application Server には、ロギング・メッセージの 形式のデバッグ機能があります。リモート・デバッグ(別の Java 仮想マシンからデバッグ する)はできません。 Logger クラス oracle.oas.ejb.Logger クラスを使用すると、EJB オブジェクトは、Oracle Application Server の Logger サービスにアクセスできます。Logger サービスは、ファイルやデータベースに メッセージを書き込むことができます。Logger オブジェクトを取得するには、JNDI に URL 接頭辞 "oas_service:logger" を付けて使用します。 4-24 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド EJB アプリケーションのデバッグ ログ・ファイル EJB オブジェクトは、Oracle Application Server に使用されるログ・ファイルまたは別のロ グ・ファイルにメッセージを書き込むことができます。 ■ Oracle Application Server のログ・ファイルにメッセージを書き込む場合は、何もする 必要はありません。ロギング・サービスはデフォルトで、 「システム」フォームの「ロ グ・ディレクトリ」と「ログ・ファイル」フィールドで定義されたログ・ファイルに メッセージを書き込みます。Oracle Application Server Manager でこのフォームを表示 するには、 「website40 サイト」/「Oracle Application Server」/「ロギング」/「シス テム」をクリックします。 ■ EJB アプリケーション専用のログ・ファイルにメッセージを書き込む場合、「ロギング」 フォームでログ・ファイルを指定します。Oracle Application Server Manager でこの フォームを表示するには、 「website40 サイト」/「アプリケーション」/「< アプリケー ション名 >」/「設定」/「ロギング」をクリックします。このフォームで指定されたロ グ・ファイルは、このアプリケーションのオブジェクトにのみ使用されます。 詳細は、 『Oracle Application Server 管理者ガイド』の第 10 章「ロギング・ユーティリティ とデータベース・ユーティリティ」を参照してください。 詳細レベル Logger クラスは、メッセージが詳細レベル以下の場合のみ、そのメッセージを書き込みま す。たとえば、Oracle Application Server の詳細レベルを 7 に設定した場合、詳細レベルが 7 以下のメッセージのみログに書き込まれます。 Oracle Application Server 全体の詳細レベルは、 「システム」フォームの「詳細レベル」フィール ドで設定します。Oracle Application Server Manager でこのフォームを表示するには、 「website40 サイト」/「Oracle Application Server」/「ロギング」/「システム」をクリックします。 Oracle Application Server の詳細レベルは、個々のアプリケーションごとにオーバーライド できます。特定のアプリケーションからのみ、より多くのメッセージを書き出す場合、これ が必要になることがあります。たとえば、Oracle Application Server 全体の詳細レベルを 1 などの低い値に設定し、一方でデバッグ中のアプリケーションの詳細レベルを 10 などの高 い値に設定できます。 詳細レベルをオーバーライドするには、EJB アプリケーションの「ロギング」フォームを使 用します。このフォームにアクセスするには、 「website40 サイト」/「アプリケーション」/ 「< アプリケーション名 >」/「設定」/「ロギング」をクリックしてください。 メッセージの詳細レベルを設定するには、oracle.oas.ejb.Logger インスタンスの setSeverity() メソッドをコールします。その後、setSeverity() メソッドを再度コールして詳細 レベルを変更するまでは、この EJB オブジェクト・インスタンスから送信されたすべてのメッ セージに、この詳細レベルが設定されます。現行の詳細レベルは、getSeverity() をコールする ことによって調べます。デフォルトの詳細レベルは Logger.LOG_SEVERITY_DEBUG です。 3-10 ページの例では、Logger オブジェクトを取得し、詳細レベルを設定し、メッセージを 作成しています。 配布ファイルの作成 4-25 EJB アプリケーションのデバッグ ロギング・モード Logger はメッセージが発生するたびに書き込むことも、メッセージを収集してバッチ・ モードで書き込むこともできます。バッチ・モードは、非バッチ・モードのように Logger が何度もログ・ファイルにアクセスする必要がないため、より効率的です。ただし、バッ チ・モードの場合、システムに障害が起こると、ログ・ファイルへの書込みを待っている Logger メッセージが書き出されないことがあります。また、アプリケーションのデバッグ 中にバッチ・モードをオフにすると、ログ・ファイルのメッセージをほとんど同時に参照で きます。 バッチ・モードは、 「Oracle Application Server」ブランチの「ロギング」フォームで設定し ます。 図 4-4 「ロギング」フォーム 4-26 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 5 EJB アプリケーションのクライアントの開発 この章では、EJB アプリケーションのクライアントを作成する方法を説明します。クライア ントは、Bean のメソッドを実行する前に、Bean のオブジェクト・リファレンスを取得する 必要があります。リファレンスを取得する方法は、クライアントのタイプによって異なりま す(たとえば、オブジェクト・リファレンスを取得するための要件は、スタンドアロン・ク ライアントとアプレット・クライアントとでは異なります) 。これらの違いは、この章で説 明します。 注意 : 現在、Enterprise JavaBeans は、Java クライアントからのみ使用さ れるように定義されています。これは、値によるオブジェクトの受渡し方 式で渡されるパラメータのサポート要件のためです。アプリケーションに Java 以外のクライアントからアクセスする必要がある場合、Oracle Application Server の ECO/Java コンポーネント・モデルを使用してアプ リケーションを開発、実行することをお薦めします。 内容 ■ 概要 ■ Bean のオブジェクト・リファレンスの取得 ■ オブジェクトに対するメソッドの実行 ■ オブジェクトの破棄 ■ JNDI がサポートする機能 ■ クライアントに必要なファイル ■ APPLET タグ ■ JNDI プロバイダのパフォーマンス機能 EJB アプリケーションのクライアントの開発 5-1 概要 概要 EJB アプリケーションのクライアントには次のものを使用できます。 ■ Java アプリケーション ■ ブラウザで動作する Java アプレット ■ 同じまたは他の EJB アプリケーションの Bean ■ JServlet カートリッジ EJB アプリケーションとその Bean は CORBA オブジェクトで、Oracle Application Server の ORB に登録されます。これらのオブジェクトにアクセスするには、クライアントは HTTP のかわりに Internet Inter-ORB Protocol(IIOP)を使用します。EJB アプリケーションにアク セスするには、クライアントにクライアント側の ORB が必要です。クライアントが Java ア プレットの場合、互換性のある ORB をブラウザで使用したり、純粋な Java ORB をアプレッ トの一部としてダウンロードできます。 EJB アプリケーションの実行方法は、HTTP ベースの Oracle Application Server アプリケー ションの場合とは異なります。クライアントは Bean のホーム・インタフェースのオブジェ クト・リファレンスを取得する必要があります。これを使用して、クライアントは Bean の メソッドを実行するための EJB オブジェクトを作成できます。クライアントは、JNDI(Java Naming and Directory Interface)を使用してオブジェクト・リファレンスを取得します。ク ライアントは Bean インスタンスの使用を終了すると、remove() メソッドをコールしてそ れを破棄します。 クライアントがアプリケーション・インスタンス内のホーム・インタフェースにアクセスす る必要がない場合、またはクライアント・プロセスの終了時に、クライアントは、このアプ リケーション・インスタンスの再使用を確実にするために初期 JNDI コンテキストから close() をコールします。 プロセスの概要は次のとおりです。 1. Bean のホーム・インタフェースのオブジェクト・リファレンスを取得します。 2. ホーム・インタフェースの create() を実行します。これにより、Bean のインスタン スが EJB オブジェクトとして生成されます。 3. EJB オブジェクトでリモート・インタフェース・メソッドを実行します。 4. EJB オブジェクトが不要になったら、remove() を実行して破棄します。 5. アプリケーション・インスタンスが不要になったら、JNDI 初期コンテキストから close() をコールします。 オブジェクト・メソッドは他の EJB オブジェクトやその他の RMI 互換の非リモート値を返 すことができ、クライアントはユーザーに戻り値を表示する方法を自由に決定できます。た とえば、あるクライアントは単に値をテキスト・エリアに表示し、別のクライアントはそれ をチャートの中にグラフィックで表示するということが可能です。 5-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Bean のオブジェクト・リファレンスの取得 Bean のオブジェクト・リファレンスの取得 クライアントは、Bean に対してメソッドを実行する前に、まず Bean のホーム・インタ フェースのリファレンスを取得し、そのホーム・インタフェースに対して create メソッド を実行する必要があります。これを行う場合、クライアントは、JNDI(Java Naming and Directory Interface)を使用します。JNDI は、リクエストの参照を処理するためのネーム・ サーバーを提供します。 Oracle Application Server の JNDI JNDI(Java Naming and Directory Interface)は、JavaSoft によって定義された一連の API で構成されています。この API は、基盤となるディレクトリ・サーバーから独立した、ディ レクトリ・サービスやネーム・サービスを提供します。JNDI は、JNDI API と JNDI SPI で 構成されています。 ■ JNDI API—Java アプリケーションが様々なディレクトリ・サービスにアクセスできるよ うにするためのクライアント API。 ■ JNDI SPI— サービス・プロバイダがネーム・サーバーまたはディレクトリ・サーバーの インプリメンテーションをプラグインできるようにするためのインタフェース。 Oracle Application Server には、JNDI ネーム・サーバー SPI が付属しています。JNDI ネー ム・サーバー SPI により、JNDI クライアントは、EJB および ECO/Java ホーム・インタ フェースのオブジェクト・リファレンスを取得できるようになります。 JNDI の詳細な情報については、JavaSoft の Web サイト(http://www.javasoft.com)を参照 してください。 名前領域の操作 クライアントはサーバーに名前を提供し、その名前がコンポーネントとして解析されるとオ ブジェクト・リファレンスを返します。名前は特定のコンテキストに対する相対名です。初 期コンテキストまたは取り出した相対コンテキストに対して相対的な名前を参照できます。 JNDI を使用してホーム・インタフェースへのオブジェクト・リファレンスを取得する際、 クライアントは次のステップを実行します。 1. 初期コンテキスト・ファクトリ・プロパティを設定します。 2. 初期コンテキストを取得します。 3. Bean、あるいは複数の Bean の取出し元の相対コンテキストを識別する文字列または JNDI の複合名を指定します。 Oracle Application Server の JNDI 名前領域は、階層型の名前領域です。これは、URL プロトコルの "oas:" の接頭辞を使用して定義されます。"oas:" 接頭辞に続く名前は、ホ スト、アプリケーションおよび配置記述子で定義されている Bean 名の組合せです。 EJB アプリケーションのクライアントの開発 5-3 Bean のオブジェクト・リファレンスの取得 アプリケーション・ タイプ JNDI URL ネーミング・プロトコル 4. アプリケーション オブジェクトは oas://<hostname>[:<port>]/<application_name>/ <bean_name> によって識別されます。 アプレット オブジェクトは oas:///<application_name>/<bean_name> によって 識別されます。 初期コンテキスト(または相対コンテキスト)から lookup() を実行して、オブジェク ト・リファレンスへの名前解決を行います。名前領域は、クライアントには読込み専用 である点に注意してください。 初期コンテキストから lookup を実行して、相対コンテキストを取り出すことができま す。その後、異なる JNDI 名の相対コンテキストから複数の lookup を実行できます。 JNDI オブジェクト名は、文字列識別子または名前オブジェクトとして lookup メソッド に渡すことができます。 a. 文字列識別子 : 文字列には EJB アプリケーション名と Bean のホーム・インタ フェース名が含まれます。アプリケーション名とホーム・インタフェース名は、 "/" で区切られた階層名です。ホーム・インタフェースのフルネームは、アプリ ケーション名とホーム・インタフェース名を "/" で区切って組み合せたものです。 <application name>/<bean’s home interface name> アプリケーション名とホーム・インタフェース名は Enterprise Bean がシリアライ ズした配置記述子で定義されます。アプリケーション名は、oracle.oas.ejb. deployment.OASApplicationDescriptor.setBeanHomeName() メソッドを 使用して指定します。Bean のホーム・インタフェース名は、javax.ejb. deployment.DeploymentDescriptor.setHomeInterfaceName() を使用して 指定します。配布情報の詳細は、第 4 章「配布ファイルの作成」を参照してくださ い。 b. JNDI 複合名 : JNDI オブジェクト名に "oas:" を付けて CompoundName オブジェク トを作成できます。 保護されているリスナーのリファレンスの解決 保護されていないリスナーでは、JNDI の lookup は次のようにして実行されます。 String siteContext = "oas://host:port"; Context site = (Context) ( (new InitialContext(env)).lookup(siteContext) ); ただし、JNDI は保護されているリスナーに対する lookup は実行できません。前述の例で、 保護されているリスナーがポートを占有している場合、lookup は失敗します。開発者は、 https 接続を必要としないポートに対して lookup を実行する必要があります。 5-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Bean のオブジェクト・リファレンスの取得 Admin リスナー(デフォルトではポート 8889)は、保護されていないリスナーであるため、 lookup に使用できます。たとえば、次のようにします。 String siteContext = "oas://host:8889"; Context site = (Context) ( (new InitialContext(env)).lookup(siteContext) ); クライアントからのネーム・サーバーへのアクセス クライアントはネーム・サーバーを初期化し、このサーバーから初期コンテキストを取り出 します。この後の項では、各タイプのクライアントがどのように初期化および抽出プロセス を実行するかを説明します。 ■ Java アプリケーション・クライアント ■ Java アプレット・クライアント ■ Enterprise JavaBean および JServlet クライアント Java アプリケーション・クライアント クライアントは、次のステップを実行します。 1. Hashtable 型の環境変数を指定してネーム・サーバーを初期化します。この Hashtable は、ネーム・サーバーが入った Java パッケージです。 javax.naming.Context.INITIAL_CONTEXT_FACTORY プロパティには、初期コン テキスト・ファクトリ・クラスの "oracle.oas.naming.jndi.RemoteInitCtxFactory" を指定する必要がありま す。 Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi.RemoteInitCtxFactory"); 2. 初期コンテキストを取得します。初期コンテキストを取り出すには 2 つの方法がありま す。 a. 環境変数内で JNDI パッケージに InitialContext コンストラクタを指定します。 javax.naming.Context initialContext = new InitialContext(env); b. コマンド行からシステム・プロパティ内の JNDI パッケージを設定します。java コ マンドの -D オプションを使用してシステム・プロパティを定義します。 prompt> java -Dorg.omg.CORBA.ORBClass=oracle.oas.orb.CORBA.ORB -Dorg.omg.CORBA.ORBSingletonClass=oracle.oas.orb.CORBA.ORB -Djava.naming.factory.initial= oracle.oas.naming.jndi.RemoteInitCtxFactory myClientApp EJB アプリケーションのクライアントの開発 5-5 Bean のオブジェクト・リファレンスの取得 コード内では、InitialContext を作成する必要がありますが、パラメータとして環 境変数を設定する必要はありません。 javax.naming.Context initialContext = new InitialContext(); 便宜上、Oracle Application Server には、次のシステム・プロパティを持つ java 実 行モジュールを実行する ooj という名前のスクリプトが含まれています。 org.omg.CORBA.ORBClass = oracle.oas.orb.CORBA.ORB org.omg.CORBA.ORBSingletonClass = oracle.oas.orb.CORBA.ORB ooj を使用して前述のコマンドを実行するには、次のコードを使用します。 prompt> ooj -Djava.naming.factory.initial= oracle.oas.naming.jndi.RemoteInitCtxFactory myClientApp Java アプレット・クライアント クライアントは、次のステップを実行します。 1. 次の 2 つのプロパティを指定して、ネーム・サーバーを初期化します。 a. oracle.oas.naming.jndi.appletinstance プロパティ。プロパティの値は、 アプレット・インスタンスの Java.lang.Applet オブジェクトです。 b. ネーム・サーバーを含んだ Java パッケージ。 javax.naming.Context.INITIAL_CONTEXT_FACTORY プロパティには、初期 コンテキスト・ファクトリ・クラスの "oracle.oas.naming.jndi.RemoteInitCtxFactory" を指定する必要があり ます。環境変数のタイプは、Hashtable です。 // code in the applet Hashtable env = new Hashtable(); // "this" refers to the applet env.put("oracle.oas.naming.jndi.appletinstance", this); env.put(Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi.RemoteInitCtxFactory"); 2. 初期コンテキストを取得します。環境変数内で JNDI パッケージに InitialContext コンストラクタに設定することにより、初期コンテキストを取り出すことができます。 Context initialContext = new InitialContext(env); 5-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Bean のオブジェクト・リファレンスの取得 3. アプレットを起動する HTML ファイルで、次の名前と値のペアをアプレットのパラ メータとして宣言します。 org.omg.CORBA.ORBClass = oracle.oas.orb.CORBA.ORB org.omg.CORBA.ORBSingletonClass = oracle.oas.orb.CORBA.ORB アプレットの起動に関する詳細は、5-16 ページの「APPLET タグ」を参照してくださ い。 クライアントのブラウザが Java 1.2 をサポートしていない場合、クライアントのブラウザに サン・マイクロシステムズ社の Java 1.2 プラグインをインストールしてください。プラグイ ンとインストール手順については、次のサイトを参照してください。 http://java.sun.com Enterprise JavaBean および JServlet クライアント Bean のクライアントが別の Bean または JServlet アプリケーションである場合、 InitialContext コンストラクタには、 javax.naming.Context.INITIAL_CONTEXT_FACTORY プロパティを設定するような環 境を含めないようにしてください。このタイプのクライアントの場合、このプロパティは Oracle Application Server によって事前に JVM に設定されます。引数なしで初期コンテキス トを取得できます。 // get the initial context without specifying an environment javax.naming.Context initialContext = new InitialContext(); 注意 : JServlet アプリケーションを使用して EJB を実行するための情報 は、 『Oracle Application Server JServlet アプリケーション開発者ガイド』 を参照してください。 必要なオブジェクトの識別およびルックアップ クライアントは、InitialContext クラスの lookup() メソッドを実行して、次の 2 つの いずれかを取り出します。 ■ Bean のホーム・インタフェースのオブジェクト・リファレンス ■ 中間 JNDI コンテキスト lookup() メソッドは、次の 2 つのパラメータのいずれかを使用します。 ■ ホーム・インタフェースまたは中間コンテキストの名前を指定する文字列。 ■ ホーム・インタフェース名または中間コンテキスト名を持つ、接頭辞 "oas:" の付いた JNDI CompoundName オブジェクト。Names および CompoundNames の使用方法の 詳細は、JavaSoft JNDI のドキュメントを参照してください。 EJB アプリケーションのクライアントの開発 5-7 Bean のオブジェクト・リファレンスの取得 オブジェクト・リファレンスを識別し、参照するための基本を次に説明します。ただし、参 照する名前を指定するための要件は、クライアント・タイプによって異なります。基本を理 解した後で、該当するクライアント・タイプの要件を参照してください。 基本 ホーム・インタフェース名の文字列の指定 ■ ■ 中間コンテキストの文字列の指定 注意 : CompoundName 解決に関する例は、ここでは説明しません。詳 細は、JNDI のドキュメントを参照してください。 クライアント・タイプの要件 Java アプリケーション・クライアント ■ ■ Java アプレット・クライアント ■ Enterprise JavaBean クライアント ■ JServlet クライアント ホーム・インタフェース名の文字列の指定 文字列パラメータの形式は次のとおりです。 oas://<host>:<port>/<application>/<object> <host> Oracle Application Server のリスナー・コンポーネントが実行 されるマシン。 <port> リスナーがリクエストをリスニングするポート番号。設定され ていない場合、デフォルトは 80 です。 /<application>/<object> オブジェクトの階層パス。たとえば、"ejb/myStack" という名 前の EJB アプリケーションがあり、このアプリケーションに "ServerStackHome" という名前のホーム・インタフェースを 持った Bean が 1 つ含まれている場合、オブジェクトの絶対名 は次のようになります。 oas://host2/ejb/myStack/ServerStackHome この名前は、アプリケーションがマシン "host2" のポート 80 で稼動しているリスナーに登録 されているものと仮定しています。これを図示すると、名前階層は図 5-1 に示すとおりにな ります。 5-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Bean のオブジェクト・リファレンスの取得 図 5-1 Oracle Application Server 環境のサンプル・オブジェクト Oracle Application Server host1 application_1 sub_application_1 object_1 object_2 host2 ejb myStack ServerStackHome "oas://host2/ejb/myStack/ServerStackHome" という名前は、アプリケーション myStack の ServerStack オブジェクトのホーム・インタフェースを参照します。host1 と host2 は、Oracle Application Server のリスナー・コンポーネントを実行するマシンです。 リスナーは、同じまたは異なる Oracle Application Server のサイトで稼動可能です。アプリ ケーション名は、"/" で区切られた複数のコンポーネントで構成できるため、注意してくだ さい(つまり、"application_1/sub_application_1")。 この文字列は、lookup() メソッドでは次のように使用されます。 ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas://host2/ejb/myStack/ServerStackHome"), ServerStackHome.class); 注意 : PortableRemoteObject クラスは、返されたホーム・インタ フェースを RMI リモート・インタフェースに限定するために使用されま す。返されたオブジェクト・リファレンスを限定するために PortableRemoteObject を使用する方法の詳細は、5-12 ページの 「PortableRemoteObject を使用した絞込み」を参照してください。 中間コンテキストの文字列の指定 名前が完全にオブジェクトに解決されない場合、lookup() メソッドは Context オブジェ クトを返します。たとえば、EJB アプリケーションにのみ解決される名前を使用して lookup() をコールする場合、次のようになります。 EJB アプリケーションのクライアントの開発 5-9 Bean のオブジェクト・リファレンスの取得 // resolve only to the EJB application javax.naming.Context appCtx = (Context) initialContext.lookup( "oas://host2/ejb/myStack"); このメソッドは、それ以降の lookup() コール(アプリケーションのオブジェクトのオブ ジェクト・リファレンスを取得する)で使用できる Context オブジェクトを返します。た とえば、appCtx コンテキスト・オブジェクトは次の文で使用できます。 // use a relative name, context is from the first lookup() ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(appCtx.lookup( "ServerStackHome"),ServerStackHome.class); 2 番目の lookup() コールは、最初の lookup() コールで返されたコンテキスト・オブ ジェクトに対して行われるものです。この名前は相対名です。 注意 : URL 表記 "oas:" は、初期コンテキストから参照を実行するときに のみ必要です。中間コンテキストを取得すると JNDI プロバイダがわかり、 名前を直接指定することができます。 Java アプリケーション・クライアント Bean のオブジェクト・リファレンスを取得するには、次のいずれかの方法を使用します。 ■ オブジェクトを指す絶対名を作成し、そのオブジェクト(Bean のホーム・インタフェー ス)に対して lookup() を実行します。次の例では、"oas://host2/ejb/myStack/ ServerStackHome" の絶対名を作成し、この名前に対して lookup を実行しています。 ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas://host2/ejb/myStack/ServerStackHome"), ServerStackHome.class); ■ アプリケーションまたは別の中間コンテキストを指す絶対名を作成します。後ろに、そ のオブジェクトを指す後続の lookup() コールを付けます。次の例では、 "oas://host2/ejb/myStack" でアプリケーション mystack の中間コンテキストを取 り出しています。次に、ホーム・インタフェース名 ServerStackHome を指定して、オ ブジェクトの lookup を行います。 javax.naming.Context appCtx = (Context) initialContext.lookup( "oas://host2/ejb/myStack"); ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(appCtx.lookup( "ServerStackHome"),ServerStackHome.class); 5-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Bean のオブジェクト・リファレンスの取得 Java アプレット・クライアント アプレット・クライアントの場合、JNDI の参照名にホストとポート情報を明示的に設定する 必要はありません。環境変数にアプレット・インスタンスを設定すると、アプレットの参照 元がマークされます。これにより、ホストとポートがわかります。次の例では、 "oas:///ejb/myStack/ServerStackHome" の絶対パス名を示しています。これにはホス ト名が含まれていないことに注意してください。 // The host and port info do not appear in the name. For clients // that are applets, the host and port information are the same as the host:port // from which the applet was downloaded. Note that three "/" are used in the // lookup name. ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas:///ejb/myStack/ServerStackHome"),ServerStackHome.class); Enterprise JavaBean クライアント Bean は、アプリケーション・サーバー内の他の Bean にアクセスしようとします。lookup に使用される JNDI 名は、Bean がアクセスしようとしているのが同じアプリケーション内の 別の Bean か、あるいは別のアプリケーション内にある Bean かによって異なります。JNDI プロバイダは、相対名の参照をサポートしています。 同じアプリケーション内の Bean にアクセスする ターゲットのホーム・インタフェースとク ライアント Bean が同じアプリケーションに所属している場合、アプリケーションに関連す るサーバー Bean のホーム・インタフェース名のみ指定する必要があります。次の例では、 JNDI の参照名が "oas:ServerStack2Home" で、ホスト名、ejb 識別子またはアプリケー ション名を含んでいないことを示しています。 // ServerStack2 is the enterprise bean. // Initial Context is assumed to have been specified as above. ServerStack2Home stack2Home = (ServerStack2Home) PortableRemoteObject.narrow(initialContext.lookup( "oas:ServerStack2Home"),ServerStack2Home.class); 異なるアプリケーション内の Bean にアクセスする 別のアプリケーション内の Bean にアク セスする場合、次の形式でアプリケーション名と Bean のホーム・インタフェース名を指定 する必要があります。 oas:/app/home_interface_name Oracle Application Server は現行サイトへのアクセス方法を把握しているため、ホストおよ びポート情報を指定する必要はありません。 ServerStack2Home stack2Home = (ServerStack2Home) PortableRemoteObject.narrow(initialContext.lookup( "oas:/app_name/ServerStack2Home"),ServerStack2Home.class); EJB アプリケーションのクライアントの開発 5-11 Bean のオブジェクト・リファレンスの取得 ホーム・インタフェースが別の Oracle Application Server サイト(異なるリスナーおよび ポート)に属する場合は、ホストおよびポート情報が必要です。 ServerStack2Home stack2Home = (ServerStack2Home) PortableRemoteObject.narrow(initialContext.lookup( "oas://site2/host2:8877/app_name/ServerStack2Home"), ServerStack2Home.class); JServlet クライアント lookup で指定される JNDI 名は、JServlet カートリッジがアクセスしようとしているのがこ の Oracle Application Server サイト内の Bean か、あるいは別の Oracle Application Server サイト内の Bean かによって異なります。次の例では、同じ Oracle Application Server 内の Bean にアクセスする場合、ホスト名を含まないことを示しています。 // object reference of home interface of bean // bean is on same application server as client, // no need to specify host and port ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas:///ejb/myStack/ServerStackHome"),ServerStackHome.class); Bean と JServlet カートリッジが別の Oracle Application Server サイトで稼動する場合のみ、 ホストとポート情報を指定する必要があります。 // host and port needed (default port 80 used) ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas://host2/myStack/ServerStackHome"),ServerStackHome.class); PortableRemoteObject を使用した絞込み PortableRemoteObject クラスの主な目的は、RMI リモート・オブジェクト・リファレ ンスを絞り込み、適用することにあります。JNDI が Logger などのローカル・オブジェク トを返す場合、返されたオブジェクトは具体的なデータ型になります。これは、Java キャス ト演算子を使用して、指定されたタイプの変数に割り当てることができます。 ただし、これは、この章で説明するホーム・インタフェースまたはリモート・インタフェー スなどの、リモート・オブジェクトのリファレンスには当てはまりません。この場合、キャ ストが可能になる前に、返されるオブジェクトを特定のリモート・インタフェース・タイプ に絞り込む必要があります。PortableRemoteObject.narrow メソッドは、リモート・ リファレンス、および返すことになっているクラス・タイプを引数として渡します。このメ ソッドは、この時点でキャスト演算子を使用して割当て可能なオブジェクトの正しいスタブ を返します。 PortableRemoteObject は、クライアント・コールバックとして使用する CORBA インプ リメンテーションをアクティブまたは非アクティブにするために使用する、エクスポート方 法とエクスポートの取消し方法を指定します。 5-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド オブジェクトの破棄 これらのサービスは CORBA が直接提供しますが、PortableRemoteObject を使用するこ とにより、CORBA のスタブおよびスケルトンがなくてもコードをコンパイルできます。こ れにより、今後、コードを EJB に容易に移行できます。 C++ および既存の JCORBA アプリケーションへのアクセス Java クライアントは、EJB コンポーネントだけでなく、C++ や既存の JCORBA アプリケー ションにもアクセスできます。違いは、JNDI から受け取るオブジェクトがホーム・インタ フェースでなく、実際の C++ または JCORBA オブジェクトである点です。カートリッジ名 に対して lookup を実行したときに JNDI から返されるオブジェクトが、実際の新しいイン スタンスとなります。lookup を実行するたびに、新しいインスタンスが返されます。 オブジェクトに対するメソッドの実行 ホーム・インタフェースのリファレンスを取得したら、ホーム・インタフェースを通じて create() を実行することによって、EJB オブジェクト(リモート・インタフェース)のイ ンスタンスを生成できます。その後、EJB オブジェクトのビジネス・メソッドを実行できま す。たとえば、次のようにします。 // assume that stackHome contains the reference to ServerStackHome ServerStackRemote stackRemote = stackHome.create(); // push and pop are business methods stackRemote.push("12"); // store the value "12" on the stack int val = stackRemote.pop(); // remove the value from the top of the stack 注意 : 同じインスタンスに対するメソッドの実行は、順番に行う必要が あります。クライアント・スレッドの実行中に別のクライアント・スレッ ドが実行されると、2 回目の実行に対しては例外が発行されます。 オブジェクトの破棄 Bean を参照する必要がなくなると、クライアントはその Bean に対して remove() メソッド をコールします。これにより、ORB がオブジェクト・インスタンス(リモート・インタ フェース)を解放し、JVM がガーベッジ・コレクト中にこれをクリーン・アップできます。 remove() メソッドにはパラメータは存在しません。 // release the bean stackRemote.remove(); EJB アプリケーションのクライアントの開発 5-13 JNDI がサポートする機能 JNDI がサポートする機能 Oracle Application Server の JNDI インプリメンテーションでは、JNDI ネーム・サービスに 対して読込み専用アクセス権をサポートしています。ユーザーには、インプリメンテーショ ンの JNDI SPI を使用してネーム・サービスの内容を変更する許可がありません。次の機能 のみ使用可能です。 ■ 参照の完全なインプリメンテーション(lookup() を使用したサブコンテキストの部分 的な名前の参照を含む) 。 ■ list() および listBindings() を使用したネーム・サービスの内容のリスト。 ■ 次のメソッドを含む、Environment オブジェクトへのアクセス : getEnvironment()、 addToEnvironment()、removeFromEnvironment()。 ■ getNameParser() を使用した名前解析の取出し。これは、CompoundName とともに 使用します。 ■ このコンテキストに相対的な名前で、コンテキストの名前を作成するメソッド(たとえ ば、composeName() の使用) 。 ■ 以前アクセス可能であったコンテキストのクローズ。 ■ サポートされているすべてのメソッドの String と Name バージョンのインプリメンテー ション。 さらに、アプレット、セキュリティまたは JNDI パッケージ名の設定では、特定の JNDI プ ロパティを設定する必要があります。これらのプロパティは、次の表に示すように、このマ ニュアル内の他の箇所にリストされています。 プロパティ 記載場所 パッケージ名の設定 javax.naming.Context.INITIAL_ 「クライアントからのネーム・ CONTEXT_FACTORY または サーバーへのアクセス」 java.naming.factory.url.pkgs 内で設 定します。 クライアントを アプレットとして記述 oracle.oas.naming.jndi.appletinstance 「Java アプレット・クライアント」 セキュリティの設定 javax.naming.Context.SECURITY_ PROTOCOL、SECURITY_PRINCIPAL および SECURITY_CREDENTIALS を 設定します。 『Oracle Application Server セ キュリティ・ガイド』の 「EJB または ECO/Java クライア ントの認証の設定」 使用できない JNDI 機能 Oracle Application Server の JNDI インプリメンテーションでは、次の JNDI メソッドへのク ライアントのアクセスをサポートしていません。bind()、rebind()、unbind()、 rename()、createSubContext()、destroySubContext()。禁止されているメソッド はすべて javax.naming.NoPermissionException 例外を発行します。 5-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド クライアントに必要なファイル Oracle Application Server の SPI インプリメンテーションでは、名前領域に対して読込み専 用アクセス権しかないため、バインディングを更新できません。 注意 : JNDI 初期コンテキストでの参照の操作には時間がかかります。ク ライアントが複数のホーム・インタフェースを参照する必要がある場合、 初期コンテキストを使用して共通の中間コンテキストを参照してから、こ の相対中間コンテキストを使用してホーム・インタフェースを参照します。 クライアントに必要なファイル クライアントには、Bean クライアント API と、実行中に生成されたスタブへのアクセスが 必要です。API とスタブ・ファイルは次の場所に入っています。 ■ $ORAWEB_HOME/classes/ejbapi.jar ■ $ORAWEB_HOME/../apps/ejb/<appName>/_client.jar 注意 : oasdeploy を使用して、Java アプリケーションがサーバー・アプ リケーションとの通信に必要とする、クライアント・スタブの入った JAR ファイルをダウンロードできます。クライアントには、Oracle Application Server 4.0.8 または JDeveloper 2.0 をインストールしておく必 要があります。JAR ファイルのダウンロード先のディレクトリを指定する には oasdeploy -c オプションを使用します。たとえば、次のようにな ります。 oasdeploy -t EJB -a myStack -u admin/adminpasswd@node1:8888 -c /client/stubs クライアントが非 Java アプリケーションの場合、次のものを含んでいる必要があります。 ■ $ORAWEB_HOME/../apps/ejb/<appName>/OASClientInterfaces.idl ORB を使用するクライアントには、CLASSPATH に次のファイルも追加する必要がありま す。 ■ $ORAWEB_HOME/classes/oasoorb.jar ■ $ORACLE_HOME/jlib/javax-ssl-1_2.jar ■ $ORACLE_HOME/jlib/jssl-1_2.jar 前述のファイル、アプリケーション・クラス・ファイルおよび必須の例外クラス・ファイル をクライアントの CLASSPATH に追加します。 EJB アプリケーションのクライアントの開発 5-15 APPLET タグ アプレットに必須のファイル 必須のファイルは、applet の archive 属性で指定する必要があります。必要なファイル は次のとおりです。 ■ 前の項で説明したファイル ■ アプレットのクラス・ファイル 注意 : ターゲットのブラウザが、APPLET タグの archive 属性で複数の JAR ファイルをサポートしていない場合、アプレットに必要なすべてのク ラス・ファイルを含んだ 1 つの JAR ファイルを作成する必要があります。 APPLET タグ <EMBED> タグ(Netscape の場合)または <OBJECT> タグ(Internet Explorer の場合)で次 のパラメータを使用することにより、アプレット・クライアントは Pure Java バージョンの Oracle Application Server ORB を使用できます。 <PARAM NAME="org.omg.CORBA.ORBClass" VALUE="oracle.oas.orb.CORBA.ORB"> <PARAM NAME="org.omg.CORBA.ORBSingletonClass" VALUE="oracle.oas.orb.CORBA.ORB"> 次の例で、Netscape および Internet Explorer でアプレットを実行する HTML タグを示します。 例 5-1 Netscape でのアプレットの実行 <EMBED type = "application/x-java-applet;version=1.2" java_CODE = "myApp.TextFuncsDemo.class" java_CODEBASE = "http://myserver/applet_dir" java_ARCHIVE = "ejbapi.jar,_client.jar,oasoorb.jar,applet_class_files.jar" org.omg.CORBA.ORBClass = "oracle.oas.orb.CORBA.ORB" org.omg.CORBA.ORBSingletonClass = "oracle.oas.orb.CORBA.ORB" ORBdisableLocator = "true" pluginspage = "http://java.sun.com/products/plugin/1.2/plugin-install.html"> </EMBED> 例 5-2 Internet Explorer でのアプレットの実行 <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="http://java.sun.com/products/plugin/1.2/jinstall-12-win32.cab#Version=1,2,0,0"> <PARAM NAME="CODE" VALUE="myApp.TextFuncsDemo.class"> <PARAM NAME="CODEBASE" VALUE="http://myserver/applet_dir"> <PARAM NAME="ARCHIVE" VALUE="ejbapi.jar,_client.jar,oasoorb.jar,applet_class_files.jar"> <PARAM NAME="type" VALUE="application/x-java-applet;version=1.2"> <PARAM NAME="org.omg.CORBA.ORBClass" VALUE="oracle.oas.orb.CORBA.ORB"> <PARAM NAME="org.omg.CORBA.ORBSingletonClass" VALUE="oracle.oas.orb.CORBA.ORB" <PARAM NAME="ORBdisableLocator" VALUE="true"> </OBJECT> 5-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド JNDI プロバイダのパフォーマンス機能 Internet Explorer ユーザーへの注意 : 前述の例では、codebase が 2 回 定義されています。1 回目(属性として)は、ローカル・マシンに Java 1.2 プラグインが存在しない場合に、これをダウンロードする場所を定義 しています。2 回目(パラメータとして)は、アプレットのクラスと JAR ファイルの場所の URL を指しています。 ■ codebase パラメータには絶対 URL を指定する必要があります。"." は使用できません (現行ディレクトリ)。 ■ archive 属性には、クライアントに必要なファイルが正しい順序で含まれている必要が あります。これらのファイルを codebase ディレクトリにコピーします。複数の _client.jar ファイルが存在する場合、codebase ディレクトリ内で一意のファイル名を 使用してください。 ■ org.omg.CORBA.ORBClass と org.omg.CORBA.ORBSingletonClass パラメータで は、プライマリの ORB クラスを指定しています。Pure Java バージョンの ORB を使用 しない場合は、ご使用の ORB の該当するクラスを指定します。 ■ Visigenic の Gatekeeper を使用しない場合は、ORBdisableLocator パラメータが必要 です。これが指定されず、クライアントが Visigenic ORB を使用している場合、クライ アントの ORB は常に Gatekeeper を使用するものとみなします。 ■ JNDI SPI インプリメンテーションでは、<PARAM> タグから多くの環境属性を自動的に 抽出できます。例外は、INITIAL_CONTEXT_FACTORY と oracle.oas.naming.jndi.appletinstance です。 ■ 表示されているとおりに Internet Explorer の OBJECT タグを入力します。classid 属性 では、Windows レジストリ内の Java 1.2 プラグイン識別子を指定します。codebase 属性では、ローカル・マシンに Java 1.2 プラグインが存在しない場合に、これをダウン ロードする元の場所を定義します。 JNDI プロバイダのパフォーマンス機能 Oracle Application Server の JNDI SPI プロバイダは共同ロケーションをサポートしており、 EJB アプリケーションのパフォーマンスを向上します。 Bean の共同ロケーション 共同ロケーションにより、特定のクライアントからリクエストされたアプリケーション内の ホーム・インタフェースと Bean がすべて同じ JVM に置かれていることを保証できます。す べての Bean を同じ JVM に置くことにより、Oracle Application Server はプロセス間通信と ネットワーク上のリモート接続の数を減らします。クライアントに関連付けられている Bean がすべて共同ロケーションにあるため、Oracle Application Server はクライアントのた めに使用するリソースをより効率的に管理および共有できます。 EJB アプリケーションのクライアントの開発 5-17 JNDI プロバイダのパフォーマンス機能 共同ロケーションは、SPI プロバイダのキャッシュを使用して設定します。アプリケーショ ンを使用するクライアントが特定のアプリケーション・インスタンスに接続されると、SPI は自分のキャッシュを使用して、同じアプリケーションに対する後続のリクエストが同じ JVM によって処理されることを保証します。つまり、アプリケーション名に対応するコンテ キストの参照が実行されると、JNDI は、クライアントを特定の JVM 内の特定のアプリケー ション・インスタンスに関連付けます。後続の同一アプリケーション名へのアクセスがあれ ば、同じアプリケーション・インスタンスに割り当てられます。 キャッシング方法 デフォルトのキャッシング方法に対応する動作は、クライアントのタイプによって異なりま す。 クライアント・アプリケーション デフォルトでは、静的キャッシュを使用します。キャッシュは静的変数です。JNDI リクエ ストは、すべて同じキャッシュを使用します。 Java アプレット デフォルトは、アプレット・インスタンスに関連付けられたキャッシュです。つまり、特定 のアプレット内で作成された Bean は、すべて処理されることを意味します。 Oracle Application Server 内の Bean デフォルトでは、Bean が実行されているアプリケーション・インスタンスに関連付けられ たキャッシュを使用します。つまり、クライアントに属するこれらの Bean によって作成さ れた Bean もすべて共同ロケーションに入ります。 キャッシュのクリーン・アップ アプリケーション・インスタンスとクライアントとの関連付けは、キャッシュがクリーン・ アップされた時点で終了します。これは、ユーザーが初期コンテキストに対して Context.close() を実行したときに発生します。 アプリケーション・インスタンスの終了 コンテキストがクローズされたためにクライアントのキャッシュが解放されると、関連付け が終了したことがアプリケーション・インスタンスに通知されます。この時点で、どのクラ イアントも JNDI 経由でホーム・インタフェースにはアクセスできなくなります。すべての Bean が削除されているはずなので、アプリケーション・インスタンスはクライアントとの 関連付けを終了し、新しいクライアントに割り当てることができます。 5-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド JNDI プロバイダのパフォーマンス機能 ただし、クライアントがすべての Bean を削除(または破棄)していない場合もあります。 かわりに、ハンドルを Bean に対してシリアライズし、後で使用できるようにファイルに保 存していることがあります。このような場合、親のないアプリケーション・インスタンス は、残りの Bean が削除されるか、あるいはタイムアウトになるまでアクティブである必要 があります。この時点で、アプリケーション・インスタンスの関連付けは終了したものとみ なされます。 関連付けが終了すると、アプリケーション・インスタンスの JNDI キャッシュがクリーン・ アップされます。関連付けの解消は、もとのアプリケーション・インスタンスの Bean に よって作成された他のすべてのアプリケーションに伝播します。 親のないアプリケーション・インスタンスによって消費されるリソースの量によっては、ク ライアント・アプリケーションを終了する前に(可能なら)Bean をすべて削除し、一時的 に作成された Bean も削除されていることを確認することが重要です。 EJB アプリケーションのクライアントの開発 5-19 JNDI プロバイダのパフォーマンス機能 5-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 6 EJB オブジェクトのトランザクション この章では、EJB のトランザクション Bean を作成する方法について説明します。宣言または プログラムによる方法のいずれかを使用して、Bean 内でトランザクションを使用可能にで きます。 ■ 宣言トランザクション : EJB ランタイムが、ユーザーのかわりに Bean のトランザクショ ン処理を実行します。 ■ プログラムによるトランザクション : Bean が、必要に応じて各トランザクション操作を 実行する必要があります。 この章を読む前に、 『Oracle Application Server 管理者ガイド』の第 11 章「トランザクショ ンを使用可能にする」を読んで、Oracle Application Server のトランザクション・サービス について理解しておいてください。 内容 ■ 概要 ■ 宣言トランザクション ■ プログラムによるトランザクション ■ トランザクションとスレッド ■ 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション 概要 EJB オブジェクトは、宣言トランザクションおよびプログラムによるトランザクションをサ ポートしています。宣言トランザクションでは、Oracle Application Server が自動的にトラ ンザクションを区切ります。プログラムによるトランザクションでは、ユーザーが UserTransaction クラスのメソッドを使用してトランザクションを区切ります。 EJB オブジェクトのトランザクション 6-1 概要 JDBC を使用して、EJB オブジェクトからデータベースにアクセスします。トランザクション に関係するデータベースが 1 つのみで、そのトランザクションを 1 回のメソッド・コール内 で完了できる場合、JTS を認識しない JDBC ドライバが使用できるため、JTS トランザクショ ンを使用する必要はありません。ただし、トランザクションが複数のメソッドにまたがって 実行されたり、複数のオブジェクトと一緒に実行されるか、あるいは複数のデータベースに またがる場合は、JTS および JTS を認識する JDBC ドライバを使用する必要があります。 JTS を JDBC と一緒に使用するには次のものが必要です。 ■ JTS を使用できる JDBC ドライバ。 Oracle Application Server には、Oracle7 と Oracle8 データベースに接続する、JTS の使 用が可能なドライバが付属しています。 ■ Oracle Application Server のトランザクションの DAD(Database Access Descriptor)。 DAD は、トランザクションに含まれるデータベースについての情報を提供します。トラ ンザクションを使用できるように DAD を設定する方法は、 『Oracle Application Server 管理者ガイド』の第 11 章「トランザクションを使用可能にする」を参照してください。 配置記述子のトランザクション・パラメータ oracle.oas.ejb.deployment.OASApplicationDescriptor クラスには、アプリケーショ ンやアプリケーション内のオブジェクトのトランザクション情報を指定可能にする追加のメ ソッドが含まれています。 注意 : 使用している EJB の配置記述子が EJB 1.0 準拠の場合、Oracle 固有 の OASApplicationDescriptor の作成や設定は行いません。かわりに、 EJB アプリケーションを配布した後で、Oracle Application Server Manager を使用してトランザクションを使用可能にし、このアプリケー ションとともに使用する DAD を選択する必要があります。これらの フィールドは、 「アプリケーション」フォルダ内の「Tx プロパティ」 フォームで設定します。トランザクションの設定の詳細は、 『Oracle Application Server 管理者ガイド』の第 11 章を参照してください。 これらのメソッドは、標準の javax.ejb.deployment.ControlDescriptor クラスのメ ソッドに対する追加です。 // set the ControlDescriptors for the EJB application. // cdAll is an array of ControlDescriptors, one cell for each bean. Since // there is only one bean in this application, we just need a one-cell // array ControlDescriptor cd = new ControlDescriptor(); 6-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 概要 cd.setTransactionAttribute(ControlDescriptor.TX_BEAN_MANAGED); cdAll[0] = cd; sd.setControlDescriptors(cdAll); トランザクションを使用可能にする クラス内の setTxEnabled() メソッドで、アプリケーションの EJB オブジェクトが JTS を使用 するかどうかを指定します。このメソッドは 1 つのパラメータ、ブール値を使用します。ア プリケーションがトランザクションを使用できるように指定するには、パラメータに true を設定します。 OASApplicationDescriptor ad = new OASApplicationDescriptor(); ad.setTxEnabled(true) デフォルト値は false です。 アプリケーションでのトランザクションの DAD の指定 OASApplicationDescriptor クラスの setTxDads() メソッドで、アプリケーションの EJB オブ ジェクトが使用するトランザクションの DAD を指定します。このメソッドは 1 つのパラ メータ、String 値を使用します。アプリケーションが複数のトランザクションの DAD を使 用する場合は、DAD 名をカンマで区切ります。 たとえば、アプリケーションが "proj1" と "proj2" という名前の DAD を使用するように指定 するには、次のようにメソッドをコールします。 ad.setTxDads("proj1, proj2") JTS を使用可能な JDBC ドライバ トランザクション内でデータベース・アクセスに使用する JDBC ドライバは、Oracle Application Server 付属のドライバなど、JTS(Java Transaction Service)を使用できるもの にしてください。 JDBC では、DriverManager クラスの getConnection() メソッドを使用して、データ ベース接続をオープンします。このメソッドは、データベース URL を指定するパラメータ を使用して、データベースを検索し、ログインします。データベース URL の形式はドライ ブ固有です。 JTS の使用が可能な JDBC ドライバを使用する場合、データベースの URL は次の形式のいず れかになります。 jdbc:oracle:jts7:@<dadname> jdbc:oracle:jts8:@<dadname> <dadname> には、トランザクションの DAD(Database Access Descriptor)の名前を指定し ます。トランザクションを使用できるように DAD を設定する方法は、 『Oracle Application EJB オブジェクトのトランザクション 6-3 宣言トランザクション Server 管理者ガイド』の第 11 章「トランザクションを使用可能にする」を参照してくださ い。 データベース URL に DAD を(接続文字列のかわりに)使用することにより、ユーザーは、 トランザクションがどのデータベースを使用するかを知っている必要があります。トランザ クションの DAD には有効なユーザー名 / パスワードが必要です。 注意 : JTS を使用できるドライバは、常に非自動コミット・モードです。 EJB オブジェクトで明示的にモードを設定する必要はありません。また、JTS ドライバと OCI Oracle ドライバは、EJB アプリケーションに事前に登録され ています。DriverManager がドライバを探すために、Class.forName() を 使用する必要はありません。 宣言トランザクション 宣言トランザクションを使用する場合、EJB ランタイムが、EJB オブジェクトに配置記述子 パラメータを設定してトランザクションを区切るようにします。EJB ランタイムは、各 Bean に設定されているパラメータ値の指定どおりに、自動的にトランザクションを管理します。 EJB ランタイムは、Bean にとって適切なときに、トランザクションの開始、コミット、保留 およびロールバックを行います。たとえば、TX_REQUIRED プロパティにより定義された Bean のメソッドを実行すると、メソッドの開始時に EJB ランタイムがトランザクションを 開始し、メソッドの終了時にエラーが発生したかどうかに応じて、トランザクションのコ ミットまたはロールバックを行います。 宣言トランザクションとプログラムによるトランザクションのどちらを使用するかはユー ザーが決定できます。プログラムによるトランザクションでは手動でコードを作成する必要 がありますが、宣言トランザクションでは、ほとんどのトランザクションの区切りが自動的 に行われます。ただし、EJB アプリケーションで宣言トランザクションを使用する場合、 OTS によりプロセス間でトランザクション・コンテキストが渡されます。アプリケーション で複数の RM を使用する分散トランザクション用に OTS を使用すると、必要となる 2 フェーズ・コミットの通信オーバーヘッドのためにパフォーマンスが低下します。 宣言トランザクションの定義 EJB オブジェクトの宣言トランザクションを定義するには、次のステップを実行します。 ■ 接続するデータベースを指定する。 ■ EJB オブジェクトのトランザクション属性を設定する。 ■ データベース操作を実行する。 6-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 宣言トランザクション データベースへの接続 データベースを指定するには、DriverManager クラスの getConnection() メソッドを コールします。詳細は、 「JTS を使用可能な JDBC ドライバ」に記載されています。次のコー ドは、このメソッドの使用方法を示しています。 /* Connect to the Oracle 8 database using the DAD called DADNAME */ Connection conn = DriverManager.getConnection("jdbc:oracle:jts8:@DADNAME"); /* create a JDBC statement object */ Statement stmt = conn.createStatement(); アプリケーション内の各 Bean では、データベース接続に事前定義済みの DAD のセットを 使用できます。これを行うには、各 Bean の「Bean Environment」フォームで、名前の フィールドに txdad プロパティを、値のフィールドにカンマ区切りのリストを設定して DAD を指定します。例えば、名前と値のペアは次のようになります。 txdad = dad1,dad2,dad3 同じアプリケーション内のすべての Bean でデータベース接続を共有する場合は、txdad パ ラメータを設定しないでください。Bean は、アプリケーションの「トランザクション・プロ パティ」フォームにリストされている DAD を共有します。 これらのフォームの詳細は、4-16 ページの「EJB アプリケーションの設定」または『Oracle Application Sever 管理者ガイド』を参照してください。 トランザクション属性の設定 トランザクション属性はトランザクションをいつ開始するかを指定します。配置記述子に含 まれている各オブジェクトの属性を、javax.ejb.deployment.ControlDescriptor クラ スの setTransactionAttribute() メソッドを使用して、次のいずれかの値に設定します (記述子の詳細は、4-6 ページの「Bean レベルの配置記述子」を参照してください)。 EJB オブジェクトのトランザクション 6-5 宣言トランザクション 表 6-1 EJB オブジェクトのトランザクション属性 属性 説明 TX_NOT_SUPPORTED EJB オブジェクトのメソッドは宣言トランザクションをサポートして いないため、これらはトランザクション・コンテキストの外で実行さ れます。トランザクション・コンテキスト内にあるクライアントが TX_NOT_SUPPORTED オブジェクトのメソッドをコールすると、現 行のトランザクションは保留されます。メソッドがリターンするとト ランザクションは再開します。 TX_REQUIRED トランザクション・コンテキスト内のクライアントが TX_REQUIRED オブジェクトのメソッドをコールした場合、メソッ ドを実行するためにトランザクション・コンテキストが使用されま す。クライアントがトランザクション・コンテキスト内にない場合 は、新しいトランザクションが起動され、メソッドが完了するとコ ミットされます。 TX_SUPPORTS トランザクション・コンテキスト内のクライアントが TX_SUPPORTS オブジェクトのメソッドをコールした場合、そのメ ソッドは同じトランザクション・コンテキスト内で実行されます。 クライアントがトランザクション・コンテキスト内にない場合は、メ ソッドはトランザクションのスコープ外で実行されます。 TX_REQUIRES_NEW トランザクション・コンテキストにあるクライアントが TX_REQUIRES_NEW オブジェクトのメソッドをコールすると、現行 のトランザクションは保留され、メソッドは新しいトランザクショ ン・コンテキストで実行されます。メソッドが終了すると新規のトラ ンザクションはコミットされます。メソッドが終了すると保留された トランザクションが再開されます。 クライアントがトランザクションのスコープ内にない場合、トランザ クション・コーディネータはメソッドを実行するための新規トランザ クションを開始して、メソッド終了時にトランザクションをコミット します。 TX_MANDATORY TX_MANDATORY オブジェクトのメソッドを実行するには、クライ アントはトランザクション・コンテキスト内にある必要があります。 そうしないと、EJB オブジェクトはクライアントに TransactionRequired 例外を発行します。 TX_BEAN_MANAGED TX_BEAN_MANAGED オブジェクトのメソッドは、 javax.jts.UserTransaction オブジェクトを使用してトランザク ションを区切ります。トランザクション属性を TX_BEAN_MANAGED に設定すると、EJB オブジェクトがプログラ ムによるトランザクションのモデルを使用することを示します。 クライアントがすでにトランザクション・コンテキスト内にあるとき に EJB オブジェクトを実行すると、受信したトランザクションは保留 されます。 6-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 宣言トランザクション 次の表は、トランザクション属性の値がトランザクション・コンテキストにどのように影響 するかをまとめたものです。 表 6-2 トランザクション属性(サマリー) 値 クライアントがトランザ クション・コンテキスト 使用されるトランザクション・ にあるかどうか コンテキスト TX_NOT_SUPPORTED はい なし(クライアントのトランザク ションは保留される ) いいえ なし はい クライアントのトランザクション・ コンテキスト いいえ 新規のトランザクション・コンテキ スト はい クライアントのトランザクション・ コンテキスト いいえ なし はい 新規のトランザクション・コンテキ スト(クライアントのトランザク ションは保留される ) いいえ 新規のトランザクション・コンテキ スト はい クライアントのトランザクション・ コンテキスト いいえ TransactionRequired 例外の発行 はい クライアントのトランザクションを 保留(プログラムによるトランザク ション) いいえ なし(プログラムによるトランザク ション) TX_REQUIRED TX_SUPPORTS TX_REQUIRES_NEW TX_MANDATORY TX_BEAN_MANAGED 次のコード例は、EJB オブジェクトのトランザクション属性を TX_NOT_SUPPORTED に設 定する方法を示しています。このコードは、Bean レベルの配置記述子を作成するために作 成する Java プログラム内に存在します。 ControlDescriptor cd = new ControlDescriptor(); // create a new // ControlDescriptor object cd.setTransactionAttribute(ControlDescriptor.TX_NOT_SUPPORTED); EJB オブジェクトのトランザクション 6-7 宣言トランザクション 宣言トランザクションの例 この例では、クライアントは "Payroll/DBProc" という名前の EJB Bean に接続し、メソッド を実行します。トランザクション属性を TX_REQUIRED に設定することにより、この Bean は配置記述子内で宣言トランザクションを使用できるように設定されています。クライアン トが Payroll/DBProc オブジェクト内でメソッドを実行すると、EJB ランタイムは、現行ト ランザクション内で継続されるか、あるいは実行中のトランザクションがない場合は新規ト ランザクションを開始します。これが発生するのは、Bean に TX_REQUIRED 属性が設定さ れているためです。 Payroll/DBProc オブジェクトには、updateEmployees() と updateManagers() の 2 つのメ ソッドが含まれます。オブジェクトは TX_REQUIRED として定義されています。このため どちらのメソッドも、実行されると、新規トランザクションを開始するかまたは既存のトラ ンザクションを継続します。トランザクションがいずれかのメソッドで開始された場合、そ のトランザクションは、メソッドの完了時にコミットまたはロールバックされます。 updateEmployees() メソッドは、決してトランザクション内でコールされないように設計さ れていますが、updateManagers() メソッドはトランザクション内からコールできます。 ■ updateEmployees()— このメソッドを使用すると、EJB ランタイムは必ずトランザク ションを開始し、コミットします。 ■ updateManagers()— このメソッドを使用すると、EJB ランタイムは新規トランザク ションを開始するか、トランザクション・コンテキストを継続します。メソッドがクラ イアントから直接コールされた場合、オブジェクトは新規トランザクションを開始しま す。メソッドは、updateEmployees() からコールされると、コール元のメソッドで開 始されたトランザクション・コンテキストを使用します。 1 つ以上のデータベース内で変更を行う場合、JTS の使用が可能な JDBC ドライバ接続を オープンして、トランザクションの DAD に接続する必要があります。DAD によりデータ ベースが識別されます。DAD は、Oracle Application Server Manager 内で設定し、配布中 にプロパティとして指定する必要があります。そのメソッドは、getConnection() コール 内のデータベース URL の DAD 名の先頭に "jdbc:oracle:jts7:@" を追加することにより、JTS の使用が可能なデータベース接続用 JDBC ドライバへの接続を手動でオープンします。 プログラムによるトランザクションの場合は、同じ例が若干変更されています。6-15 ページ の「プログラムによるトランザクションの例」を参照してください。 EJB オブジェクトのリモート・インタフェース // Remote interface for the EJB object public interface DBInterface extends javax.ejb.EJBObject { public void updateEmployees() throws java.rmi.RemoteException; public void updateManagers() throws java.rmi.RemoteException; } 6-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 宣言トランザクション EJB オブジェクト // EJB object that implements DBInterface import javax.ejb.*; public class DBprocessing implements javax.ejb.SessionBean { String url = null; UserTransaction usertran = null; SessionContext sessctx; void setSessionContext(SessionContext ctx) { // save the SessionContext sessctx = ctx; // save the transaction context usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } public void updateEmployees() { // A new transaction begins automatically when you enter this method //Each method must retrieve a database connection Connection db = DriverManager.getConnection(url); PrepareStatement st = db.... st.executePrepared(...); ... if (managers_need_to_be_updated) updateManagers(); //return the database connection to the pool when closed db.close(); //The transaction commits or rolls back when method completes } public // // // void updateManagers() { If this method is called from updateEmployees(), the transaction begun in that method continues in this method. Statements are executed within the same transaction context. // If this method is called from the client directly, a new // transaction is started. This transaction is committed when this // method completes. //Each method must retrieve a database connection EJB オブジェクトのトランザクション 6-9 宣言トランザクション Connection db = DriverManager.getConnection(url); Statement st = db.createStatement(); st.execute(...); ... //return the database connection to the pool when closed db.close(); //If the transaction was started in this method, the transaction //commits or rolls back when method completes; otherwise, returns //to transactional method that invoked this method. } public void ejbCreate() throws CreateException { // creation tasks } public void ejbRemove() { } public void ejbActivate() { // activation tasks } public void ejbPassivate() { // passivation tasks } } クライアント public class Application { String appServer = "oas://..."; DBInterface dbp = null; public void doProcessing() { // Set up JNDI Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi"); javax.naming.Context context = new InitialContext(env); context = context.lookup(appServer); DBHome dph = (DBHome) PortableRemoteObject.narrow( context.lookup("Payroll/DBProc"),DBHome.class); dbp = dph.create(); ... dbp.updateEmployees(); 6-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 宣言トランザクション ... dbp.updateManagers(); ... dbp.destroy(); dbp = null; } public void static main(String args[]) { Application ap = new Application(); ap.doProcessing(); } } 配置記述子 EJB アプリケーションの記述子には次の情報が含まれています。 import import import import import import javax.ejb.deployment.*; oracle.oas.ejb.deployment.*; javax.naming.CompositeName; java.util.Properties; java.io.*; java.lang.reflect.*; public class PayrollDescriptor { public static void main(String[] args) { FileOutputStream fos; ObjectOutputStream oos; OASApplicationDescriptor SessionDescriptor ControlDescriptor ControlDescriptor ad = new OASApplicationDescriptor(); sd = new SessionDescriptor(); cd = new ControlDescriptor(); cdAll[] = new ControlDescriptor[1]; try { ad.setBeanHomeName (new CompositeName("Payroll")); // set application name ad.setTxEnabled(true); // enable transactions ad.setTxDads("payrolldad"); // set DADs used in the app // write out the serialized descriptor for the application fos = new FileOutputStream("payrollDeployment.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(ad); oos.flush(); EJB オブジェクトのトランザクション 6-11 宣言トランザクション sd.setEnterpriseBeanClassName("DBProcessing");// set the Java class of the // bean to "DBProcessing" // for the bean, set the DBName property to a DAD name Properties p = new Properties(); p.put("DBName", "payrolldad"); sd.setEnvironmentProperties(p); sd.setRemoteInterfaceClassName("DBInterface");// set remote interface of // the bean to "DBInterface" sd.setBeanHomeName(new CompositeName("DBProc")); // set the bean name // to "DBProc" // set the ControlDescriptors for the EJB application. // cdAll is an array of ControlDescriptors, one cell for each bean. Since // there is only one bean in this application, we just need a one-cell // array. cd.setTransactionAttribute(ControlDescriptor.TX_REQUIRED); cdAll[0] = cd; sd.setControlDescriptors(cdAll); sd.setSessionTimeout(2000); // set the timeout to 2000 seconds sd.setStateManagementType(sd.STATEFUL_SESSION); // set the session bean // to stateful // write out the serialized descriptor for the bean fos = new FileOutputStream("dbprocDeployment.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(sd); oos.flush(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } 6-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド プログラムによるトランザクション プログラムによるトランザクション EJB オブジェクトのプロパティを設定することにより、宣言でトランザクションを区切るか わりに、javax.jts.UserTransaction オブジェクトを使用して、プログラムによってト ランザクションを区切ることができます。このオブジェクトのメソッドを使用して、トラン ザクションを開始、コミットおよびロール・バックします。このオブジェクトのリファレン スを取得するには、SessionContext クラスの getUserTransaction() メソッドをコール します。 プログラムによるメソッドを使用する場合、JTS(Java Transaction Service)と JDBC(Java Database Connectivity)のトランザクション・プロトコルについて理解している必要があり ます。 ■ JTS— データベース、メソッドの実行、EJB オブジェクトにまたがるトランザクションを 定義できます。 ■ JDBC—JTS は JDBC を使用してデータベースにアクセスします。トランザクションに関 係するデータベースが 1 つのみで、そのトランザクションを 1 回のメソッド・コール内 で完了できる場合、JTS を認識しない JDBC ドライバが使用できるため、JTS トランザ クションを使用する必要はありません。ただし、トランザクションが複数のメソッドに またがって実行されたり、複数のオブジェクトと一緒に実行されるか、あるいは複数の データベースにまたがる場合は、JTS および JTS を認識する JDBC ドライバを使用する 必要があります。 次のコードでは、トランザクション・コンテキストを usertran インスタンス変数に格納し ています。 import javax.ejb.*; public class myBean implements SessionBean { SessionContext sessctx; UserTransaction usertran = null; String url = null; void setSessionContext(SessionContext ctx) { // save the SessionContext sessctx = ctx; // save the transaction context usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } EJB オブジェクトのトランザクション 6-13 プログラムによるトランザクション void myOperation() { //Open a connection to a transactional database Connection db = DriverManager.getConnection(url); //Begin the transaction usertran.begin(); // database operations PrepareStatement st = db.... st.executePrepared(...); //commit the changes within the transaction usertran.commit(); //return the JDBC database connection to the connection pool. db.close(); } } JDBC データベース接続におけるすべての操作(問合せを含む)はトランザクション内で行 う必要があります。そうではない場合、JTS の使用が可能なドライバから例外が発行されま す。接続、切断、その他データベースの問合せや変更を伴わない処理は、トランザクション 内で実行する必要はありません。 このルールの例外は、DDL(data definition language)の操作です。DDL の操作(表の作 成など)は、トランザクションの外で行う必要があります。これらの操作は、常に自動的に コミットされます。 UserTransaction オブジェクト javax.jts.UserTransaction クラスは、次のメソッドをサポートしています。 ■ begin() ■ commit() ■ rollback() ■ getStatus() ■ setRollbackOnly() ■ setTransactionTimeout() 6-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド プログラムによるトランザクション プログラムによるトランザクションの例 Payroll/DBProc オブジェクトには、updateEmployees() と updateManagers() の 2 つのメ ソッドが含まれます。オブジェクトは TX_REQUIRED として定義されています。このため どちらのメソッドも、実行されると、新規トランザクションを開始するかまたは既存のトラ ンザクションを継続します。トランザクションがいずれかのメソッドで開始された場合、そ のトランザクションは、メソッドの完了時にコミットまたはロールバックされます。 updateEmployees() メソッドは、決してトランザクション内でコールされないように設計さ れていますが、updateManagers() メソッドはトランザクション内からコールできます。 ■ updateEmployees()— オブジェクトはメソッド内でトランザクションを開始し、コ ミットします。 ■ updateManagers()— オブジェクトが現在トランザクション・コンテキスト内にあるか どうかをチェックします。現在、トランザクション・コンテキスト内にない場合にの み、新しいトランザクションを開始してコミットします。オブジェクトが現在、トラン ザクション内にある場合は、現在の既存トランザクション・コンテキスト内で更新処理 が実行されます。 1 つ以上のデータベース内で変更を行う場合、JTS の使用が可能な JDBC ドライバ接続を オープンして、トランザクションの DAD に接続する必要があります。DAD によりデータ ベースが識別されます。DAD は、Oracle Application Server Manager 内で設定し、配布中 にプロパティとして指定する必要があります。そのメソッドは、getConnection() コール 内のデータベース URL の DAD 名の先頭に "jdbc:oracle:jts7:@" を追加することにより、JTS の使用が可能なデータベース接続用 JDBC ドライバへの接続を手動でオープンします。 宣言トランザクションの場合は、同じ例が若干変更されています。6-8 ページの「宣言トラ ンザクションの例」を参照してください。 EJB オブジェクトのリモート・インタフェース // Remote interface for the EJB object public interface DBInterface extends javax.ejb.EJBObject { public void updateEmployees() throws java.rmi.RemoteException; public void updateManagers() throws java.rmi.RemoteException; } EJB オブジェクト // EJB object that implements DBInterface import javax.ejb.*; public class DBprocessing implements javax.ejb.SessionBean { String url = null; UserTransaction usertran = null; SessionContext sessctx; void setSessionContext(SessionContext ctx) { EJB オブジェクトのトランザクション 6-15 プログラムによるトランザクション // save the SessionContext sessctx = ctx; // save the transaction context usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } public void updateEmployees() { // get a connection from a pool Connection db = DriverManager.getConnection(url); usertran.begin(); // start new transaction PrepareStatement st = db.... st.executePrepared(...); ... if (managers_need_to_be_updated) updateManagers(); usertran.commit(); // commit transaction db.close(); // return connection to the pool } public void updateManagers() { // get a connection from a pool Connection db = DriverManager.getConnection(url); // Verify if transaction is active boolean newTransaction = (usertran.getStatus() == usertran.STATUS_NO_TRANSACTION); // Start transaction if needed if (newTransaction) usertran.begin(); Statement st = db.createStatement(); st.execute(...); ... // Commit transaction if started if (newTransaction) usertran.commit(...); // return connection to the pool db.close(); } } 6-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド プログラムによるトランザクション クライアント public class Application { String appServer = "oas://..."; DBInterface dbp = null; public void doProcessing() { // Set up JNDI Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi"); javax.naming.Context context = new InitialContext(env); context = context.lookup(appServer); DBHome dph = (DBHome) PortableRemoteObject.narrow( initialContext.lookup("Payroll/DBProc"),DBHome.class); dbp = dph.create(); dbp.updateEmployees(); ... dbp.updateManagers(); ... dbp.destroy(); dbp = null; } public void static main(String args[]) { Application ap = new Application(); ap.doProcessing(); } } 配置記述子 EJB アプリケーションの記述子には次の情報が含まれています。 impo0rt javax.ejb.deployment.*; import oracle.oas.ejb.deployment.*; import javax.naming.CompositeName; import java.util.Properties; import java.io.*; import java.lang.reflect.*; public class PayrollDescriptor { public static void main(String[] args) { FileOutputStream fos; EJB オブジェクトのトランザクション 6-17 プログラムによるトランザクション ObjectOutputStream oos; OASApplicationDescriptor SessionDescriptor ControlDescriptor ControlDescriptor ad = new OASApplicationDescriptor(); sd = new SessionDescriptor(); cd = new ControlDescriptor(); cdAll[] = new ControlDescriptor[1]; try { ad.setBeanHomeName (new CompositeName("Payroll")); // set application name ad.setTxEnabled(true); // enable transactions ad.setTxDads("payrolldad"); // set DADs used in the app // write out the serialized descriptor for the application fos = new FileOutputStream("payrollDeployment.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(ad); oos.flush(); sd.setEnterpriseBeanClassName("DBProcessing");// set the Java class of the // bean to "DBProcessing" // for the bean, set the DBName property to a DAD name Properties p = new Properties(); p.put("DBName", "payrolldad"); sd.setEnvironmentProperties(p); sd.setRemoteInterfaceClassName("DBInterface");// set remote interface of // the bean to "DBInterface" sd.setBeanHomeName(new CompositeName("DBProc")); // set the bean name // to "DBProc" // // // // set the ControlDescriptors for the EJB application. cdAll is an array of ControlDescriptors, one cell for each bean. Since there is only one bean in this application, we just need a one-cell array. cd.setTransactionAttribute(ControlDescriptor.TX_BEAN_MANAGED); cdAll[0] = cd; sd.setControlDescriptors(cdAll); sd.setSessionTimeout(2000); // set the timeout to 2000 seconds sd.setStateManagementType(sd.STATEFUL_SESSION); // set the session bean // to stateful // write out the serialized descriptor for the bean fos = new FileOutputStream("dbprocDeployment.ser"); 6-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド トランザクションとスレッド oos = new ObjectOutputStream(fos); oos.writeObject(sd); oos.flush(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } トランザクションとスレッド トランザクションはスレッドに対応しています。1 つのスレッドには、アクティブ・トラン ザクションは常に 1 つしか存在できません。つまり、現行のトランザクションが終了するま で、別のトランザクションを開始できません。通常は現行トランザクションを保留して、最 初のトランザクションをコミットする前に 2 番目のトランザクションを開始します。ただ し、現在 Oracle Application Server EJB は、トランザクションの保留と再開をサポートして いません。 トランザクションとスレッド間の関連付けは非常に密接です。トランザクションは、それを 開始したスレッドと同じスレッド上でしかコミットやロールバックできません。また、トラ ンザクション内の処理はすべて同じスレッドから実行される必要があります。トランザク ション内に追加の実行スレッドは作成できません。最初のトランザクションの Bean がトラ ンザクションをコミットするかぎり、トランザクションのスコープ内で Bean が他の Bean をコールするようにできます。 実行された Bean が現行のトランザクション・コンテキストを受け入れるように定義されて いる場合は、トランザクションは中断されずに継続されます。Bean が TX_REQUIRES_NEW として宣言されていると、通常のレスポンスでは、EJB ランタイムが 現行トランザクション内でサブトランザクションを開始します。ただし、EJB は現在サブト ランザクションをサポートしていません。既存のトランザクションを持つ Bean が TX_REQUIRES_NEW を持つ Bean をコールすると、トランザクションはロールバックされ ます(図 6-1 を参照)。現在、この状態にフラグを立てる例外のログは作成されません。この ため、メソッドの実行によりこのタイプのシナリオが発生しないように検証する必要があり ます。 図 6-1 トランザクション・エラー状況 bean1TX_REQUIRED bean2TX_REQUIRES_ NEW EJB オブジェクトのトランザクション 6-19 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション Oracle Application Server の EJB モデルのトランザクションを開始できるのは EJB オブジェ クトのみです。Oracle Application Server 外のクライアントは、トランザクションを開始で きません。 状態を保持するオブジェクトと状態を保持しない オブジェクトのトランザクション クライアントが、同じトランザクション内のオブジェクトに、複数のコールを行う場合があ ります。これは、TX_BEAN_MANAGED モードで設定されている、状態を保持する Bean により行うことができます。状態を保持するオブジェクトは 1 つのクライアントにのみ使用 されるため、トランザクションが複数のクライアント・コールにまたがるようなオブジェク トを設計できます。状態を保持しないオブジェクトの場合、メソッドが終了するときに各ト ランザクションも終了する必要があります。状態を保持しないオブジェクトは、複数のクラ イアント・コールにまたがるトランザクションを持てません。 状態を保持するオブジェクトが TX_BEAN_MANAGED の場合、トランザクションを Bean 内の 1 つのメソッドで開始し、そのトランザクションを Bean 内の別のメソッドでコミット することができます。両方のメソッドとも同じ Bean に存在する必要があります。クライア ントは、begin メソッドを起動してトランザクションを開始できます。その後、クライアン トは Bean 内の他のメソッドも実行します。これはすべてトランザクションの一部となりま す。最後にクライアントは、commit メソッドを実行してトランザクションを終了します。 これによりクライアントは、1 つのトランザクションの状態を保持する Bean 内で、複数の メソッドをコールできます。 例 6-1 状態を保持する TX_BEAN_MANAGED オブジェクト 次の例では、TX_BEAN_MANAGED トランザクションを使用できるように定義された、状 態を保持する Bean を定義しています。この Bean は、クライアントが beginTransaction() を実行することによりトランザクションを開始し、そのトランザク ション内の他のメソッド(updateEmployees() など)を実行し、最後に commitTransaction() を実行してトランザクションをコミットできるように設計されてい ます。 JCORBA オブジェクトのリモート・インタフェース // Remote interface for the JCORBA object public interface DBInterface extends javax.ejb.EJBObject { public void updateEmployees() throws java.rmi.RemoteException; public void updateManagers() throws java.rmi.RemoteException; } 6-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション JCORBA オブジェクト // JCORBA object that implements DBInterface import javax.ejb.*; public class DBprocessing implements javax.ejb.SessionBean { String url = null; UserTransaction usertran = null; SessionContext sessctx; void setSessionContext(SessionContext ctx) { // save the SessionContext sessctx = ctx; // save the transaction context usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } public void beginTransaction() { usertran.begin(); // start new transaction } public void updateEmployees() { // get a JDBC database connection from a pool Connection db = DriverManager.getConnection(url); PrepareStatement st = db.... st.executePrepared(...); ... db.close(); // return connection to the pool } public void commitTransaction() { usertran.commit(); // commit transaction } EJB オブジェクトのトランザクション 6-21 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション クライアント public class Application { String appServer = "oas://..."; DBInterface dbp = null; public void doProcessing() { // Set up JNDI Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi"); javax.naming.Context context = new InitialContext(env); context = context.lookup(appServer); DBHome dph = (DBHome) PortableRemoteObject.narrow( initialContext.lookup("Payroll/DBProc"),DBHome.class); dbp = dph.create(); dbp.beginTransaction(); dbp.updateEmployees(); ... dbp.commitTransaction(); dbp.destroy(); dbp = null; } public void static main(String args[]) { Application ap = new Application(); ap.doProcessing(); } } 配置記述子 EJB アプリケーションの記述子には次の情報が含まれています。 impo0rt javax.ejb.deployment.*; import oracle.oas.ejb.deployment.*; import javax.naming.CompositeName; import java.util.Properties; import java.io.*; import java.lang.reflect.*; public class PayrollDescriptor { public static void main(String[] args) { FileOutputStream fos; 6-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション ObjectOutputStream oos; OASApplicationDescriptor SessionDescriptor ControlDescriptor ControlDescriptor ad = new OASApplicationDescriptor(); sd = new SessionDescriptor(); cd = new ControlDescriptor(); cdAll[] = new ControlDescriptor[1]; try { ad.setBeanHomeName (new CompositeName("Payroll")); // set application name ad.setTxEnabled(true); // enable transactions ad.setTxDads("payrolldad"); // set DADs used in the app // write out the serialized descriptor for the application fos = new FileOutputStream("payrollDeployment.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(ad); oos.flush(); sd.setEnterpriseBeanClassName("DBProcessing");// set the Java class of the // bean to "DBProcessing" // for the bean, set the DBName property to a DAD name Properties p = new Properties(); p.put("DBName", "payrolldad"); sd.setEnvironmentProperties(p); sd.setRemoteInterfaceClassName("DBInterface");// set remote interface of // the bean to "DBInterface" sd.setBeanHomeName(new CompositeName("DBProc")); // set the bean name // to "DBProc" // // // // set the ControlDescriptors for the EJB application. cdAll is an array of ControlDescriptors, one cell for each bean. Since there is only one bean in this application, we just need a one-cell array. cd.setTransactionAttribute(ControlDescriptor.TX_BEAN_MANAGED); cdAll[0] = cd; sd.setControlDescriptors(cdAll); sd.setSessionTimeout(2000); // set the timeout to 2000 seconds // set the session bean to stateful sd.setStateManagementType(sd.STATEFUL_SESSION); // write out the serialized descriptor for the bean fos = new FileOutputStream("dbprocDeployment.ser"); oos = new ObjectOutputStream(fos); EJB オブジェクトのトランザクション 6-23 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション oos.writeObject(sd); oos.flush(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } 6-24 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 7 EJB アプリケーションへの移行 この章では、EJB へのアプリケーションの移行について説明します。 内容 ■ OAS 4.0.7 の JCORBA アプリケーションの移行 ■ Enterprise CORBA Objects(ECO/Java)の移行 ■ OAS 4.0.7 EJB アプリケーションの移行 — ご使用の EJB アプリケーションを EJB 1.0 準拠 にします。 OAS 4.0.7 の JCORBA アプリケーションの移行 OAS 4.0.7 の JCORBA アプリケーションを OAS 4.0.8 に移行するには、ソース・コードを変 更する必要があります。現在、Oracle Application Server のコンポーネント・モデルは、EJB 1.0 ホーム・インタフェースとリモート・インタフェース、および完全な JNDI サポートを提 供しています。 OAS 4.0.7 の JCORBA アプリケーションの移行には、次のものが含まれます。 ■ リモート・インタフェースの変換 ■ ホーム・インタフェースの作成 ■ JCORBA オブジェクト・インプリメンテーションの移行 ■ パラメータをシリアライズ可能にする ■ JCO.APP の EJB 配置記述子への変換 また、4.0.7 の JCORBA アプリケーションにアクセスするクライアントにも変更を加える必 要があります。詳細は 7-11 ページの「4.0.7 の JCORBA クライアントの移行」を参照してく ださい。 EJB アプリケーションへの移行 7-1 OAS 4.0.7 の JCORBA アプリケーションの移行 リモート・インタフェースの変換 JCORBA オブジェクトのリモート・インタフェースで次の作業を行います。 ■ すべての org.omg.CORBA.Object または oracle.oas.jco.JCORemote を javax.ejb.EJBObject に変換する。 ■ インタフェースのすべてのメソッドに対して java.rmi.RemoteException 例外を発 行する。 次の表に、JCORBA リモート・インタフェースと EJB リモート・インタフェースの違いを示 します。 表 7-1 リモート・インタフェースの変換 JCORBA リモート・インタフェース EJB リモート・インタフェース package myStack; package myStack; public interface ServerStackRemote extends oracle.oas.jco.JCORemote { public int getStackSize(); public interface ServerStackRemote extends javax.ejb.EJBObject { public int getStackSize() throws java.rmi.RemoteException; public void setStackSize(int size) throws StackException; public void setStackSize(int size) throws StackException, java.rmi.RemoteException; public void push(String value) throws StackException; public void push(String value) throws StackException, java.rmi.RemoteException; public String pop() throws StackException; public String pop() throws StackException, java.rmi.RemoteException; } } ホーム・インタフェースの作成 Oracle Application Server の OAS 4.0.7 JCORBA コンポーネントでは、JCORBA オブジェク トにホーム・インタフェースは必要ありませんでした。移行された各オブジェクトにはホー ム・インタフェースを作成する必要があります。これにより javax.ejb.EJBHome を拡張 する必要があります。 7-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OAS 4.0.7 の JCORBA アプリケーションの移行 JCORBA オブジェクト・インプリメンテーションの移行 JCORBA オブジェクトのクラスで次の作業を行います。 ■ import oracle.oas.jco.* を import oracle.oas.ejb.* に変更する。 ■ クラスが javax.ejb.SessionBean をインプリメントしていることを確認する。 JCORBA の Lifecycle は EJB 内ではサポートされていません。JCORBA オブジェクト によって oracle.oas.jco.Lifecycle をインプリメントしている場合は、これを削 除する必要があります。 ■ 初期化処理をすべて ejbCreate() メソッドに移動する。また、setSessionContext メソッドに渡されたセッション・コンテキストはインスタンス変数に保存する必要があ ります。 ■ ObjectManager タイプをすべて SessionContext タイプに変更します。表 7-2 に、 ObjectManager クラスのメソッドと SessionContext クラスのマッピングを示します。 表 7-2 SessionContext と ObjectManager クラスのメソッド SessionContext ObjectManager getEnvironment() getEnvironment() setSessionContext() に渡されるパラメータ getObjectManager() getEJBObject() getSelf() getEJBObject().remove() revokeSelf() JNDI から "oas_service:logger" として取得 getLogger() getUserTransaction() getCurrentTransaction() ■ オブジェクト・クラスのすべてのパブリック・メソッドが java.rmi.RemoteException 例外を発行することをチェックする。 次の表に、JCORBA オブジェクトを EJB オブジェクトに移行した際に変更されるコードを示 します。 EJB アプリケーションへの移行 7-3 OAS 4.0.7 の JCORBA アプリケーションの移行 表 7-3 JCORBA オブジェクトの EJB オブジェクトへの変換 JCORBA EJB package myStack; import oracle.oas.jco.*; import java.util.Properties; package myStack; import javax.ejb.*; import oracle.oas.ejb.*; import java.util.Properties; import javax.naming.*; public class ServerStack implements Lifecycle { private int stackSize = 0; private String stackElements[]; private int top = -1; private ObjectManager mgr = null; private Logger logger = null; public class ServerStack implements javax.ejb.SessionBean { private int stackSize = 0; private String stackElements[]; private int top = -1; private SessionContext osc = null; private Logger logger = null; 7-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OAS 4.0.7 の JCORBA アプリケーションの移行 表 7-3 JCORBA オブジェクトの EJB オブジェクトへの変換(続き) オブジェクトへの変換(続き) JCORBA public void jcoCreate() { mgr = ObjectManager. getObjectManager(this); EJB public void setSessionContext( SessionContext ctx) { osc = ctx; } public void ejbCreate() throws CreateException { logger = mgr.getLogger(); logger.setSeverity(Logger. LOG_SEVERITY_DEBUG); try { Properties env = mgr.getEnvironment(); setStackSize(Integer.parseInt( env.getProperty( "initialStackSize"))); } catch (Exception e) {} } try { Context ctx = new InitialContext(); // logger is now a service logger = (oracle.oas.ejb.Logger) ctx.lookup ("oas_service:logger"); logger.setSeverity (oracle.oas.ejb.Logger.LOG_SEVERITY_DEBUG ); Properties env = osc.getEnvironment(); setStackSize(Integer.parseInt(env.getProp erty("initialStackSize"))); } catch (Exception e) { e.printStackTrace (System.out); throw new CreateException (e.getMessage()); } } EJB アプリケーションへの移行 7-5 OAS 4.0.7 の JCORBA アプリケーションの移行 表 7-3 JCORBA オブジェクトの EJB オブジェクトへの変換(続き) オブジェクトへの変換(続き) JCORBA EJB public void ejbRemove() { } public void ejbPassivate() { logger = null; } public void ejbActivate() { logger = (Logger) (new initialContext()). lookup("oas_service:logger"); } public int getStackSize() { logger.println(" Getting stack size..."); return stackSize; } public int getStackSize() { logger.println(" Getting stack size..."); return stackSize; } public void setStackSize(int size) throws StackException { if (size < 0) throw new StackException(); logger.println(" Setting stack size to " + size + "..."); stackSize = size; stackElements = new String[size]; } public void setStackSize(int size) throws StackException { if (size < 0) throw new StackException(); logger.println(" Setting stack size to " + size + "..."); stackSize = size; stackElements = new String[size]; } public void push(String value) throws StackException { if (top == stackSize - 1) throw new StackException(); logger.println(" Pushing ¥"" + value + "¥" onto the stack..."); stackElements[++top] = value; } public void push(String value) throws StackException { if (top == stackSize - 1) throw new StackException(); logger.println(" Pushing ¥"" + value + "¥" onto the stack..."); stackElements[++top] = value; } 7-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OAS 4.0.7 の JCORBA アプリケーションの移行 表 7-3 JCORBA オブジェクトの EJB オブジェクトへの変換(続き) オブジェクトへの変換(続き) JCORBA EJB public String pop() throws StackException { if (top == -1) throw new StackException(); logger.println(" Popping the stack (returning element " + stackElements[top] + ")..."); return stackElements[top--]; } } public String pop() throws StackException { if (top == -1) throw new StackException(); logger.println(" Popping the stack (returning element " + stackElements[top] + ")..."); return stackElements[top--]; } } パラメータをシリアライズ可能にする EJB 1.0 仕様では、すべてのパラメータがシリアライズ可能である必要があります。パラメー タ、またはパラメータ内の値として渡されたクラスは、Serializable をインプリメント するように変更する必要があります。 JCO.APP の EJB 配置記述子への変換 JCORBA アプリケーションの配布情報は JCO.APP ファイルに作成しますが、EJB アプリ ケーションの配布情報は、シリアライズされたオブジェクトの形式をとります。JCO.APP の配布情報をシリアライズされたオブジェクトに変換するには、次のようにします。 1. JCO.APP ファイルの変更 — 現在ではホーム・インタフェースが必須となったため、次の [ServerStack] のセクションに示すように、JCO.APP ファイルに、ホーム・インタ フェース名を指定するための文を追加する必要があります。 [APPLICATION] name = myStack idleTimeOut = 2000 [ServerStack] className = myStack.ServerStack remoteInterface = myStack.ServerStackRemote homeInterface = myStack.ServerStackHome #add this statement [ServerStack.ENV] ; property used by the ServerStack object initialStackSize = 10 EJB アプリケーションへの移行 7-7 OAS 4.0.7 の JCORBA アプリケーションの移行 2. ECO/Java でサポートされていないパラメータの削除 次の JCO.APP パラメータは、現在は ECO/Java でサポートされていません。新規に作 成した ECO.APP からこれらのパラメータを削除する必要があります。 アプリケーション・セクション 表 7-4 アプリケーション・プロパティ プロパティ 説明 minThreads JCORBA サーバー・プロセス内の JCORBA オブジェクトにアクセスで きるスレッドの最小数。スレッドの数は、オブジェクトが同時に扱える リクエストの数を決定します。 デフォルト : 1 maxThreads JCORBA サーバー・プロセス内の JCORBA オブジェクトにアクセスで きるスレッドの最大数。オブジェクト・インスタンスがスレッドよりも 多い場合、リクエストはスレッドが使用可能になるまで待機する必要が あります。 デフォルト : 10 オブジェクト・セクション 表 7-5 オブジェクト・プロパティ プロパティ 説明 minInstances プロセス開始時に、Oracle Application Server が JCORBA サーバー・プ ロセス内で起動するオブジェクト・インスタンスの数。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 0 maxInstances JCORBA サーバー・プロセスが保持できるオブジェクト・インスタンス の最大数。インスタンスの数は、プロセスがリクエストを受け取るたび に増加します。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 10 7-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OAS 4.0.7 の JCORBA アプリケーションの移行 表 7-5 オブジェクト・プロパティ(続き) オブジェクト・プロパティ(続き) プロパティ 説明 minThreads JCORBA サーバー・プロセスのスレッドの最小数。各オブジェクト・イ ンスタンスは 1 つのスレッドを使用します。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 1 maxThreads JCORBA サーバー・プロセスのスレッドの最大数。オブジェクト・イン スタンスがスレッドよりも多い場合、リクエストはスレッドが使用可能 になるまで待機する必要があります。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 10 poolSize プールが保持できるこのタイプのオブジェクトの数。プール・サイズは インスタンスの最大数と同じか、またはそれよりも小さくする必要があ ります。 デフォルト : 0 3. JCO.APP ファイルの変更後、jco2ejb ユーティリティを使用して、シリアライズされた 配布オブジェクトを作成します。 jco2ejb ユーティリティにより、次のものが生成されます。 ■ アプリケーション・レベルの配置記述子。このファイルの名前は、JCO.APP ファイルの [Application] セクションの name フィールドの値に "Deployment.ser" を連結したも のです。たとえば、MyStack という名前の JCORBA アプリケーションがある場合、EJB アプリケーションの記述子は MyStackDeployment.ser というファイルに存在します。 ■ JCO.APP ファイルで指定された各オブジェクトにつき、1 つの Bean レベルの配置記述 子。Bean 記述子の名前は、オブジェクト名に "Deployment.ser" を付けたものです。た とえば、ServerStack という名前の Bean がある場合、その Bean の記述子は ServerStackDeployment.ser というファイルに存在します。 ■ MANIFEST.MF というマニフェスト・ファイル。このファイルには、生成されたすべ ての Bean レベルの記述子とアプリケーション記述子のエントリが含まれます。この ファイルは、jar コマンドを -m オプションとともに使用して、EJB Jar ファイルを作成 するときに使用します。 jco2ejb を実行する構文は次のとおりです。 prompt> jco2ejb JCO.APP EJB アプリケーションへの移行 7-9 OAS 4.0.7 の JCORBA アプリケーションの移行 たとえば、jco2ejb を次の JCO.APP ファイルに対して実行する場合、次のようになります。 [APPLICATION] name = myStack idleTimeOut = 2000 [ServerStack] className = myStack.ServerStack remoteInterface = myStack.ServerStackRemote # you need to add this statement homeInterface = myStack.ServerStackHome [ServerStack.ENV] ; property used by the ServerStack object initialStackSize = 10 次のファイルが作成されます。 ■ myStackDeployment.ser。このアプリケーション・レベルの配置記述子ファイルは、 OASApplicationDescriptor クラスのシリアライズされたインスタンスです。これはアプ リケーション名を "myStack" と指定し、セッション・タイムアウト値を 2000 に設定し ます。 ■ ServerStackDeployment.ser。この Bean レベルの配置記述子ファイルは、 OASApplicationDescriptor クラスのシリアライズされたインスタンスです。Bean 名を "ServerStack" に、Bean のクラスを "myStack.ServerStack" に、そして "myStack.ServerStackHome" のホーム・インタフェース・クラス、 "myStack.ServerStackRemote" のリモート・インタフェース・クラスをそれぞれ指定し ます。また、Environment Property を名前と値のペア "initialStackSize = 20" を含むプロ パティ・オブジェクトに設定します。 ■ MANIFEST.MF。このマニフェスト・ファイルには、前述の 2 つの配置記述子のエント リと EJB パラメータが含まれます。マニフェスト・ファイルは次のようなものです。 Manifest-Version: 1.0 Name: myStackDeployment.ser OAS-Application: True Name: ServerStackDeployment.ser Enterprise-Bean: True 次の表に、JCO.APP テキスト・ファイルとアプリケーション・レベルの配置記述子のメ ソッド間のマッピングを示します。 7-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OAS 4.0.7 の JCORBA アプリケーションの移行 表 7-6 アプリケーション記述子のマッピング JCO.APP のパラメータ 記述子のパラメータ name setBeanHomeName() idleTimeOut setSessionTimeout() minInstances setMinInstances() maxInstances setMaxInstances() 次の表に、JCO.APP テキスト・ファイルと Bean レベルの配置記述子のメソッド間のマッピ ングを示します。 表 7-7 Bean 記述子のマッピング JCO.APP のパラメータ 記述子のパラメータ idleTimeOut(アプリケーションレベルのみ) setSessionTimeout() stateless setStateManagementType() [<object>] setBeanHomeName() className setEnterpriseBeanClassName() [<object>] セクションの名前と値のペア setEnvironmentProperties() remoteInterface setRemoteInterfaceClassName() transactionMode(Bean レベルのみ) setTransactionAttribute() 4.0.7 の JCORBA クライアントの移行 クライアントでは、次の作業を行います。 ■ オブジェクト・リファレンスを取得するために ObjectFactory を使用している場合は、 ObjectFactory を JNDI に置き換えます。 ■ クライアントに次の import 文を追加する。 import javax.naming.*; import java.util.Hashtable; ■ LifeCycle インタフェースのいずれかを削除します。 ■ リモート・オブジェクトによって発行される java.rmi.RemoteException 例外を捕 捉します。 EJB アプリケーションへの移行 7-11 Enterprise CORBA Objects(ECO/Java)の移行 Enterprise CORBA Objects( Objects(ECO/Java)の移行 ECO/Java)の移行 EJB アプリケーションのかわりに ECO/Java アプリケーションを作成する理由の 1 つは、 Java 以外の他言語からのアクセスが容易である点です。値によるオブジェクトの受渡し機能 は Java でのみ使用可能なため、現在、Java 以外のクライアントから EJB にアクセスするこ とはできません。 CORBA テクノロジが変更されれば、ECO/Java アプリケーションを EJB に移行することも できます。これらの API のライフサイクルが両方とも同じであるため、この移行は簡単に行 うことができます。次の項で、変換ツールを使用して EJB に変換できるように ECO/Java ア プリケーションを作成する方法を説明します。 1. リモート・インタフェースおよびホーム・インタフェースを提供する ECOObject または ECOHome を拡張する、リモート・インタフェースとホーム・イン タフェースを提供します。各インタフェースはその中のすべてのメソッドについて、例 外タイプ java.rmi.RemoteException を発行する必要があります。 2. ECO/Java オブジェクトのインプリメンテーションで次のものを提供する ■ インポート文 oracle.oas.eco.* ■ "ECO" で始まる適切なクラスを使用する。 ECO/Java アプリケーションでは、通信の例外を明示的に管理する必要はありません。 EJB アプリケーションの場合は、その反対です。このため、クライアントから EJB オブ ジェクトへの各メソッド実行では、指定されたそれぞれの状況に合せて、次のように変 更する必要があります。 ■ メソッド実行を try ブロック内に置かない。 このクラスによりインプリメントされているインタフェースのシグネチャに違反し ていない場合、メソッド・シグネチャに対して java.rmi.RemoteException 例 外を発行します。そうでない場合は、メソッドを囲む try ブロックを追加してくだ さい。 ■ try ブロックが org.omg.CORBA.SystemException 例外またはそのサブクラス の 1 つを捕捉する。 その例外またはそのサブクラスを、java.rmi.RemoteException 例外または対 応するサブクラスに置換します。CORBA と、RMI 例外およびそのサブクラス間の マッピングは、RMI/IIOP 仕様に指定されています。 ■ try ブロックに java.lang.RuntimeException のための catch 句が含まれてい る。 前述の catch 句の前に、java.rmi.RemoteException の catch 句を追加しま す。この新しい句には、java.lang.RuntimeException 句と同様の本体が必要 です。 7-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OAS 4.0.7 EJB アプリケーションの移行 ■ try ブロックに java.lang.Exception の catch 句が含まれていない。 try ブロックに java.rmi.RemoteException の catch 句を追加します。この句 の本体は、java.rmi.RemoteException のメッセージと同じメッセージを持つ java.lang.Run-timeException 例外を発行しなければなりません。 OAS ECO/Java クライアントの移行 JCORBA API の一部になっているタイプのオブジェクトに対して実行されるメソッド名につ いて、文字列 "ECO" を "EJB" に置換します。 ECO.APP の EJB 配置記述子への変換 ECO.APP ファイルを EJB 配置記述子に変換するには、7-7 ページで説明しているように、 eco2ejb ユーティリティを実行します。ホーム・インタフェースはすでに ECO.APP ファイ ルに指定されている点に注意してください。 OAS 4.0.7 EJB アプリケーションの移行 次の変更を行います。 ■ EJBHome インタフェースをインプリメントしておく必要がある。 ■ ホーム・インタフェースにアクセスするには JNDI を使用する。JNDI が返すオブジェク トはホーム・インタフェースであり、Bean の新規インスタンスではありません。この ため、"PortableRemoteObject.narrow(<reference>,<home class>)" を使用 して、JNDI が返すリファレンスを適切なホーム・インタフェースに絞り込む必要があ ります。 JNDI アクセス方式に関しては、第 5 章「EJB アプリケーションのクライアントの開発」 を参照してください。 ■ OASSessionDescriptor に関する記述を配置記述子から削除する(推奨もサポートも されていないため) 。 ■ OASApplicationDescriptor の定義は変更されました。シリアライズされた配置記 述子はすべて再生成する必要があります。 ■ 次の項の変更を行う。 EJB アプリケーションへの移行 7-13 OAS 4.0.8.0 および 4.0.8.1 EJB アプリケーションの移行 OAS 4.0.8.0 および 4.0.8.1 EJB アプリケーションの移行 次の変更を行います。 ■ org.omg.CORBA.ORB から oracle.oas.orb.CORBA.ORB に ORB オブジェクトをキャ ストします。これにより、追加のキャストを行わずに Oracle 固有のコールを実行できま す。 ■ CORBA.ORB.init() をコールしても、完全に機能する ORB は返されません。かわりに、 次をコールします。 ■ アプレットから init(Applet, Properties) ■ スタンドアロン・クライアントから init(String[], Properties) init メソッドの詳細は、Java API 仕様の org.omg.CORBA.ORB の説明を参照してく ださい。 ■ Java アプリケーションおよびアプレット内の Pure Java ORB に対応するには、 ■ org.omg.CORBA.ORBClass ■ org.omg.CORBA.SingletonORBClass の両方がパラメータとして定義されている必要があります。詳細は 5-5 ページの「クラ イアントからのネーム・サーバーへのアクセス」を参照してください。 ■ すべての .class ファイルを再コンパイルし、すべてのアプリケーションを再配布します。 JDK 1.2 実行時環境が変更されたため、この作業が必要です。 ■ 新しいバージョンの JDK に必要なコードの変更に関する詳細は、 http://java.sun.com/products/jdk/1.2/compatibility.html の「Java 2 SDK Compatibility with Previous Releases」を参照してください。 7-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 8 oasdeploy を使用したアプリケーションの 配布 oasdeploy ユーティリティを使用して、EJB と ECO/Java アプリケーションを Oracle Application Server のリモート・サイトおよびサイト全体への配布が可能です。この章では、 このユーティリティの使用方法を説明します。 注意 : アプリケーションを実行するためにこのユーティリティを使用す る場合、次の 2 つの操作により Oracle Application Server をリロードする 必要があります。[Shift] キーを押しながらブラウザの「リロード」を押 し、Oracle Application Server の GUI の「リロード」ボタンをクリックし ます。これにより、アプリケーションが正しくリロードされます。 内容 ■ oasdeploy の概要 ■ oasdeploy 構文 ■ 配布シナリオ ■ クライアントへのダウンロード ■ セキュリティ oasdeploy の概要 oasdeploy ユーティリティはコマンド・ライン・ツールです。このユーティリティを使用す ると、どのクライアント・マシンからでも、サイトのどのノードに対しても ECO/Java およ び EJB アプリケーションを配布できます。このユーティリティがアプリケーションを実行す るために Oracle Application Server を開始しておく必要はありません。開始しておく必要が あるのは、Node Manager のみです。 oasdeploy を使用したアプリケーションの配布 8-1 oasdeploy 構文 ■ プライマリ・ノード — このユーティリティは HTTP プロトコルを使用して、アプリケー ションの JAR ファイルを Node Manager リスナー経由でプライマリ・ノードに送信し ます。アプリケーションをリモート・ノードまたはクライアント・ノードに配布する前 に、JAR ファイルをプライマリ・ノードに配布する必要があります。 ■ リモート・ノード —oasdeploy を使用して、アプリケーションをすべてのカートリッ ジ・ノードまたはマルチ・ノードのサイトの特定のノードに伝播することができます。 ■ クライアント — oasdeploy ユーティリティを使用して、プライマリ・ノードからクライ アント・マシンにクライアントの JAR ファイルをダウンロードすることもできます。こ れにより、Oracle Application Server の Web サイトに属していないクライアント・マシ ンでも、アプリケーションの配布を管理できます。Oracle Application Server 内で JAR ファイルが配布されると、クライアント・マシンは配布されたアプリケーションにアク セスできるようになります。詳細は、8-8 ページの「クライアント JAR ファイルのダウ ンロード」の項を参照してください。 注意 : oasdeploy を実行する前に、Node Manager リスナーを実行して おく必要があります。 oasdeploy 構文 アプリケーションを実行するには、次の構文を使用します。 oasdeploy -u <username>/[<password>]@<hostname>:<port_number> [-j <JAR filename> | -a <application_name>] [-t eco4j | ejb] [-h] [-v] [-f] [-r] [-s] [-d <application_display_name>] [-rem <application_name>] 注意 : プライマリ・ノードに配布するときは -j、リモート・ノードまた はクライアントに配布するときは -a が必要です。 OASApplicationDescriptor を含まない EJB JAR ファイルを配布する場合 は、-a と -j の両方が必要です。この場合、マニフェスト・ファイルとシリ アライズされた記述子にはアプリケーション名が含まれません。配布時に アプリケーション名を定義する必要があります。 8-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド oasdeploy 構文 プライマリ・ノードへの配布 JAR ファイルをプライマリ・ノードに配布するためには、次のオプションを使用します。 oasdeploy -u <username>/[<password>]@<hostname>:<port_number> -j <JAR filename> [-t eco4j | ejb] [-s] プライマリ・ノードに JAR ファイルが配布されると、アプリケーションはリモート・ノード またはクライアントに配布できます。 リモート・ノードへの配布 アプリケーションがプライマリ・ノードに配布および登録された後で、これをリモート・ ノードに配布するには、次の構文を使用します。 oasdeploy -a <application_name> -u <username>/[<password>]@<hostname>:<port_number> -n <username>/[<password>]@<hostname>:<port_number> クライアントへの配布 クライアント・スタブを含む JAR ファイルをダウンロードするには、次の構文を使用しま す。 oasdeploy -a <application_name> -u <username>/[<password>]@<hostname>:<port_number> -c <client_directory> アプリケーションのプライマリ・ノードからの削除 アプリケーションをプライマリ・ノードまたはサイト全体から削除するには、次の構文を使 用します。 oasdeploy -rem <application_name> -u <username>/[<password>]@<hostname>:<port_number> -s アプリケーションのリモート・ノードからの削除 アプリケーションを特定のカートリッジ・ノードから削除するには、次の構文を使用しま す。 oasdeploy -rem <application_name> -n <username>/[<password>]@<hostname>:<port_number> -u <username>/[<password>]@<hostname>:<port_number> oasdeploy を使用したアプリケーションの配布 8-3 oasdeploy 構文 構文の表 次の表は、使用できるオプションの説明です。 表 8-1 oasdeploy オプション オプション 引数 説明 -u|-user <username>/ [<password>] @<hostname>: <port_number> <hostname> と <port_number> で指定されたサイト の、プライマリ・ノードの Node Manager のユー ザー名とパスワードを指定します。<password> が 指定されない場合は、それを入力するためのプロン プトが表示されます。このオプションは必須です。 -j|-jar <JAR filename> 配布対象のアプリケーション JAR ファイルを指定 します。プライマリ・ノードに配布するには、この オプションは必須です。 -a|-app <application_name> アプリケーション記述子に記述されているとおりに アプリケーション名を指定します。リモートまたは クライアント・ノードに配布したりアプリケーショ ンを削除する場合には、このオプションは必須で す。 EJB ではアプリケーション名は、Oracle 固有の記述 子 OASApplicationDescriptor 内に存在します。EJB アプリケーションがこの記述子を定義していない場 合は、アプリケーション名が作成されます。配布さ れた EJB アプリケーションの名前を確認するには、 GUI を調べてください。 -t|-type ECO4J | EJB アプリケーション・タイプ、つまり EJB または ECO/Java を指定します。他のタイプは将来サポー トされます。このオプションが指定されていない場 合、ECO4J と仮定されます。 -h|-help すべてのコマンド・ライン・オプションを表示しま す。 -v|-verbose verbose モードを使用可能にします。メッセージが 表示されます。 -f|-force このオプションは、既存アプリケーションを再配布 するために使用します。これが指定されると、前の アプリケーションはこの新規バージョンで上書きさ れます。このオプションを使用しない場合、同じア プリケーションは再度インストールできません。 8-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド oasdeploy 構文 表 8-1 oasdeploy オプション(続き) オプション(続き) オプション 引数 -r|-registernot -d|-displayname アプリケーションの登録を使用禁止にします。アプ リケーションの JAR ファイルの設定を変更せずに これを更新する際に、このオプションを使用しま す。アプリケーションのコンポーネントの数、タイ プまたはトランザクションの動作に変更がない場合 にのみこのオプションを使用してください。 <application_ display_name> -s|-site -n|-node 説明 Oracle Application Server Manager のアプレット・ ツリーに表示する名前を指定します。 アプリケーションがサイト内のすべてのカートリッ ジ・ノードに配布されるように指定します。デフォ ルトでは、アプリケーションはプライマリ・ノード にしか配布されません。 <username>/ [<password>] @<hostname>: <port_number> 配布されたアプリケーションを伝播する必要のある リモート・ノードの Node Manager を指定します。 <hostname> が有効なノード名でない場合、 oasdeploy を配布するノードにエラーが逆に伝播さ れます。<password> が指定されていない場合は、 そのノードで入力用のプロンプトが表示されます。 -n 引数は -u 引数とともに使用する必要があります。 配布には、プライマリ・ノードおよびリモート・ ノード上の両方で認証が必要です。 この引数は、アプリケーションがすでにプライマ リ・ノード上で実行されているものと仮定します。 -c|-client <client_directory> スタブを含む、ダウンロード済みのクライアント JAR ファイルを配置するためのクライアント・マシ ンのディレクトリを指定します。アプリケーション のクライアント JAR をプライマリ・ノードからク ライアント・マシンにダウンロードするために oasdeploy を使用するときに、このオプションを指 定します。これは、-a および -u オプションととも にのみ使用できます。 -rem|-remove <application_name> プライマリ・ノード、特定のリモート・ノードまた はサイト全体のいずれからアプリケーションを削除 するかを指定します。このオプションは、-u 引数 とともに使用する必要があります。-site または -n 引数も使用できます。 この引数は -n とともに使用すると、アプリケー ションの登録をプライマリ・ノードから解除せず、 指定されたリモート・ノードにしか影響を与えませ ん。 oasdeploy を使用したアプリケーションの配布 8-5 配布シナリオ 配布シナリオ この項では、oasdeploy を使用できるシナリオをいくつか示します。次のようなシナリオが あります。 ■ プライマリ・ノードへの配布 ■ リモート・ノードへの配布 ■ 既存アプリケーションの再配布 ■ 新規ノードへの配布 ■ 既存アプリケーションの削除 プライマリ・ノードへの配布 デフォルトでは、oasdeploy はアプリケーションをサイトのプライマリ・ノードに配布しま す。次の例では、EJB myStack アプリケーションがプライマリ・ノード(node1)に配布さ れます。 oasdeploy -u admin/adminpasswd@node1:8888 -j myStack.jar -t EJB リモート・ノードへの配布 アプリケーションを特定のリモート・ノードまたはサイトのすべてのノードに配布するよう に指定できます。前者の場合は -n オプションを使用し、後者の場合は -s を使用します。 注意 : アプリケーションをリモート・ノードに配布する前に、プライマ リ・ノードに配布しておく必要があります。 たとえば、次のコマンドは EJB アプリケーション myStack を、node24 というリモート・ ノードに配布します(サイトのプライマリ・ノードは node1)。 oasdeploy -a myStack -u admin/adminpasswd@node1:8888 -n admin_node24/passwd@node24:8888 ECO アプリケーション Stack/myStack1 をサイトのすべてのノードに配布するには、次のよ うにします。 oasdeploy -a Stack/myStack1 -u admin/adminpasswd@node1:8888 -j myStack1.jar -s アプリケーションの名前領域は階層型になっています。配布されたアプリケーション名が "Stack/myStack1" の場合、同じサイトに配布される他のアプリケーションの名前に "Stack" は使用できません。逆に、配布されたアプリケーション名が "Stack" の場合、同じサイトの アプリケーションの名前に "Stack/myStack1" は使用できません。 8-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配布シナリオ 既存アプリケーションの再配布 アプリケーション・オブジェクトのロジックを変更した場合、アプリケーションを再配布し て更新する必要があります。デフォルトでは oasdeploy は、サイトにすでに存在しているア プリケーションの再配布は行いません。既存ファイルを置き換えるための、新規のサーバー およびクライアント JAR ファイルをユーティリティで生成できるようにするには、-f オプ ションを使用する必要があります。 また、-r オプションが指定されていないかぎり、アプリケーションは Site Manager にも再 登録されます。再登録されると、アプリケーションの既存の設定情報が置き換わるため、注 意してください。 次の例では、ECO アプリケーション myStack を再登録せずに再配布します。 oasdeploy -a myStack -u admin/adminpasswd@node1:8888 -j myStack.jar -f -r 新規ノードへの配布 新しく追加されたノードに既存のアプリケーションを配布するには、次のように -n オプ ションを使用します(node100 が新規ノードです)。 oasdeploy -a myStack -u admin/adminpasswd@node1:8888 -j myStack.jar -n admin100/admin100passwd@node100:8888 既存アプリケーションの削除 oasdeploy を使用して、以前に配布されたアプリケーションを削除できます。たとえば、次 のようになります。 oasdeploy -rem mystack -u admin/adminpasswd@node1:8888 これは、アプリケーション myStack とそのファイルの登録をプライマリ・ノードから解除し ます。 リモート・ノードからアプリケーションを削除するには、次の構文を使用します。 oasdeploy -rem myStack -n admin100/admin100passwd@node100:8888 アプリケーションがプライマリ・ノードから削除されると、oasdeploy はこれをリモート・ ノードから削除できません。サイト内のすべてのノードからアプリケーションを削除するに は、次の構文を使用します。 oasdeploy -rem myStack -u admin/adminpasswd@node1:8888 -s oasdeploy を使用したアプリケーションの配布 8-7 クライアントへのダウンロード クライアントへのダウンロード oasdeploy を使用して、Oracle Application Server サイトに属さないクライアント・マシン が、アプリケーションの配布をリモートで使用できるようにします。これにより、コマン ド・ライン実行を行う際に、プライマリ・ノードにリモート・ログインする必要性が軽減さ れます。 oasdeploy をクライアント・マシン上で使用できるようにするには、既存の Oracle Application Server に一時的にアクセスが可能で、次のステップを実行できる必要がありま す。 1. 必要なファイルを格納するためのディレクトリをクライアント・マシンに作成します。 ディレクトリ・パスに設定された ORAWEB_HOME という環境変数を作成します。 2. 次のファイルを、既存の Oracle Application Server からクライアント・マシンの同じパ スにコピーします。新しい環境には専用の ORAWEB_HOME 設定の値ができます。 ■ $ORAWEB_HOME/bin/oasdeploy ■ $ORAWEB_HOME/classes/oasdeploy.jar ■ $ORAWEB_HOME/jdk/lib/rt.jar クライアント JAR ファイルのダウンロード oasdeploy を使用して、Java アプリケーションがサーバー・アプリケーションとの通信に必 要とする、クライアント・スタブの入った JAR ファイルをダウンロードできます。JAR ファ イルのダウンロード先のディレクトリを指定するには、-c オプションを使用します。たとえ ば、次のようになります。 oasdeploy -a myStack -u admin/adminpasswd@node1:8888 -c /client/stubs セキュリティ 配布可能な JAR ファイルを Oracle Application Server サイトにアップロードするクライアン トには、サイトのプライマリ・ノードの Node Manager による認証が必要です。アプリケー ションがリモート・ノードに対して配布される場合、クライアントがアプリケーションの JAR ファイルをリモート・ノードにコピーするには、そのクライアントはリモート・ノード の Node Manager による承認も必要になります。 8-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 9 リファレンス この章には、クラスのリファレンス・ページが含まれています。 ■ ■ ■ Logger クラス ■ setSeverity ■ getSeverity OASApplicationDescriptor クラス ■ OASApplicationDescriptor コンストラクタ ■ getOtherApplications ■ getTxDads ■ getTxEnabled ■ isTxEnabled ■ setOtherApplications ■ setTxDads ■ setTxEnabled ■ getAuthenticationString ■ getMaxInstances ■ getMinInstances ■ setAuthenticationString ■ setMaxInstances ■ setMinInstances OracleSSLCredential クラス ■ OracleSSLCredential リファレンス 9-1 ■ addTrustedCert ■ getTrustedCert ■ removeTrustedCert ■ getTrustedCertCount ■ setPrivateKey ■ getPrivateKey ■ getPvtKeyPassword ■ addCertChain ■ getCertChainCert ■ removeCertChainCert ■ getCertChainCount 9-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Logger クラス Logger クラス public abstract class Logger extends PrintWriter oracle.oas.ejb.Logger クラスによって、ユーザーは Oracle Application Server のロギング機 能にメッセージを書き込めます。このクラスのメソッドにより、メッセージの詳細レベルを 設定できます。実際の書込みを行うメソッドは、PrintWriter クラスのメソッドです。 図 9-1 Logger クラスの継承 java.lang.Object java.io.Writer java.io.PrintWriter oracle.oas.ejb.Logger setSeverity クラス oracle.oas.ejb.Logger 構文 public void setSeverity(int level) 説明 ロギングの詳細レベルを設定します。設定されていない場合、デフォルトは LOG_SEVERITY_DEBUG です。 パラメータ level ― 詳細レベル(0 から 15) 。次の定数を使用して、メッセージの詳細を指定できます。 値が低いほどメッセージは詳細になります。 リファレンス 9-3 getSeverity 表 9-1 Logger 変数 記号 説明 値 LOG_SEVERITY_FATAL 致命的エラー・メッセージ。 0 LOG_SEVERITY_ERROR 致命的でないエラー・メッセージ。 1 LOG_SEVERITY_WARNING 警告メッセージ。 4 LOG_SEVERITY_DEBUG デバッグ・メッセージ。これはデフォル トの詳細レベルです。 11 LOG_SEVERITY_FULL_TRACE トレース・メッセージ。 15 getSeverity クラス oracle.oas.ejb.Logger 構文 public abstract int getSeverity() 説明 ロギングの現行の詳細レベル。 戻り値 現行の詳細レベル。 9-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OASApplicationDescriptor クラス OASApplicationDescriptor クラス public abstract OASApplicationDescriptor extends SessionDescriptor oracle.oas.ejb.deployment.OASApplicationDescriptor クラスによって、EJB ア プリケーションのために、Oracle Application Server 固有のアプリケーション・レベル・パ ラメータのデフォルト値を定義できます。このクラスは、標準の javax.ejb.deployment.DeploymentDescriptor クラスと javax.ejb.deployment.SessionDescriptor クラスに追加のパラメータを提供しま す。 図 9-2 OASApplicationDescriptor クラスの継承 java.lang.Object javax.ejb.deployment.DeploymentDescriptor javax.ejb.deployment.SessionDescriptor oracle.oas.ejb.deployment.OASApplicationDescriptor OASApplicationDescriptor コンストラクタ クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public OASApplicationDescriptor() 説明 新規の OASApplicationDescriptor インスタンスを作成します。 リファレンス 9-5 getOtherApplications getOtherApplications クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public Name[] getOtherApplications() 説明 現在のアプリケーションが使用する他のアプリケーションのリストを取得します。 戻り値 アプリケーション名の配列。 getTxDads クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public String getTxDads() 説明 グローバル・トランザクションを実行する際にアプリケーションのオブジェクトが使用する トランザクションの DAD(Database Access Descriptor)。 戻り値 トランザクションの DAD 名。アプリケーションが複数のトランザクションの DAD を使用 する場合、DAD 名をカンマで区切ります。 9-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OASApplicationDescriptor クラス getTxEnabled クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void getTxEnabled() 説明 アプリケーションのオブジェクトが JTS を使用するかどうかを取得します。 戻り値 このアプリケーションでトランザクションが使用可能な場合は True、そうでない場合は False。 isTxEnabled クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void isTxEnabled() 説明 アプリケーションのオブジェクトが JTS を使用するかどうかを取得します。 戻り値 このアプリケーションでトランザクションが使用可能な場合は True、そうでない場合は False。 リファレンス 9-7 setOtherApplications setOtherApplications クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void setOtherApplications(Name otherApps[]) 説明 現在のアプリケーションが使用する他のアプリケーションのリストを定義します。 パラメータ otherApps ― 現在のアプリケーションが使用する他のアプリケーションの配列。 戻り値 n/a setTxDads クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void setTxDads(String dads) 説明 グローバル・トランザクションを実行するためにアプリケーションのオブジェクトが使用す るトランザクションの DAD(Database Access Descriptor)を定義します。 パラメータ dads ― トランザクションの DAD 名。アプリケーションが複数のトランザクションの DAD を使用する場合、DAD 名をカンマで区切ります。 9-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OASApplicationDescriptor クラス 戻り値 n/a setTxEnabled クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void setTxEnabled(boolean val) 説明 アプリケーションのオブジェクトが JTS を使用するかどうかを指定します。 パラメータ val ― アプリケーションのオブジェクトが JTS を使用する場合は true、使用しない場合は false。デフォルト値は false です。 戻り値 n/a getAuthenticationString クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public String getAuthenticationString() 説明 EJB オブジェクトの認証文字列を取得します。 リファレンス 9-9 getMaxInstances 戻り値 EJB オブジェクトの認証文字列。認証文字列のフォーマットの説明は、 setAuthenticationString() を参照してください。 getMaxInstances クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public int getMaxInstances() 説明 EJB サーバーあたりのアプリケーション・インスタンスの最大数を取得します。 戻り値 整数。 getMinInstances クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public int getMaxInstances() 説明 EJB オブジェクトの 1 つの EJB サーバーあたりのインスタンスの最小数を取得します。 戻り値 整数。 9-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OASApplicationDescriptor クラス setAuthenticationString クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void setAuthenticationString(String authStr) 説明 認証文字列と関連付けることによって EJB オブジェクトを保護します。EJB オブジェクトに アクセスするには、クライアントに認証文字列をパスする ID が必要です。 パラメータ authStr ― EJB オブジェクトの認証文字列。文字列のフォーマットは次のとおりです。 <scheme>(<realm>) [ {"|" | "&"} & <scheme>(<realm>) ... ] scheme は認証サーバー方式を指定します。次の方式のいずれかです。Basic、 Basic_Oracle、IP、Domain または noaccess。 realm は指定された方式のレルムを指定します。レルムの定義方法は、『Oracle Application Server セキュリティ・ガイド』を参照してください。方式が noaccess の場合、レルムは 空で、認証文字列は次のようになります。 noaccess() 認証文字列は、複数の " 方式(レルム)" で構成できます。たとえば、次のような認証文字 列が可能です。 Basic(myProject) & IP(buildingOne) この認証文字列は 2 つの部分で構成され、クライアントが保護されたオブジェクトにアクセ スするには、両方を満たす必要があります。クライアントは "myProject" レルムにユーザー 名とパスワードを指定し、"buildingOne" レルムには IP アドレスを指定する必要がありま す。 また、両部分を | 文字を使用して接続することもできます。この "or" 演算子は、クライアン トが認証文字列の 1 つの部分のみを満たせばよいことを示します。たとえば、次の認証文字 列の場合、 Basic(myProject) | IP(buildingOne) リファレンス 9-11 setMaxInstances クライアントは "myProject" レルムのユーザー名とパスワードを指定するか、またはクライ アントの IP アドレスが "buildingOne" レルムにある場合に、オブジェクトにアクセスできま す。 戻り値 n/a setMaxInstances クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void setMaxInstances(int val) 説明 EJB サーバーあたりのアプリケーション・インスタンスの最大数を設定します。 パラメータ val ― 整数。 戻り値 n/a 9-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OASApplicationDescriptor クラス setMinInstances クラス oracle.oas.ejb.deployment.OASApplicationDescriptor 構文 public void setMaxInstances(int val) 説明 事前に起動されるアプリケーション・インスタンスの、EJB サーバーあたりの数を設定しま す。 パラメータ val ― 整数。 戻り値 n/a リファレンス 9-13 OracleSSLCredential クラス OracleSSLCredential クラス public class OracleSSLCredential extends java.lang.Object このクラスは、credential オブジェクトを作成するためのメソッドの集合を提供します。 図 9-3 OracleSSLCredential クラスの継承 java.lang.Object oracle.security.ssl.OracleSSLCredential OracleSSLCredential クラス oracle.security.ssl.OracleSSLCredential 構文 public OracleSSLCredential() 説明 このメソッドは、このクラスの基本コンストラクタです。 addTrustedCert クラス oracle.security.ssl.OracleSSLCredential 構文 public void addTrustedCert( String b64TrustedCert ) throws NullPointerException public void addTrustedCert( byte[] DERtrustedCert ) throws NullPointerException 9-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OracleSSLCredential クラス 説明 このメソッドは、credential オブジェクトに信頼できる証明書を追加するために使用されま す。証明書は、BASE64 フォーマットの文字列または DER エンコードのバイト配列のいずれ かです。 getTrustedCert クラス oracle.security.ssl.OracleSSLCredential 構文 public byte[] getTrustedCert( int index ) throws IllegalArgumentException 説明 このメソッドは、index の位置にある、証明書を表す DER エンコードのバイト配列を返しま す。 removeTrustedCert クラス oracle.security.ssl.OracleSSLCredential 構文 public byte[] removeTrustedCert( int index ) throws IllegalArgumentException 説明 このメソッドは、index の位置にある証明書を削除します。 リファレンス 9-15 getTrustedCertCount getTrustedCertCount クラス oracle.security.ssl.OracleSSLCredential 構文 public int getTrustedCertCount() 説明 このメソッドは、この credential オブジェクトに含まれる証明書の数を返します。 setPrivateKey クラス oracle.security.ssl.OracleSSLCredential 構文 public void setPrivateKey( String String public void setPrivateKey( byte[] String b64pvtKey password ) throws NullPointerException DERpvtKey password ) throws NullPointerException 説明 このメソッドは、秘密鍵とパスワードを credential オブジェクトに割り当てます。秘密鍵は、 BASE64 フォーマットの文字列または DER エンコードのバイト配列のいずれかです。 9-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OracleSSLCredential クラス getPrivateKey クラス oracle.security.ssl.OracleSSLCredential 構文 public byte[] getPrivateKey() 説明 このメソッドは、秘密鍵を表す DER エンコードのバイト配列を返します。 getPvtKeyPassword クラス oracle.security.ssl.OracleSSLCredential 構文 public String getPvtKeyPassword() 説明 このメソッドは、秘密鍵のパスワードを返します。 addCertChain クラス oracle.security.ssl.OracleSSLCredential 構文 public void addCertChain( String b64certChainCert ) throws NullPointerException public void addCertChain( byte[] DERcertChainCert ) throws NullPointerException リファレンス 9-17 getCertChainCert 説明 このメソッドは、証明書チェーンに証明書を追加するために使用されます。証明書は、 BASE64 フォーマットの文字列または DER エンコードのバイト配列のいずれかです。 getCertChainCert クラス oracle.security.ssl.OracleSSLCredential 構文 public byte[] getCertChainCert( int index ) throws IllegalArgumentException 説明 このメソッドは、証明書チェーン内の index の位置にある、証明書を表す DER エンコードの バイト配列を返します。 removeCertChainCert クラス oracle.security.ssl.OracleSSLCredential 構文 public void removeCertChainCert( int index ) throws IllegalArgumentException 説明 このメソッドは、証明書チェーンの index の位置にある証明書を削除します。 9-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OracleSSLCredential クラス getCertChainCount クラス oracle.security.ssl.OracleSSLCredential 構文 public int getCertChainCount() 説明 このメソッドは、証明書チェーンに含まれる証明書の数を返します。 リファレンス 9-19 getCertChainCount 9-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 第 II 部 Enterprise CORBA for Java Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 10 Enterprise CORBA Objects for Java 内容 ■ Enterprise CORBA Objects for Java コンポーネント・モデル ■ Oracle Application Server の ECO/Java 機能 ■ ECO/Java オブジェクトのクライアント表示 ■ ECO/Java アプリケーションと Web アプリケーションの相違点 ■ ツールと開発プロセス ■ PL/SQL プロシージャの起動 ■ 開発のフローチャート Enterprise CORBA Objects for Java コンポーネント・モデル Enterprise CORBA Objects for Java(ECO/Java)は、Oracle Application Server のコンポー ネント・モデルです。ECO/Java は、値によるオブジェクトの受渡しをサポートしていない クライアントのサポート用に作成されました。これには Java 以外のクライアント、ブラウ ザ・クライアントおよび RMI ベースではない Java クライアントが含まれます。 ECO/Java サーバーは、CORBA 環境をベースにしています。このため、ECO/Java オブ ジェクト、コンテナおよびサーバーは CORBA オブジェクトで、すべての CORBA クライア ントからアクセス可能です。ECO/Java インタフェースは、すべて org.omg.CORBA.object を拡張します。 ECO/Java は EJB 仕様に似ています。これは、将来この 2 つのモデル間で変換できるように することを目的に提供されています。このため、ECO/Java には次のような EJB コンポーネ ント要件があります。 ■ オブジェクトの作成、メソッドの実行およびオブジェクトの解放のためのホーム・イン タフェースおよびリモート・インタフェース。 Enterprise CORBA Objects for Java 10-1 Oracle Application Server の ECO/Java 機能 ■ ECO/Java オブジェクトはコンテナおよびサーバー内に存在する。このコンテナおよび サーバーには、EJB コンテナおよび EJB サーバーと同じ機能があります。 Oracle Application Server には、設定および管理用ソフトウェア、ECO/Java コンテナおよ びサーバーが用意されています。ユーザーは、業務アプリケーション・ロジックを含んだ ECO/Java オブジェクトを用意します。 ユーザー作成の ECO/Java オブジェクトは、ECO/Java アプリケーション内に存在します。 配布情報ファイル内でオブジェクトとアプリケーションを設定し、このファイルを Oracle Application Server 内に配布します。配布後、特定のアプリケーション・レベルのパラメー タを変更できます。ただし、Oracle Application Server Manager からオブジェクトの設定を 変更することはできません。配布ファイルの詳細は第 12 章「配布情報ファイルの作成」を、 設定と配布の詳細は『Oracle Application Server 管理者ガイド』を参照してください。配布 後は、Oracle Application Server が ECO/Java アプリケーションおよびそのアプリケーショ ンに含まれるすべてのオブジェクトを管理します。 Oracle Application Server の ECO/Java 機能 EJB コンポーネントと同様に、ECO/Java アプリケーションには 6 つのロールが必要です。 ECO/Java オブジェクト・ プロバイダ ユーザーが提供します。Oracle Application Server の ECO/ Java フレームワーク下で実行される業務ロジック。 アプリケーション・アセンブラ Oracle Application Server では独自の JNDI 名前領域を使用 して、アプリケーション内に ECO/Java オブジェクトがグ ループ化されます。これにより、大型のサイトを管理しや すくなります。 配布者 Oracle Application Server は、その上に ECO/Java アプリ ケーションを配布するプラットフォームです。Oracle Application Server は、各アプリケーションに関する配布情 報ファイルを読み込み、インプリメントします。 コンテナおよびサーバー・ プロバイダ Oracle Application Server には、ECO/Java コンテナを配布 してサービスをインプリメントするサーバー・プロセスが 用意されています。 システム管理者 Oracle Application Server には、Oracle Application Server Manager が用意されています。これは、アプリケーション の監視および管理に使用できる一連の HTML フォームで す。 ECO/Java アプリケーションを配布するプラットフォームとして Oracle Application Server を使用する場合、Oracle Application Server は、サーバー・プロバイダとコンテナ・プロバ イダの役割を果たします。アプリケーションのアセンブリ、配布およびシステム管理に役立 つ環境も用意されています。ECO/Java アプリケーションのインストール時に、そのアプリ ケーションの配布ファイルを指定します。 10-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Oracle Application Server の ECO/Java 機能 図 10-1 に、ECO/Java コンポーネント・アプリケーションが Oracle Application Server 内で 配布される様子を示します。 図 10-1 Oracle Application Server の ECO/Java インフラ内のコンポーネント Oracle Application Server (JVM) ECO/Java サーバー・プロセス ECO/Java コンテナ アプリケーション・インスタンス オブジェクト オブジェクト オブジェクト RM プロキシ ORB クライアント ECO/Java アプリケーションでは、ECO/Java オブジェクトはアプリケーション・インスタ ンス内に存在します。アプリケーション・インスタンス自体は ECO/Java コンテナ内に存在 します。ECO/Java コンテナは、ライフサイクル制御、トランザクション、セキュリティお よび同時実行性などのランタイム・サービスを提供します。ECO/Java アプリケーションの 配布時に、Oracle Application Server がこれらのコンテナを提供します。 ECO/Java サーバーには ECO/Java コンテナが含まれます。Oracle Application Server では、 1 つの ECO/Java サーバーが 1 つのプロセスに対応し、カートリッジ・プロセスのように管 理されます。ECO/Java サーバーには、プロセスおよびスレッド管理、ロード・バランシン グおよびロギングなどの ECO/Java のランタイムおよびサービスに必要な、JVM パッケー ジと Java パッケージが用意されています。これは、ECO/Java アプリケーションの実行フ レームワークを提供します。 Oracle Application Server の RM プロキシは、CosNaming サービスと、クライアントがア プリケーション・インスタンスに接続する際の認証を提供します。クライアントがアプリ ケーション・インスタンスに関連付けられると、そのクライアントとアプリケーション・イ ンスタンス間の通信は ECO/Java サーバーを経由して行われます。 Enterprise CORBA Objects for Java 10-3 ECO/Java オブジェクトのクライアント表示 現行リリースの制約 Oracle Application Server 4.0 のこのリリースでは、ECO/Java コンポーネントに次のような 制約があります。 ■ エンティティ・オブジェクトはサポートされていません。エンティティ・オブジェクト とセッション・オブジェクトの 2 つのタイプのオブジェクトが存在します。現行バー ジョンの Oracle Application Server では、エンティティ・オブジェクトはサポートされ ていません。Oracle Application Server では、セッション・オブジェクトのみサポート しています。 ■ IIOP マッピングは、JavaSoft により定義されている Java RMI/IIOP の標準マッピングに は準拠していません。 ECO/Java オブジェクトのクライアント表示 ECO/Java には、ホーム・インタフェースとリモート・インタフェースの 2 つのクライアン ト用インタフェースが用意されています。リモート・インタフェースを RMI リモート・イ ンタフェースと混同しないようにしてください。今後このマニュアルでは、リモート・イン タフェースは、RMI リモート・インタフェースの拡張である ECO/Java リモート・インタ フェースのことを指します。 ■ ホーム・インタフェース : クライアントは、ホーム・インタフェースを使用してオブ ジェクトのインスタンスを検索し、作成します。 クライアントは、JNDI(Java Naming and Directory Interface)を通じてホーム・イン タフェースを検索します。アプリケーションの JNDI 名前領域は、Java 仮想マシン (JVM)内に存在します。クライアントがアプリケーションの JNDI 名前領域を通過する と、アプリケーション・インスタンスが自動的にクライアントに関連付けられます。こ のアプリケーション・インスタンスには、アプリケーションの名前領域全体が含まれ、 アプリケーション内のオブジェクトのすべてのホーム・インタフェースを検索するため に使用されます。 クライアントは、ホーム・インタフェースの create() メソッドを使用してオブジェク トのインスタンスを作成します。 ■ リモート・インタフェース : クライアントは、Beans のリモート・インタフェースを通 じて Beans のメソッドにアクセスします。このインタフェースは、Beans がコンテナに 配布されたときに作成されるオブジェクトによりインプリメントされます。 10-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECO/Java アプリケーションと Web アプリケーションの相違点 図 10-2 ECO/Java アーキテクチャ ECO/Java サーバー クライアント ECO ホーム オブジェクト ECO リモート ECO ホーム オブジェクト ECO リモート ECO ホーム オブジェクト ECO リモート ECO コンテナ ECO/Java アプリケーションと Web アプリケーションの相違点 Oracle Application Server 環境では、ECO/Java アプリケーションと他のアプリケーション との間には大きな違いがあります。 トランスポート・プロトコル Internet Inter-Orb Protocol(IIOP)2.0 は、次の 2 つの間で使用されるトランスポート・プ ロトコルです。 ■ クライアントおよび ECO/Java アプリケーション ■ 別の Java 仮想マシンで稼動する Beans 従来の Web アプリケーションでは、トランスポート・プロトコルに HTTP を使用します。 IIOP(Internet Inter-ORB Protocol)は、OMG(Object Management Group、 http://www.omg.org)で定義されている CORBA のトランスポート・プロトコルです。 クライアントやアプリケーションを作成する場合、Oracle Application Server はインフラス トラクチャ・コード(スタブやスケルトンなど)を生成して、CORBA/IIOP アーキテク チャをサポートします。CORBA/IIOP は、クライアントが ECO/JAVA オブジェクトに直接 接続できるようにするために使用します。初期化プロセスの後は、クライアントのリクエス トとアプリケーションのレスポンスは Oracle Application Server を経由しません。 Enterprise CORBA Objects for Java 10-5 ツールと開発プロセス クライアント ECO/Java アプリケーションのクライアントは、従来のスタンドアロン CORBA ベースの Java クライアントまたは Java 以外のクライアント、あるいは同一アプリケーションまたは 別のアプリケーション内に存在する ECO/Java オブジェクトなどです。これらのクライアン トは、HTTP ベースのブラウザまたは EJB クライアントではありません。 ブラウザに URL を入力して ECO/Java アプリケーションにアクセスすることはできません。 かわりに、ブラウザ内で実行されているアプレットが ECO/Java アプリケーションのクライ アントになります。ブラウザから Web ベースのアプリケーションを実行すると、アプリ ケーションは処理を実行し、HTTP を使用して HTML ページをブラウザに返します。次に、 ブラウザはその HTML を解釈して表示します。 ツールと開発プロセス ECO/Java オブジェクトの開発には、Java 1.2 以上をサポートする Java 開発環境ならどれで も使用できます。たとえば、Oracle JDeveloper やサン・マイクロシステムズ社の JDK など を使用できます。Oracle JDeveloper の利点の 1 つは、ECO/Java オブジェクトのローカル・ デバッグ機能を備えていることです。 また、アプリケーションをパッケージ化するには JAR ユーティリティが必要です。JAR はサ ン・マイクロシステムズ社の JDK に付属しています。EJB とは異なり、ECO/Java アプリ ケーション用のシリアライズされた配置記述子を生成する必要はありません。必要なのは、 テキスト・ファイルである配布情報ファイルの作成のみです。 PL/SQL プロシージャの起動 Java アプリケーションから PL/SQL プロシージャおよびファンクションを実行できるよう にするには、pl2java を使用します。これは、PL/SQL プロシージャの Java ラッパー・クラ スを生成するユーティリティです。 pl2java を使用する前に、ご使用のアプリケーションの環境変数に次の値を追加する必要が あります。 表 10-1 pl2java の起動に必要な環境変数 名前 値 LD_LIBRARY_PATH(UNIX のみ) $ORACLE_HOME/ows/cartx/jweb/lib PATH(Windows NT のみ) %ORACLE_HOME%¥ows¥cartx¥jweb¥lib pl2java ユーティリティの詳細は、 『Oracle Application Server JServlet および JCO アプリ ケーション開発者ガイド』を参照してください。 アプリケーションの環境変数の更新に関する詳細は、 『Oracle Application Server 管理者ガイ ド』を参照してください。 10-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 開発のフローチャート 開発のフローチャート 次のフローチャートに、ECO/Java アプリケーションとそのクライアントを作成するために 必要なステップの全体を示します。 図 10-3 開発プロセスのフローチャート ECO/Java オブジェクトの作成 アプリケーションの JAR ファイルの作成 リモートおよび ホーム・インタ フェースの作成 ECO/Java アプリケーションの 配布 サポート・クラスの 作成 クライアント・ アプリケーションの 作成 クラスの コンパイル クライアントの JAR ファイルの作成 配布情報ファイル の作成 クライアントの実行 Enterprise CORBA Objects for Java 10-7 開発のフローチャート ECO/Java コンポーネントの作成 — 第 11 章を参照 ECO/Java コンポーネントを作成するには、次のステップを実行する必要があります。 1. ECO/Java のインプリメンテーションの作成 2. ECO/Java リモート・インタフェースおよびホーム・インタフェースの作成 3. 例外、データ構造などのサポート・クラスの作成 ECO/Java コンポーネントのコンパイルおよび配布 — 第 12 章を参照 ECO/Java コンポーネントを作成したら、次のステップを実行する必要があります。 4. クラスのコンパイル 5. 各 Beans およびアプリケーションのマニフェスト・ファイルと配置記述子の作成 6. アプリケーションの JAR ファイルの作成 7. Oracle Application Server 内での ECO/Java アプリケーションの配布 クライアントの作成 — 第 13 章を参照 8. クライアント・アプリケーションの作成 9. クライアントの JAR ファイルの作成 10. クライアントの実行 10-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 11 ECO/Java オブジェクトの作成 この章では、主に ECO/Java オブジェクトの作成と使用について説明します。ECO/Java の フレームワークは、EJB のフレームワークに似ています。このリリースでは、ECO/Java オ ブジェクトは SessionBean インタフェースを拡張します。次回のリリースでは、ECO/Java オブジェクトは EntityBean インタフェースを拡張できるようになる予定です。 オブジェクトが CORBA 中心で、CORBA がサポートしているどの言語からでもアクセスで きるという点で、ECO/Java は EJB と異なります。JNDI インタフェースまたは CosNaming を通じて、どの ECO/Java オブジェクトにでもアクセス可能です。さらに、既存の CORBA アプリケーションを ECO/Java アプリケーションに変換することもできます。これにより、 Oracle Application Server を使用して CORBA アプリケーションのインストールおよび管理 が可能です。 内容 ■ ECO/Java オブジェクトの作成ステップ ■ クライアント・インタフェース ■ SessionBean クラスの作成 ■ ECO/Java オブジェクトのリモート実行 ■ 状態を保持する ECO/Java オブジェクトおよび状態を保持しない ECO/Java オブジェクト ■ CORBA IDL アプリケーションの ECO/Java への変換 ■ EJB への変換を容易にするためのガイドライン ECO/Java オブジェクトの作成 11-1 ECO/Java オブジェクトの作成ステップ ECO/Java オブジェクトの作成ステップ ECO/Java オブジェクトを作成するには、次のステップを実行します。 1. オブジェクトのリモート・インタフェースを作成します。リモート・インタフェースで は、クライアントから実行可能なメソッドを宣言し、oracle.oas.eco.ECOObject を拡張する必要があります。 2. オブジェクトのホーム・インタフェースを作成します。ホーム・インタフェースでは oracle.oas.eco.ECOHome を拡張する必要があります。さらに、ホーム・インタ フェースではオブジェクトの create メソッドを定義します。 3. 機能をインプリメントする SessionBean クラスを作成します。これには、次のメソッド が含まれます。 a. リモート・インタフェースで宣言したメソッドのインプリメンテーション。 b. oracle.oas.eco.SessionBean インタフェースに定義されているメソッド。 c. ホーム・インタフェースの create メソッドのパラメータに一致するパラメータを 持つ ecoCreate メソッド。 4. アプリケーションの配布情報ファイルを作成します。この ECO.APP というファイルに は、インプリメンテーション・クラス、リモート・インタフェースおよびホーム・イン タフェースの名前が含まれます。さらに、このファイルには、アプリケーションの配布 に必要な一般情報も含まれています。第 12 章「配布情報ファイルの作成」を参照して ください。 5. オブジェクトのインプリメンテーション・クラス、リモートおよびホーム・インタ フェース、サポートされているクラスおよび配布情報ファイル ECO.APP を含んだ JAR ファイルを作成します。この JAR ファイルには、アプリケーション内のすべてのオブ ジェクトの定義を含める必要があります。 注意 : 作成する ECO/Java オブジェクトが別のオブジェクトにアクセス する場合、別の ECO/Java オブジェクトから ECO/Java オブジェクトを参 照する方法の詳細については、13-3 ページの「オブジェクトのオブジェク ト・リファレンスの取得」の項を参照してください。 クライアント・インタフェース ECO/Java オブジェクトは、リモート・インタフェースとホーム・インタフェースの 2 つの クライアント・インタフェースを備えています。リモート・インタフェースでは、業務機能 を実行するためにオブジェクトのクライアントから実行できるメソッドを指定します。ホー ム・インタフェースは、新規作成されたオブジェクトにリファレンスを返すようなオブジェ クトをクライアントが作成する方法を定義します。いずれのインタフェースにも同様の制限 があります。 ■ リモート・インタフェースおよびホーム・インタフェースのインプリメンテーションの要件 11-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド クライアント・インタフェース ■ リモート・インタフェースの作成 ■ ホーム・インタフェースの作成 ■ 例外クラスの作成 リモート・インタフェースおよびホーム・インタフェースの インプリメンテーションの要件 要件 説明 CORBA 規格合致性 javax.eco.ECOObject および oracle.oas.eco.ECOHome インタフェースは org.omg.CORBA.Object を拡張します。ユーザー定義のインタ フェースもすべて org.omg.CORBA.Object を拡張します。 主キー 主キーは、ECO/Java EntityBeans に使用されます。Oracle Application Server は、現在 ECO/Java 内のエンティティ・オブ ジェクトをサポートしていないため、ホーム・インタフェース内 の remove(Object) メソッドなど、主キーを必要とするメソッ ドはサポートされていません。 命名規則 org.omg.CORBA.Object を拡張するインタフェースは、すべて IDL マッピングの命名規則に従っている必要があります。この命 名規則には、識別子の先頭にアンダーバー記号(_)を付けるこ とができない、またはドル記号($)を含めることができない、 という規則が含まれます。アプリケーション名とオブジェクト名 にはスラッシュ記号(/)を含めることができます。 リモート・インタフェースの作成 オブジェクトのリモート・インタフェースは、そのオブジェクトのメソッドにアクセスする ためのインタフェースをクライアントに提供します。リモート・インタフェースでは、リ モート・アクセス用にインプリメントされるメソッドを定義します。 リモート・インタフェースは、oracle.oas.eco.ECOObject インタフェースを拡張しま す。これは次のように定義されます。 public interface ECOObject extends org.omg.CORBA.Object { ECOHOME getECOHome(); // returns reference to home interface Handle getHandle(); // returns serializeable handle to object org.omg.CORBA.Any getPrimaryKey(); // not supported boolean isIdentical(ECOObject obj); void remove() throws RemoveException; } ECO/Java オブジェクトの作成 11-3 クライアント・インタフェース ECOObject インタフェースのメソッドをインプリメントする必要はありません。これらの メソッドは、ECO/Java コンテナがインプリメントします。 機能 説明 getECOHome() この特定のオブジェクトのホーム・インタフェースのオブジェク ト・リファレンスを取得します。 getHandle() getPrimaryKey() ECO/Java オブジェクト・リファレンスのシリアライズ可能な Java 表現は、リモート・インタフェースの getHandle メソッド を使用して取得できます。このハンドルはシリアライズ可能で、 (オブジェクト・インスタンスがアクティブな限り)同じオブジェ クトへの接続を再確立するために使用できます。この Handle クラ ス内の getECOObject メソッドを使用して、オブジェクト・イン スタンスを取り出します。 getPrimaryKey メソッドは、今後 ECO/Java EntityBeans がサ ポートされたとき用に定義されています。今回のリリースではサ ポートされていません。 isIdentical() このメソッドをコールするオブジェクトと、引数のオブジェクト が同じであること(コンテナに関するかぎり)をテストします。 これは、これらのオブジェクトがあらゆる用途について同一であ ることを識別します。 remove() ECO/Java オブジェクトを非アクティブにします。これによって、 次にオブジェクト・インスタンスを破棄します(状態を保持する 場合)。 例 次のコード例は ServerStackRemote というリモート・インタフェースを示しています。 これは、getStackSize、setStackSize、push および pop という 4 つのメソッド(オブジェク トにインプリメントされている)を宣言します。 package myStack; public interface ServerStackRemote extends oracle.oas.eco.ECOObject { public int getStackSize(); public void setStackSize(int size) throws StackException; public void push(String value) throws StackException; public String pop() throws StackException; } 11-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド クライアント・インタフェース ホーム・インタフェースの作成 クライアントは、主にオブジェクトのホーム・インタフェースを使用してオブジェクトのイ ンスタンスを作成します。ハンドルが指定されていれば、オブジェクトのホーム・インタ フェースを使用して、org.omg.CORBA.Object インタフェース経由でオブジェクトに関す るメタデータ情報を取り出したり、オブジェクトを削除できます。 ホーム・インタフェースは、oracle.oas.eco.ECOHome インタフェースを拡張する必要 があります。この定義は次のようになります。 public interface ECOHome extends org.omg.CORBA.object { ECOMetaData getECOMetaData(); void remove(Handle handle) throws RemoveException; } ECOHome インタフェースのメソッドは、コンテナによってインプリメントされます。クラ イアントは、ホーム・インタフェースまたはリモート・インタフェースに定義されている remove メソッドを使用して、ECO オブジェクトを削除できます。 ECO/Java オブジェクトの作成 ホーム・インタフェースは、オブジェクトに適切な create メソッドを定義する必要がありま す。クライアントは、ホーム・インタフェース内で宣言されている create メソッドを実行 します。コンテナが返され、適切なパラメータ・シグネチャを使用して、オブジェクトのイ ンプリメンテーションの ecoCreate メソッドをコールします。パラメータ引数を使用し て、新規オブジェクトの状態を初期化できます。 注意 : ご使用の create メソッドで使用できるシグネチャは、Beans が 状態を保持するかしないかに依存します。状態を保持しない Beans の場合 は、初期化時にパラメータを設定できません。詳細は、11-14 ページの 「状態を保持する ECO/Java オブジェクトおよび状態を保持しない ECO/ Java オブジェクト」を参照してください。 例 次のサンプル・コードは、ServerStackHome というホーム・インタフェースを示していま す。この create メソッドは状態を保存しないオブジェクトであるため、引数が含まれませ ん。 package myStack; public interface ServerStackHome extends oracle.oas.eco.ECOHome { public ServerStackRemote create() throws oracle.oas.eco.CreateException; } ECO/Java オブジェクトの作成 11-5 SessionBean クラスの作成 例外クラスの作成 リモート・インタフェースのメソッドは例外を発行できます。メソッドが例外を発行する と、ECO/Java オブジェクトのメソッドのインプリメンテーションも同じ例外を発行する か、あるいはその例外のサブクラスを発行する必要があります。つまり、リモート・インタ フェースにリストされる例外は、インプリメントされているメソッドが発行する例外のスー パークラスでも構いません。 プレーンな Java の Throwable サブクラスまたは Error サブクラスを発行することはできま せん。それらは java.lang.Exception のサブクラスである必要があります。Java の例外 は、IDL メソッド定義の raises 句にある IDL 例外にマップされます。 org.omg.CORBA.UserException のサブクラスは、標準の CORBA IDL として定義でき るため、特に有用です。 java.lang.Exception のサブクラスになっている例外は、UserException のサブクラ スでない限り、Java クライアントしか解析できないため注意してください。 ServerStack クラスのメソッドには、StackException 例外を発行できるものがあります。オ ブジェクトからクライアントに例外を転送する場合は、その例外のクラスを定義する必要が あります。 次のコードで例外クラスを定義しています。これは StackException.java 内に存在します。 package myStack; public final class StackException extends Exception { public StackException() { } } SessionBean クラスの作成 SessionBean オブジェクトには、ご使用のオブジェクトの業務ロジックが含まれます。この オブジェクトは、次のメソッドをインプリメントします。 ■ リモート・インタフェース内で宣言されたオブジェクト・メソッド。 アプリケーションのオブジェクトは ServerStack という 1 つのクラスで構成されます。 これには、値の出し入れが可能な、後入れ先出し方式の簡単なスタックがインプリメン トされています。このクラスには次の 4 つのパブリック・メソッドが含まれています。 ■ setStackSize() は、スタックが保持できる値の数を設定します。 ■ getStackSize() は、スタックが保持できる値の数を返します。 ■ push() は、スタックに値を入れます。 ■ pop() は、スタックから値を取り出します。 11-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionBean クラスの作成 ■ SessionBean インタフェース内で宣言されたメソッド。 ■ ホーム・インタフェース内で宣言された create メソッドに対応する ecoCreate メソッド。 対応する create メソッドをクライアントが実行したときに、コンテナは ecoCreate メ ソッドを実行します。 インプリメントされるインタフェース SessionBean オブジェクトは、oracle.oas.eco.SessionBean インタフェースをインプ リメントします。このインタフェースの定義は次のとおりです。 public interface SessionBean extends oracle.oas.eco.ECOBean { void ecoActivate(); void ecoPassivate(); void ecoRemove(); void setSessionContext(SessionContext ctx); } 注意 : 現在コンテナは、ecoActivate メソッドと ecoPassivate メ ソッドを実行しません。それでも、両方のメソッドに空のメソッドをイン プリメントする必要があります。さらに、これらのメソッドがコールされ たかのようにインプリメントすることも可能です。これにより、これらの メソッドが今後のリリースでサポートされたときに、ECO/Java アプリ ケーションに戻って修正する必要がなくなります。 ecoPassivate の使用 オブジェクトは、非アクティブの期間に入ったときにコンテナによって非アクティブ状態に 設定できます。オブジェクトがパッシブ状態に設定されると、そのオブジェクトの状態が一 時的に 2 次記憶装置へ転送されます。このプロセスは、パッシブ化と呼ばれます。 コンテナがオブジェクトをパッシブにする前に、ecoPassivate 内で次の 2 つを行う必要 があります。 ■ オブジェクトがシリアライズ可能であることを確認する。オブジェクト・インスタンス の状態がシリアライズ可能であることを確認する必要があります。インスタンスの状態 がシリアライズ可能でない場合、そのインスタンスはコンテナによって破棄される場合 があります。このため、オブジェクトをシリアライズできない属性は、一時的なものと 宣言するか、あるいは NULL に設定する必要があります。 ■ オープン・リソースをすべてクローズする。パッシブにする前に、オープン・リソース をすべてクローズできます。たとえば、データベース接続やオープン・ファイル・ハン ドルはどれもシリアライズ不可能なため、オブジェクトをパッシブにする前にクローズ する必要があります。また、ecoPassivate 内に大きなデータ構造体をリリースでき ます。これは、ecoActivate 内で簡単に再構築できます。実際のオブジェクトのパッ シブ化はコンテナが行います。 ECO/Java オブジェクトの作成 11-7 SessionBean クラスの作成 ecoActivate の使用 パッシブになったオブジェクトをアクティブな状態に再構築するプロセスは、アクティブ化 と呼ばれます。ecoActivate メソッドを使用して、オブジェクト・インスタンスの状態を 再構築するために必要なタスクが実行されます。この作業には、データベース接続のオープ ン、適切なファイル・ハンドルのオープンおよび ecoPassivate の間に破棄されたデータ 構造体の再構築などが含まれます。コンテナは、ecoActivate が実行される前に、シリア ライズされたインスタンスの状態をロードします。 ecoRemove の使用 コンテナは、コンテナからオブジェクトを削除する前に、ecoRemove メソッドをコールし ます。このメソッドは、通常オブジェクトが破棄される前に行うクリーン・アップを実行す るために使用されます。これには、データベース接続または他のリソースのクローズなどが 含まれます。 setSessionContext の使用 このメソッドは、そのコンテキストへのリファレンスを保持するためにオブジェクト・イン スタンスが使用します。オブジェクトにはセッション・コンテキストが存在します。コンテ ナはこれを維持し、オブジェクトから使用できるようにします。オブジェクトはセッショ ン・コンテキストのメソッドを使用して、コンテナにコールバック・リクエストを発行しま す。 コンテナは、まずオブジェクトのインスタンスを初期化してから、setSessionContext メソッドを実行し、そのオブジェクトがセッション・コンキストを取り出せるようにしま す。コンテナが、トランザクション・コンテキスト内からこのメソッドをコールすることは ありません。この時点でオブジェクトがセッション・コンテキストを保存しないと、そのオ ブジェクトはセッション・コンテキストにアクセスできなくなります。 コンテナがこのメソッドをコールする際、SessionContext オブジェクトのリファレンスを ECOJava オブジェクトに渡します。その後、ECO/Java オブジェクトはそのリファレンスを 後で使用するために保管できます。次の例では、sessctx 変数にセッション・コンテキス トを保存するオブジェクトを示しています。 package myStack; import oracle.oas.eco.*; import java.util.Properties; import javax.naming.InitialContext; public class myObject implements SessionBean { private SessionContext sessctx = null; void setSessionContext(SessionContext ctx) { sessctx = ctx; // reference is stored in // instance variable 11-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionBean クラスの作成 } // other methods in the object } oracle.oas.eco.SessionContext インタフェースの定義は次のとおりです。 public interface SessionContext extends oracle.oas.eco.ECOContext { ECOObject getECOObject(); } また、oracle.oas.eco.ECOContext インタフェースの定義は次のとおりです。 public interface ECOContext { Properties oracle.oas.eco.UserTransaction boolean void boolean Identity ECOHOME getEnvironment(); getUserTransaction(); getRollbackOnly(); setRollbackOnly(); isCallerInRole(identity caller); // not supported getCallerIdentity(); // not supported getECOHome(); } ECO/Java オブジェクトは表 11-1 にリストされている処理を行う際に、セッション・コンテ キストを必要とします。 表 11-1 SessionContext 操作 メソッド 説明 getEnvironment() オブジェクトのプロパティの値を取得する。 getUserTransaction() プログラムによってトランザクションを区切ることのできる、 トランザクション・コンテキストを取得する。これは、 TX_BEAN_MANAGED でトランザクションを使用可能と指定さ れているオブジェクトにのみ有効です。 setRollbackOnly() コミットできないように現行のトランザクションを設定する。 getRollbackOnly() 現行のトランザクションがロールバックのみを行うように設定さ れているかどうかチェックする。 getECOHome() オブジェクトの対応する ECOHome(ホーム・インタフェース) へのオブジェクト・リファレンスを取得する。 ECO/Java オブジェクトの作成 11-9 SessionBean クラスの作成 ECO/Java オブジェクトの例 次のコードは、ServerStack という ECO/Java オブジェクトのメソッドをインプリメントし ます。 この例では、Oracle Application Server の Logger サービスを使用しています。このサービ スは、"oas_service:logger" URL を使用して JNDI を通じてアクセスされます。返さ れるオブジェクトは、oracle.oas.eco.Logger クラスです。これは、Oracle Application Server のインフラストラクチャを使用してメッセージのログを記録するために使用できま す。 package myStack; import oracle.oas.eco.*; import java.util.Properties; import javax.naming.InitialContext; public class ServerStack implements SessionBean { private int stackSize = 0; private String stackElements[]; private int top = -1; private SessionContext sc = null; private Logger logger = null; //implement the methods from SessionBean: ecoActivate, ecoPassivate, //ecoRemove, and setSessionContext. //store the session context for future use public void setSessionContext(SessionContext sc) { this.sc = sc; } //implement ecoCreate, which is called by the container when the //Home create is invoked by the client. public void ecoCreate() throws CreateException { Properties env = sc.getEnvironment(); //retrieve OAS logging service and initialize. try { logger = (Logger)(new InitialContext()).lookup("oas_service:logger"); logger.setSeverity(Logger.LOG_SEVERITY_DEBUG); } catch(javax.naming.NamingException ne) { System.err.println("Could not get logger"); } 11-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionBean クラスの作成 //Set up the initial stack size. try { setStackSize(Integer.parseInt(env.getProperty("initialStackSize"))); } catch (Exception e) { throw new CreateException("Cannot parse initialStackSize"); } } //implement anything that needs to be done before the //object is destroyed. this would include closing any open //resources. For this example, nothing is necessary. public void ecoRemove() { } //implement anything that needs to be done before the //object is passivated. this would include closing any open //resources. however, for this example, no open resources need //to be closed. thus, the method is empty. public void ecoPassivate() { } //implement the activation routine. anything that needs to be //done to the object upon activation should be included here. public void ecoActivate() { } //implement the methods for the object: getStackSize, setStackSize, push //and pop. //getStackSize retrieves the size set for the stack that was set either //within ecoCreate or reset within setStackSize. public int getStackSize() { logger.println(" Getting stack size..."); return stackSize; } //resets the stack size to a new value. public void setStackSize(int size) throws StackException { if (size < 0) throw new StackException(); logger.println(" Setting stack size to " + size + "..."); top = -1; stackSize = size; ECO/Java オブジェクトの作成 11-11 SessionBean クラスの作成 stackElements = new String[size]; } //push a value on to the stack public void push(String value) throws StackException { if (top == stackSize - 1) throw new StackException(); logger.println(" Pushing ¥"" + value + "¥" onto the stack..."); stackElements[++top] = value; } //pop a value off of the stack public String pop() throws StackException { if (top == -1) throw new StackException(); logger.println(" Popping the stack (returning element " + stackElements[top] + ")..."); return stackElements[top--]; } } 11-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECO/Java オブジェクトのリモート実行 ECO/Java オブジェクトのリモート実行 ECO/Java オブジェクトに対するリモートでのメソッド実行は、シリアライズする必要があ ります。どのような場合でも、リモート・メソッドは、特定のオブジェクトのリモート・イ ンタフェースを通じて 1 つしか実行できません。最初の実行中に別のクライアントまたはス レッドから実行されると、2 回目の実行には例外が発行されます。これは、すべての種類の オブジェクトに適用されます。ECO/Java フレームワークでは、クライアントがリモート・ インタフェースのメソッドを順番に実行するように設計されている必要があります。 クライアントがオブジェクトにアクセスする際に発生するイベントを、次の図とステップで 説明します。 図 11-1 ECO/Java オブジェクトのライフサイクルにおける一連のイベント リモート・ インタフェース X のリファレンス (4) ) ホーム・ インタフェース X のリファレンス (2) ) ルックアップ(1) ) クライアント 1 ホーム・ インタフェース X (4) リモート・ インタフェース X (6) オブジェクト X ) create()(3) メソッド (5) ) コンテナ ) remove(7) 図内の番号は、次のステップ番号に対応しています。 1. クライアント 1 がオブジェクト X のホーム・インタフェースを参照します。 2. ホーム・インタフェース X のリファレンスがクライアント 1 に返されます。 3. クライアント 1 は、ホーム・インタフェース X 上で create を実行します。 4. ホーム・インタフェース X はリモート・インタフェース X のインスタンスを生成しま す。コンテナは次のいずれかを実行します。 a. 状態を保持するオブジェクトの場合、このクライアントに対してオブジェクトのイ ンスタンスが生成され、クライアントが remove を実行したときに破棄されます。 ECO/Java オブジェクトの作成 11-13 状態を保持する ECO/Java オブジェクトおよび状態を保持しない ECO/Java オブジェクト b. オブジェクトが状態を保持しない場合、コンテナはクライアントの処理を行うため にオブジェクト・プールからオブジェクト・インスタンスを渡します。remove が 実行されるまで、このクライアントのみこのオブジェクト・インスタンスにアクセ スできます。remove が実行されると、オブジェクトは次のクライアント・リクエ ストに備えてオブジェクト・プールに返されます。 注意 : 状態を保持するオブジェクトと状態を保持しないオブジェクトの 詳細は、11-14 ページの「状態を保持する ECO/Java オブジェクトおよび 状態を保持しない ECO/Java オブジェクト」を参照してください。 リモート・インタフェース X のオブジェクト・リファレンスがクライアント 1 に返され ます。 5. クライアント 1 は、リモート・インタフェース X を使用して、オブジェクト・インスタ ンス X 上でメソッドを実行します。 6. リモート・インタフェース X は、オブジェクトにコールを委任します。 7. クライアント 1 は、オブジェクト・インスタンスの処理が完了するとリモート・インタ フェース X 上で remove を実行します。これにより、リモート・インタフェースと、場 合によりオブジェクト・インスタンス(状態を保持する場合)が破棄されます。 状態を保持する ECO/Java オブジェクトおよび状態を 保持しない ECO/Java オブジェクト オブジェクトには、状態を保持するものと保持しないものがあります。 ■ 状態を保持するオブジェクトは、シングル・クライアント用です。このオブジェクト は、特定のクライアントにのみ関連した " 状態 " を維持します。クライアントが持つす べてのリモート・インタフェース・インスタンスごとに、オブジェクトのインスタンス が生成されます。 ■ 状態を保持しないオブジェクトは状態を維持しないため、複数のクライアントの処理を 実行できます。インスタンスが生成されるオブジェクトの数は、一定の期間内に同時に 実行されるメソッドの回数に依存します。 11-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 状態を保持する ECO/Java オブジェクトおよび状態を保持しない ECO/Java オブジェクト 状態を保持するオブジェクト 状態を保持するオブジェクトは、インスタンスを作成したクライアントに関連する状態また はデータを維持します。このため、状態を保持するオブジェクトは、それを作成したクライ アント専用になります。そして、クライアントがオブジェクトにアクセスするために使用す るリモート・インタフェースの存続期間中、このオブジェクトは存在します。 ホーム・インタフェースの create メソッドを通じてリモート・インタフェースが作成され た場合、状態を保持するオブジェクトのインスタンスが生成され、初期化されます。リモー ト・インタフェースまたはホーム・インタフェースの remove メソッドが実行されると、イ ンスタンスはリモート・インタフェースにより破棄されます。状態を保持するオブジェクト の ecoCreate メソッドおよび ecoRemove メソッドは、それぞれ create と remove を使 用して実行されます。 図 11-2 状態を保持するオブジェクト クライアント 1 create() create() クライアント 2 ホーム・ インタフェース X 1 ホーム・ インタフェース X 2 リモート・ インタフェース X 1 リモート・ インタフェース X 2 オブジェクト X 1 オブジェクト X 2 複数のインスタンス が固有のリモート・ インタフェースに 結合される コンテナ 図 11-2 を見てみましょう。 ■ クライアント 1 は、オブジェクト X のホーム・インタフェース・インスタンスを参照し、 ホーム・インタフェース X1 のオブジェクト・リファレンスを取得します。クライアン ト 1 はこのリファレンスを使用して、ホーム・インタフェースの create を実行し、リ モート・インタフェース X1 のインスタンスが生成されます。リモート・インタフェー スとともにオブジェクト・インスタンス X1 のインスタンスが生成されます。 ■ クライアント 2 は、オブジェクト X のホーム・インタフェース・インスタンスを参照し、 ホーム・インタフェース X2 のオブジェクト・リファレンスを取得します。クライアン ト 2 はホーム・インタフェースに対して create を実行し、それにより、リモート・イ ンタフェース X2 とオブジェクト X2 のインスタンスが生成されます。 ECO/Java オブジェクトの作成 11-15 状態を保持する ECO/Java オブジェクトおよび状態を保持しない ECO/Java オブジェクト クライアント 1 がリモート・インタフェース X1 上でメソッドを実行すると、その実行がオ ブジェクト・インスタンス X1 に変換されます。クライアント 2 がリモート・インタフェー ス X2 上でメソッドを実行すると、その実行がオブジェクト・インスタンス X2 に変換されま す。リモート・インタフェースとそれに対応するオブジェクト・インスタンスには、1 対 1 の関係があります。クライアントが、対応するリモート・インタフェースに対して remove を実行すると、リモート・インタフェースとそれに対応するオブジェクト・インスタンスの 両方が破棄されます。 状態を保持しないオブジェクト 状態を保持しないオブジェクトには、どのリモート・インタフェースにも依存しない存続期 間が存在します。状態を保持しないオブジェクトは、特定のクライアントに関する状態や データを維持しません。このため、複数のリモート・インタフェースにつき 1 つの状態を保 持しないオブジェクトが存在することが可能です。リモート・インタフェース内でメソッド が実行されると、コンテナはプールに入っているインスタンスを選択してリクエストを処理 するか、あるいは必要に応じて新しいインスタンスを作成してリクエストを処理します。メ ソッドの実行を処理するためにオブジェクト・インスタンスが選択されると、そのインスタ ンスは実行期間中、それを実行したリモート・インタフェース専用になります。 図 11-3 状態を保持しないオブジェクト クライアント 1 create() ホーム・ インタフェース X 1 リモート・ インタフェース X 1 オブジェクト・ プール オブジェクト X a create() クライアント 2 ホーム・ インタフェース X 2 複数のインスタンス が特定のリモート・ インタフェースに 結合されない リモート・ インタフェース X 2 オブジェクト X b コンテナ 11-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド CORBA IDL アプリケーションの ECO/Java への変換 図 11-3 を見てみましょう。 ■ クライアント 1 は、オブジェクト X のホーム・インタフェース・インスタンスを参照し、 ホーム・インタフェース X1 のオブジェクト・リファレンスを取得します。クライアン ト 1 はこのリファレンスを使用して、ホーム・インタフェースの create を実行し、リ モート・インタフェース X1 のインスタンスが生成されます。クライアント 1 がリモー ト・インタフェース X1 に対してメソッドを実行すると、コンテナはオブジェクト・イ ンスタンス Xa のインスタンスを生成し、実行をインスタンス Xa に委任します。この時 点で、オブジェクト・インスタンス Xa は、リモート・インタフェース X1 からのリクエ ストのみ処理します。 ■ クライアント 2 はリモート・インタフェース X2 に対してメソッドを実行し、オブジェク ト・インスタンス Xa はリクエストを処理できないため、新しいオブジェクト・インス タンス Xb が作成されて、リクエストを処理します。クライアント 2 が実行を行う前に リモート・インタフェース X1 の実行が完了すると、オブジェクト・インスタンス Xa が オブジェクト・プールに解放され、リモート・インタフェース X2 からのリクエストに 応答できるようになります(その間に、オブジェクト・プールを管理するコンテナが、 オブジェクト・インスタンス Xa を破棄しない場合) 。 状態の設定 オブジェクトが状態を保持するように、または状態を保持しないように指定するには、 ECO.APP 配布情報ファイルのオブジェクトのセクションに名前と値のペアを指定します。 名前と値のペアには次の構文を使用します。 Stateless = FALSE | TRUE 値が FALSE の場合、オブジェクトは状態を保持し、値が TRUE の場合、オブジェクトは状 態を保持しません。配布情報ファイルの詳細は、第 12 章を参照してください。 CORBA IDL アプリケーションの ECO/Java への変換 Oracle Application Server 内にロードされる、IDL で定義された CORBA アプリケーション が存在する場合、それを ECO/Java アプリケーションとして再定義できます。 IDL ファイルはすべてコンパイルする必要があります。Oracle Application Server の IDL-toJava コンパイラである oasoidlc を使用して、CORBA のスタブとスケルトンを生成する必要 があります。oasoidlc コンパイラについては、17-7 ページの「IDL-to-Java コンパイラの使 用」で説明します。ECO/Java オブジェクトが生成されたインタフェースを参照せず、クラ イアントが参照する場合は、$ORAWEB_HOME/../apps/eco4j/<appName>/_client.jar から インタフェースを取得できるため、コンパイラを実行する必要はありません。この JAR ファ ECO/Java オブジェクトの作成 11-17 CORBA IDL アプリケーションの ECO/Java への変換 イルは、ECO/Java アプリケーションを Oracle Application Server にインストールしたとき に生成されます。 注意 : Oracle Application Server の IDL-to-Java コンパイラは、 $ORACLE_HOME/orb/4.0/bin/oasoidlc(UNIX)または %ORACLE_HOME%¥orb¥bin¥oasoidlc(Windows NT)に存在します。 マスター IDL ファイルの作成 ご使用のオブジェクトの IDL ファイルの他に、アプリケーション用のマスター IDL ファイ ルを 1 つ作成する必要があります。このマスターには、アプリケーション内のすべてのオブ ジェクトのすべての IDL ファイルがリストされます。マスター IDL ファイルは、配布ツー ルによってアプリケーション内のすべてのオブジェクトのスタブとスケルトンを作成するた めに使用されます。スタブとスケルトンを自分で作成する場合、コマンド構文は次のように なります。 oasoidlc -i -I $ORAWEB_HOME/public master.idl たとえば、ECO/Java アプリケーションが obj1 と obj2 という 2 つのオブジェクトで構成さ れ、各オブジェクトごとに別の IDL ファイルが存在する場合、アプリケーションのマスター IDL ファイルは次のようになります。 /* IDL file for the ECO/Java application */ #include "obj1.idl" #include "obj2.idl" obj1.idl ファイルと obj2.idl ファイルには、アプリケーションのオブジェクトのメソッドが リストされます。配布情報ファイルに IDL ファイル名を指定します。 IDL ファイルと構文の詳細は、第 3 部の「Java から CORBA オブジェクトへのアクセス」を 参照してください。 IDL ファイルをディレクトリ構造(JAR ファイルが作成されているルートに対する相対ディ レクトリ)で編成する場合は、そのディレクトリとファイル名を正確にリストする必要があ ります。たとえば、次の図では、JAR ファイルは classes ディレクトリ内に解凍されます。 IDL ファイルは、classes の下の myIDL ディレクトリに入ります。 11-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド CORBA IDL アプリケーションの ECO/Java への変換 図 11-4 JAR ファイルに入れるファイルのディレクトリ構造 /test/Stack classes myStack ServerStack.class ServerStackHome.class ServerStackRemote.class StackException.class META-INF myIDL master.idl obj1.idl obj2.idl ECO.APP このようにマスター IDL ファイルでは、次のように classes ディレクトリに対する相対的 ディレクトリを付けて IDL ファイルを定義します。 /* IDL file for the ECO/Java application */ #include "myIDL/obj1.idl" #include "myIDL/obj2.idl" 注意 : JAR のルート・ディレクトリに対する相対ディレクトリ構造内に IDL ファイルを配置した場合、すべての oasoidlc コマンドおよび ECO.APP の idlInterfaces パラメータ内に、このディレクトリ構造を 含める必要があります。 CORBA オブジェクトの Oracle Application Server への移行 既存の CORBA オブジェクトを Oracle Application Server 環境に移行する場合、既存の CORBA オブジェクトに次の変更を行う必要があります。 ■ クライアントは、ホーム・インタフェースの create メソッドを使用してオブジェクトを 作成する必要があります。クライアントは JNDI を使用してホーム・インタフェースを 取り出します。13-3 ページの「オブジェクトのオブジェクト・リファレンスの取得」を 参照してください。 ECO/Java オブジェクトの作成 11-19 CORBA IDL アプリケーションの ECO/Java への変換 ■ CORBA オブジェクトのインプリメンテーションは、スケルトンから継承することはで きません。たとえば、CORBA オブジェクト・クラスが次のような場合、 public class AccountImpl extends Bank._AccountImplBase { ... } extends 句を implement oracle.oas.eco.SessionBean に置き換える必要があ ります。 public class AccountImpl implement SessionBean{ ... } これは、ECO/Java オブジェクトは CORBA オブジェクトではなく、単に CORBA ベー スであるためです。 ■ CORBA オブジェクトのインプリメンテーションでは、インタフェースに対するメソッ ドである、SessionBean メソッドおよび ecoCreate をインプリメントする必要があ ります。 IDL 定義の Oracle Application Server への移行 CORBA オブジェクトの IDL インタフェースは、次のように変更する必要があります。 ■ インタフェースは、::oracle::oas::eco::ECOObject を拡張する必要がある。 ■ 新規インタフェースを追加し、ホーム・インタフェース内で create メソッドを宣言す る。 たとえば、IDL ファイルが次のような場合は、 module Bank { interface Account { void deposit (int long money); void withdraw (int long money) raises (NoMoney); } } このファイルを次のように変更します。 #include ecoRemote.idl module Bank { interface Account: ::oracle::oas::eco::ECOObject { void deposit (int long money); void withdraw (int long money) raises (NoMoney); } 11-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド EJB への変換を容易にするためのガイドライン interface AccountHome: ::oracle::oas::eco::ECOHome { Account create (in String number) } } EJB への変換を容易にするためのガイドライン EJB アプリケーションのかわりに ECO/Java アプリケーションを作成する理由の 1 つは、 Java 以外の他言語からのアクセスが容易である点です。値によるオブジェクトの受渡し機能 は Java でのみ使用可能なため、現在、Java 以外のクライアントから EJB にアクセスするこ とはできません。 CORBA テクノロジが変更されれば、ECO/Java アプリケーションを EJB に移行することも できます。これらの API のライフサイクルが両方とも同じであるため、この移行は簡単に行 うことができます。この後の項で、ツールを使用して EJB に変換できるように ECO/Java ア プリケーションを作成する方法を説明します。現在の移行手順に関する詳細は、7-12 ページ の「Enterprise CORBA Objects(ECO/Java)の移行」を参照してください。 1. すべてのパラメータをシリアライズ可能になるように定義する。 ECO/Java では、ECO/Java パラメータのルール違反にならないかぎり、シリアライズ 可能なインタフェースをインプリメントするクラスを使用できます。 2. ECO パッケージに対して広範囲なインポートを行う。コードの本体にはパッケージ名 を指定しないでください。たとえば、次のようにします。 import oracle.oas.eco.* 3. org.omg.CORBA.SystemException の使用を制限する。特に、この例外のマイ ナー・コードと他の属性の分析によりコードの移行が困難になり、機械的に変換できな くなる可能性があります。 4. ECO/Java API およびインポート・パッケージのリファレンスを除き、文字列 "ECO" ま たは "eco" を含んだ識別子は使用しない。 5. メソッド実行文は try ブロック内に入れる。 ECO/Java アプリケーションでは、通信の例外 (org.omg.CORBA.SystemException)は明示的に管理する必要はありません。EJB アプリケーションの場合は、その反対です。 ECO/Java オブジェクトの作成 11-21 EJB への変換を容易にするためのガイドライン 11-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 12 配布情報ファイルの作成 この章では、ECO/Java アプリケーションの配布情報ファイルの作成方法について説明しま す。さらに、JAR ファイルのインストール、パフォーマンスの改善およびアプリケーション のデバッグ方法についても説明します。 内容 ■ 概要 ■ 配布情報ファイルの構造 ■ 配布情報ファイルからの値の取得 ■ インストール用の JAR ファイルの作成 ■ ECO/Java アプリケーションの配布 ■ ECO/Java アプリケーションの設定 ■ アプリケーションの再配布とリロード ■ パフォーマンスの改善 ■ ECO/Java アプリケーションのデバッグ 概要 配布情報ファイルは、アプリケーション名、その中のオブジェクト、ECO/Java サーバー・ プロセスで実行可能なオブジェクトのインスタンス数など、ECO/Java アプリケーションに 関する情報を提供します。そして、JAR にこのファイルを追加します。JAR には、Oracle Application Server にアプリケーションを配布するために必要なアプリケーションに関連す るファイルがすべて入っています。 これらの値の一部は、Oracle Application Server 内にアプリケーションを配布した後でも変 更可能です。 配布情報ファイルの作成 12-1 配布情報ファイルの構造 配布情報ファイルは、ECO.APP という名前のテキスト・ファイルです。この名前は変更で きません。JAR ファイルを作成するには、このファイルを META-INF ディレクトリにイン ストールする必要があります。ディレクトリ構造の詳細は、12-9 ページの「インストール用 の JAR ファイルの作成」の項を参照してください。 配布情報ファイルの構造 ECO.APP 配布ファイルは、次の 2 つのメイン・セクションに分かれています。 ■ アプリケーション・セクションでは、[APPLICATION] と [APPLICATION.ENV] に、 すべてのアプリケーション設定が含まれています。 ■ オブジェクト・セクションには、アプリケーションの各 ECO/Java オブジェクトの設定 が入っています。このセクションには、[<objectName>] と [<objectName>.ENV] があります。objectName は、ローカルの JNDI 名です。たとえば、mystack/ ServerStack デモの場合、mystack がアプリケーション名で、ServerStack がオブ ジェクト名です。 各セクションには、次のような機能があります。 表 12-1 ECO.APP ファイルのセクション セクション 説明 [APPLICATION] アプリケーション内のすべてのオブジェクトに適用するグローバル なアプリケーション情報を設定します。この情報には、アプリケー ション名、デフォルトのタイムアウト期間などがあります。 [APPLICATION.ENV] アプリケーション内のすべてのオブジェクトが使用可能な、ユー ザー指定の名前と値のペアを設定します。このセクションはオプ ションです。 [<objectName>] オブジェクトの Java クラス名、オブジェクトのリモート・インタ フェース名または IDL インタフェース名、また、オプションでタイ ムアウト期間の情報などを設定します 。<objectName> セクショ ンには、複数レベルの名前を使用できます。詳細は、12-8 ページの 「複数レベルの名前を使用するアプリケーション」を参照してくだ さい。 [<objectName>.ENV] このオブジェクトのみが使用可能なユーザー指定の名前と値のペア を設定します。このセクションはオプションです。 ECO.APP セクションを作成する際のルールは、次のとおりです。 ■ 各セクションには、次の形式で、プロパティの名前と値のペアが含まれます。 <propname> = <value> propname パラメータに空白を含めることはできません。パラメータの内容には大文字・ 小文字の区別があります。 12-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配布情報ファイルの構造 ■ セミコロン(";")で始まる行はコメントで、その行全体が無視されます。 ■ 空白行は無視されます。通常、空白行はセクションを区切るために使用します。 アプリケーション・セクション [APPLICATION] セクションには次のプロパティが含まれます。 表 12-2 アプリケーション・プロパティ 必須要件 / オプション プロパティ 説明 name アプリケーションの名前。名前に空白文字を含めること はできません。この名前は、クライアントがアプリケー ションを識別するために使用します。 必須要件 usesApplications このアプリケーションから使用される、他のアプリケー ション、.jar ファイルおよび .zip ファイルの名前のカン マ区切りのリスト。これらのアプリケーションおよび ファイル用のクライアント .jar ファイルは、アプリケー ションの CLASSPATH に追加されます。 オプション .jar ファイルおよび .zip ファイルには、 $ORAWEB_HOME の相対パスを指定する必要がありま す。パス・セパレータとしてスラッシュ(/)を使用し ます。 idleTimeOut アプリケーション・インスタンスが破棄されるまでのア オプション イドル時間(秒) 。アプリケーション・インスタンスは、 デフォルトは クライアント・リクエストを処理していない間はアイド 3600(1 時間)。 ルになっています。値が 0 の場合は、タイムアウトが発 生しないことを示します。 minInstances Oracle Application Server が、アプリケーション・プロセ スごとに ECO/Java サーバー・プロセス(JVM)で事前 に起動するアプリケーション・インスタンス数を指定。 maxInstances アプリケーションごとにクライアント・リクエストを処 オプション 理するために Oracle Application Server がインスタンスを デフォルトは 10。 生成できるアプリケーション・インスタンスの最大数を 指定。アプリケーション・プロセスにアクセスするクラ イアントが多くなるほど、リクエスト処理のために一層 多くのアプリケーション・インスタンスが(指定した値 に達するまで)作成されます。この時点で、それ以上イ ンスタンスは作成されなくなり、インスタンスが空くま でリクエストは待機する必要があります。ただし、新し いアプリケーション・プロセスはいつでも起動できます。 オプション デフォルトは 0。 配布情報ファイルの作成 12-3 配布情報ファイルの構造 表 12-2 アプリケーション・プロパティ(続き) アプリケーション・プロパティ(続き) 必須要件 / オプション プロパティ 説明 idlInterfaces ECO/Java アプリケーションのすべてのオブジェクトの IDL ファイルがリストされているマスター IDL ファイ ル。これらのファイルは、idlFiles にもリストされま す。詳細は、11-18 ページの「マスター IDL ファイルの 作成」を参照してください。 このプロパティ は、アプリケー ションのオブ ジェクトの IDL ファイルを設定 する場合にのみ 必要。 idlFiles アプリケーションのオブジェクトの IDL ファイルのカン マ区切りのリスト。この IDL ファイルは、アプリケー ションのファイルが入った JAR ファイルに含まれます。 このリストには、idlInterfaces プロパティで指定す るマスター IDL ファイルは含まれないので注意してくだ さい。 このプロパティ は、アプリケー ションのオブ ジェクトの IDL ファイルを設定 する場合にのみ 必要。 transactions オプション Enabled または Disabled により、アプリケーションで のグローバル・トランザクションをそれぞれ使用可能ま デフォルトは たは使用禁止にします。14-2 ページの「配布情報ファイ Disabled。 ルのトランザクション・パラメータ」を参照してくださ い。 transactionalDads オプション トランザクションに関係する DAD のリスト(アプリ ケーションがグローバル・トランザクションを使用する 場合)。これは、トランザクションの DAD のカンマ区 切りのリストです。14-2 ページの「配布情報ファイルの トランザクション・パラメータ」を参照してください。 [APPLICATION.ENV] セクションには、事前定義済みのシステム・プロパティは存在しま せん。このセクションにはアプリケーション固有の名前と値のペアが含まれます。たとえ ば、ローンのアプリケーションを作成する場合、次のように、利息を指定するプロパティを 設定できます。 [APPLICATION.ENV] InterestRate = 8.0 オブジェクト・セクション ECO/Java オブジェクトの名前は大カッコで囲んで指定します。この名前は、オブジェクト の JNDI 名です。 表 12-3 は [<objectName>] セクションのプロパティのリストです。 12-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配布情報ファイルの構造 表 12-3 オブジェクト・プロパティ プロパティ 説明 必須要件 / オプション className パッケージ名を含む、オブジェクトの Java クラスのフルネーム。 必須要件 remoteInterface オブジェクトのリモート・インタフェース 必須要件 のフルネーム。詳細は、11-3 ページの 「リモート・インタフェースの作成」を参 照してください。 homeInterface オブジェクトのホーム・インタフェースの 必須要件 フルネーム。 idleTimeOut オブジェクト・インスタンスが破棄される オプション までのアイドル時間(秒)。オブジェク デフォルトは 3600。 ト・インスタンスは、クライアント・リク (1 時間) エストを処理していない間はアイドルに なっています。0 の場合、タイムアウトは ありません。 stateless true または false。オブジェクトが状態を 保持するか保持しないかを指定します。 11-14 ページの「状態を保持する ECO/ Java オブジェクトおよび状態を保持しな い ECO/Java オブジェクト」を参照して ください。 transactionMode 新しいトランザクションが起動されたとき オプション に、オブジェクトがどのタイプの宣言トラ デフォルトは ンザクション状態になることが可能か、お TX_NOT_SUPPORTED。 よびトランザクションが起動されたときに 発生する動作を指定。これは、宣言トラン ザクション専用です。14-2 ページの「配 布情報ファイルのトランザクション・パラ メータ」を参照してください。 オプション デフォルトは false。 配布情報ファイルの作成 12-5 配布情報ファイルの構造 表 12-3 オブジェクト・プロパティ(続き) オブジェクト・プロパティ(続き) プロパティ 説明 必須要件 / オプション transactionMode_ <remoteMethodname> 新しいトランザクションが起動されたとき オプション に、メソッドがどのタイプの宣言トランザ デフォルトは クション状態になることが可能か、および transactionMode。 トランザクションが起動されたときに発生 する動作を指定。特定のメソッドに設定し た場合、"transactionMode" の設定をオー バーライドします。これは、宣言トランザ クション専用です。14-2 ページの「配布 情報ファイルのトランザクション・パラ メータ」を参照してください。 authenticationString オブジェクトが、受信するクライアントに オプション どのタイプのセキュリティを要求するかを 指定。『Oracle Application Server セキュ リティ・ガイド』の「IIOP ベースのアプ リケーションのセキュリティ」を参照して ください。 [<objectName>.ENV] セクションには事前定義済みのシステム・プロパティは存在しませ ん。このセクションにはオブジェクト固有の名前と値のペアが含まれます。このセクション で定義される名前と値のペアは、[APPLICATION.ENV] セクションで指定される同名の名 前と値のペアよりも優先されます。 注意 : IDL を使用してオブジェクトを記述する場合でも、ホーム・イン タフェースとリモート・インタフェースのパラメータの両方が必要です。 いずれの場合でも、ホーム・インタフェースの IDL 定義は必要です。詳細 は、11-17 ページの「CORBA IDL アプリケーションの ECO/Java への変 換」を参照してください。 配布情報ファイル例 この項では、異なる 3 つのシナリオを説明します。 ■ 例 12-1「リモート・インタフェースとホーム・インタフェースを使用するアプリケー ション」 ■ 例 12-2「IDL を使用するアプリケーション」 ■ 例 12-3「複数レベルの名前を使用するアプリケーション」 12-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 配布情報ファイルの構造 例 12-1 リモート・インタフェースとホーム・インタフェースを使用するアプリケーション これは、ServerStack アプリケーションの配布情報ファイルのサンプルです。ServerStack の 例では、リモート・インタフェースとホーム・インタフェースを使用して、クライアントが 実行できるメソッドを指定しています。 [APPLICATION] name = ServerStackApp idleTimeOut = 2000 [ServerStack] className = myStack.ServerStack remoteInterface = myStack.ServerStackRemote homeInterface = myStack.ServerStackHome [ServerStack.ENV] ; property used by the ServerStack object stackSize = 10 例 12-2 IDL を使用するアプリケーション これは、ServerStack アプリケーションの配布情報ファイルのサンプルです。このアプリ ケーションは IDL ファイルを使用して、クライアントが実行できるメソッドを指定します。 [APPLICATION] name = ServerStackApp idleTimeOut = 2000 idlInterfaces = stackMaster.idl idlFiles = ServerStack.idl [ServerStack] className = myStack.ServerStack remoteInterface = myStack.ServerStackRemote homeInterface = myStack.ServerStackHome [Stack.ENV] stackSize = 10 ServerStack.idl は、ご使用のサーバー・アプリケーションの作成に使用した IDL ファ イルです。stackMaster.idl ファイルには、このアプリケーション内のオブジェクトに必 要なすべての IDL ファイルのリストが含まれます。この例の場合、このファイルには、次に 示すように ServerStack.idl のみが含まれます。 /* IDL file for the ECO/Java application */ #include "ServerStack.idl" 配布情報ファイルの作成 12-7 配布情報ファイルからの値の取得 例 12-3 複数レベルの名前を使用するアプリケーション 複数レベルの名前は、ECO.APP ファイルのアプリケーション名とオブジェクト名に指定で きます。レベルは、"/" で区切られます。JNDI の参照では、すべてのレベルを使用して名前 を完全に指定する必要があります。たとえば、前述の例のリモート・インタフェースとホー ム・インタフェースを指定する ECO.APP ファイルでは、複数レベルの名前を使用して次の ようにします。 [APPLICATION] name = cmp1/cmp2/ServerStackApp idleTimeOut = 2000 [objDir1/objDir2/ServerStack] className = myStack.ServerStack remoteInterface = myStack.ServerStackRemote [objDir1/objDir2/ServerStack.ENV] ; property used by the ServerStack object stackSize = 10 ServerStackApp の JNDI 参照は、"cmp1/cmp2/ServerStackApp" になります。さらに、 解凍されると、レベルはファイル・システムのディレクトリ階層に変換されます。この階層 にはアプリケーションの生成済みサポート・ファイルが含まれます。 これにより、cmp1/cmp2/ServerStackApp は、対応するプラットフォーム内の既存ディ レクトリに、次のように追加されます。 ■ UNIX—$ORAWEB_HOME/../apps/eco4j/cmp1/cmp2/ServerStackApp ■ NT—%ORAWEB_HOME%¥..¥apps¥eco4j¥cmp1¥cmp2¥ServerStackApp 各オブジェクトのサポート・ファイルは、これらのディレクトリのうちの 1 つに置かれま す。 配布情報ファイルからの値の取得 ECO/Java オブジェクトは、oracle.oas.eco.SessionContext インタフェースの getEnvironment() メソッドを使用して、ECO.APP の <APPLICATION.ENV> セクション または <OBJECT.ENV> セクション内に設定された値を取り出すことができます。 import javax.naming.InitialContext; import oracle.oas.eco.*; public class ServerStack implements SessionBean { SessionContext sessctx; int stackSize; void setSessionContext(SessionContext ctx) { sessctx = ctx; // reference is stored in 12-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド インストール用の JAR ファイルの作成 // instance variable //retrieve the stack size value set in ECO.APP stackSize = Integer.parseInt( ctx.getEnvironment().getProperty("stackSize")); } インストール用の JAR ファイルの作成 アプリケーションとそのサポート・ファイルを含んだ JAR ファイルを作成する必要がありま す。この JAR ファイルは、Oracle Application Server Manager が ECO/Java アプリケーショ ンを Oracle Application Server 環境にインストールし、登録するために使用されます。 JAR ファイルを作成する前に、次のステップを実行する必要があります。 1. CLASSPATH に正しい Oracle Application Server の JAR ファイルが設定されているこ とを確認してください。ECO/Java オブジェクトをコンパイルして配布するには、自分 の開発環境の CLASSPATH に次の JAR ファイルを 1 つ以上追加する必要があります。 ■ $ORAWEB_HOME/classes/ecoapi.jar — ECO/Java の JAR ファイル ■ (UNIX のみ)$ORACLE_HOME/orb/4.0/classes/yoj.jar — ORB の JAR ファイル のみ) ■ (Windows NT のみ)%ORACLE_HOME%¥orb¥classes¥yoj.jar のみ) 注意 : 現在、NT 環境では一部の環境変数(CLASSPATH、 JAVA_HOME など)の拡張時の長さは 512 バイトに制限されています。 一部のカートリッジと ECO/Java オブジェクトは環境変数を拡張しようと するため、環境変数の長さを必ず 250 ∼ 300 文字以内にしてください。 2. サポート用に必要な IDL ファイルを作成します。オブジェクト定義に IDL を使用する 場合は、オブジェクトごとに IDL ファイルと、これらのファイルをリストしたマスター IDL ファイルを作成する必要があります。Oracle Application Server は、サポートして いる IDL ファイルを ECO/Java アプリケーション・コードから作成できるため、この作 業は必要ありません。 3. ECO/Java アプリケーションの .java ファイルを .class ファイルにコンパイルします。 4. ECO.APP 配布情報ファイルを作成します。 JAR ファイルに含める必要のあるファイルは次のとおりです。 ■ .java ファイルから生成された .class ファイル。これには、インプリメンテーション、 ホーム・インタフェース、リモート・インタフェース、および例外クラスなどのサポー ト・クラスのクラス・ファイルが含まれます。javac コンパイラには -d オプションがあ り、これを使用してクラス・ファイルの宛先ディレクトリを指定できます。たとえば、 配布情報ファイルの作成 12-9 インストール用の JAR ファイルの作成 クラス・ファイルを /test/Stack/classes ディレクトリに入れるには、次のように入力し ます。 prompt> javac -d /test/Stack/classes *.java ■ アプリケーションの配布情報が入った ECO.APP ファイル。このファイルは、 META_INF ディレクトリに入れる必要があります。JAR ファイルの最上位に位置する ように、META-INF ディレクトリを作成します。たとえば、次のようにします。 prompt> mkdir /test/Stack/classes/META-INF prompt> cp ECO.APP /test/Stack/classes/META-INF ■ IDL ファイル。IDL によって記述された ECO/Java オブジェクトを使用している場合、 これらの IDL ファイルも JAR に含める必要があります。JAR ファイル内の IDL ファイ ルの場所は、ECO.APP ファイルの idlFiles パラメータと idlInterfaces パラメー タで指定されます。 IDL ファイルから生成されたスタブとスケルトンは追加しません。JAR ファイルのイン ストール時に、Oracle Application Server は追加された IDL ファイルに対して oasoidlc コンパイラを実行し、スタブとスケルトンを作成します。コンパイラについての詳細 は、第 17 章「Java から CORBA オブジェクトへのアクセス」を参照してください。 ファイル作成後、すべてのファイルをパッケージ・ディレクトリに置き、次の図に示すよう に JAR ファイル内に配置できるようにしておく必要があります。 図 12-1 JAR ファイルに入れるファイルのディレクトリ構造 /test/Stack classes myStack ServerStack.class ServerStackHome.class ServerStackRemote.class StackException.class META-INF myIDL master.idl stack.idl *IDL ファイルが必要な 場合、ユーザー定義の ディレクトリまたは "classes" の下に 入ります。 ECO.APP 12-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECO/Java アプリケーションの配布 ファイルがすべて準備できたら、次のようにして JAR ファイルを生成できます。 prompt> cd /test/Stack/classes prompt> jar cf /test/Stack/Stack.jar * jar ユーティリティは JDK に付属しています。これは、Java がインストールされているディ レクトリの bin ディレクトリに入っています。 ECO/Java アプリケーションの配布 Oracle Application Server に ECO/Java アプリケーションをインストールするには、Oracle Application Server Manager を使用します。指定する必要のある情報は、アプリケーション のファイルが含まれている JAR ファイルの場所と名前のみです。プライマリ・ノードのみに 配布するか、またはすべてのノードに配布するかを決める必要もあります。ECO/Java アプ リケーションの配布方法の詳細は、 『Oracle Application Server 管理者ガイド』の第 7 章「ア プリケーションの管理」を参照してください。 JAR ファイルをインストールすると、Oracle Application Server Manager は、その JAR ファ イルを使用して次のステップを実行します。 ■ JAR から ECO.APP ファイルを読み込み、オブジェクトのリストとそのリモート・イン タフェースとホーム・インタフェースを探す。 ■ リモート・インタフェースとホーム・インタフェースに基づいて IDL ファイル、スタブ およびスケルトンを生成する。 注意 : <appName> が複合 JNDI 名の場合、サブディレクトリ階層が作成 されます。たとえば、"corp/bank/branch" という名前のアプリケーショ ンのファイルは $ORACLE_HOME/ows/apps/eco4j/corp/bank/branch と いう名前のディレクトリに置かれます。 ■ 生成されたコードをコンパイルする。 ■ アプリケーションを Oracle Application Server の設定ファイルに登録するために使用す る .app 登録ファイルを生成する。 ■ $ORAWEB_HOME/../apps/eco4j/<appName>/_server.jar を生成する。このファイルは アプリケーションの CLASSPATH 環境変数に追加されます。 ■ $ORAWEB_HOME/../apps/eco4j/<appName>/_client.jar を生成する。 配布情報ファイルの作成 12-11 ECO/Java アプリケーションの設定 注意 : 生成されたこれらのファイルのうち 2 つは、Java クライアントが 使用します。 ■ $ORAWEB_HOME/../apps/eco4j/<appName>/_client.jar ファイル は、クライアントのクラスパスに配置する必要があります。 ■ $ORAWEB_HOME/../apps/eco4j/<appName>/ OASClientInterfaces.idl ファイルは、サーバーにアクセスできるよう に CORBA ベースのクライアントをコンパイルする際に使用します。 ナビゲーション・ツリーの「アプリケーション」の下に、追加したアプリケーションが表示 されているはずです。 ECO/Java オブジェクトのコードを変更する場合、生成したファイルが更新されるように、 アプリケーションを再配布する必要があります。Oracle Application Server Manager は既存 のファイルを上書きします。ECO/Java アプリケーションを再配布する方法は、12-17 ペー ジの「アプリケーションの再配布とリロード」を参照してください。 注意 : oasdeploy を使用して、アプリケーションを配布または再配布す ることもできます。これはプライマリ・ノードまたはリモート・ノードに EJB アプリケーションと ECO/Java アプリケーションを配布するユーティ リティです。このユーティリティでは、サイト上のすべてのノードにアプ リケーションを配布することもできます。第 8 章「oasdeploy を使用した アプリケーションの配布」を参照してください。 ECO/Java アプリケーションの設定 アプリケーションをインストールしたら、必要に応じて設定パラメータの値を変更できま す。実行後に GUI で変更可能なパラメータについては、表 12-4、表 12-5 および表 12-6 を参 照してください。パラメータを変更した場合、アプリケーションをリロードして変更内容を 有効にする必要があります。ECO/Java アプリケーションを再配布する方法は、12-17 ペー ジの「アプリケーションの再配布とリロード」を参照してください。 Oracle Application Server Manager を使用して ECO/Java アプリケーションを設定します。 ECO/Java アプリケーションの設定パラメータは、次の 3 つのレベルに分かれます。 ■ サーバー・レベルのパラメータ ■ アプリケーション・インスタンスのパラメータ ■ オブジェクト・レベルのパラメータ これらのパラメータの完全な説明は、12-14 ページの「パラメータの詳細」を参照してくだ さい。 12-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECO/Java アプリケーションの設定 サーバー・レベルのパラメータ 次の表に、サーバー・レベルのパラメータを示します。 表 12-4 サーバー・レベルのパラメータ パラメータ 説明 フォームの場所 デフォルト値 初期起動インスタンス アプリケーションのために起動する 最小インスタンス数 ホスト 0 環境変数 Java 仮想マシンの環境変数 環境変数 Oracle Application Server による設定 ロギング・パラメータ ディレクトリ、ファイルのサイズなど ロギング ユーザー指定 アプリケーションの名前と値のペア トランザクション アプリケーションのトランザクション・ Tx プロパティ サービスを使用可能に設定 配布ファイルの transactions パラメータから トランザクションの DAD トランザクション・アプリケーション Tx プロパティ が使用するデータベース 配布ファイルの transactionalDads パラメータから Java 環境 オン [APPLICATION.ENV] セクションから アプリケーション・インスタンスのパラメータ 次の表に、アプリケーション・インスタンスのパラメータを示します。 表 12-5 アプリケーション・インスタンスのパラメータ パラメータ 説明 フォームの場所 デフォルト タイムアウト アプリケーション・インスタンスの タイムアウト期間 インスタンスの パラメータ 配布ファイルの idleTimeOut パラメータから 優先順位 アプリケーション・プロセス内にあ るアプリケーション・インスタンス の優先順位レベル チューニング 配布ファイル内での設定は 不可 認証文字列 アプリケーションの認証文字列 セキュリティ 配布ファイルの authenticationString パラメータから 配布情報ファイルの作成 12-13 ECO/Java アプリケーションの設定 オブジェクト・レベルのパラメータ 次の表に、アプリケーション内のすべてのオブジェクトに適用されるパラメータを示しま す。 表 12-6 オブジェクト・レベルのパラメータ パラメータ 説明 フォームの場所 デフォルト ユーザー指定 オブジェクトの名前と値のペア オブジェクト環境 配布ファイルの [<object>.ENV] セクションから パラメータの詳細 優先順位(サーバー・レベル) このパラメータは、アプリケーションが配布されるアプリケーション・サーバー・サイトに 関するアプリケーションの優先順位を設定します。これは、パフォーマンス・チューニン グ・パラメータです。アプリケーションのプロセス、スレッドおよびインスタンスの数は、 そのアプリケーションとコンポーネントのリクエスト・ロードと優先順位レベルに基づいて 自動的に決定されます。 (詳細は、『Oracle Application Server パフォーマンス・チューニン グ・ガイド』を参照してください。 ) パフォーマンスは、アプリケーション・インスタンスに指定された最大値と最小値に基づい てチューニングする( 「最大 / 最小ベースのチューニング」と呼ばれる)こともできます (12-16 ページの「最小インスタンス数と最大インスタンス数(アプリケーション・レベル)」 を参照してください) 。 ECO.APP ファイルを使用してアプリケーションを配布する場合は、アプリケーション・イ ンスタンスの最小数と最大数しか指定できません。デフォルト値は「標準」です。 環境変数(サーバー・レベル) このフォームでは、Java 仮想マシンのプロセスが使用する環境変数の値を定義します。事前 定義済みの環境変数の値を削除しないでください。ただし、自分の環境変数を定義したり、 事前定義済みの変数に値を追加することは可能です。 12-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECO/Java アプリケーションの設定 表 12-7 環境変数 変数 説明 CLASSPATH オブジェクトのクラス・ファイルが入っているディレクトリまたは JAR ファイルのリスト。たとえば、次のようにします。 $ORAWEB_HOME/../apps/eco4j/brokerage/server/brokerage.jar CLASSPATH はアプリケーションのインストール時に、JAR ファイル内 の実行されるクラスすべてと、その他のサポートされるクラスにアクセ スできるように設定されます。 UNIX プラットフォームでは、CLASSPATH のディレクトリと JAR ファ イルはコロンで区切られます。たとえば、次のようになります。 $ORAWEB_HOME/../apps/eco4j/brokerage/brokerage.jar: $ORAWEB_HOME/../apps/eco4j/brokerage/classes Microsoft Windows NT では、CLASSPATH のディレクトリと JAR ファ イルはセミコロンで区切られます。たとえば、次のようになります。 %ORACLE_HOME%¥..¥apps¥eco¥brokerage¥brokerage.jar; %ORACLE_HOME%¥..¥apps¥eco¥brokerage¥classes PATH 実行モジュールが入っているディレクトリのリスト(UNIX ではコロン 区切り、NT ではセミコロン区切り) 。これは %ORAWEB_HOME%¥jdk¥bin を含むように設定する必要があります。 LD_LIBRARY_PATH (UNIX のみ)バイナリ・ライブラリが入っているディレクトリのコロン 区切りのリスト。 JAVA_HOME THREADS_FLAG Java がインストールされる最上位のディレクトリ。これは %ORAWEB_HOME%/jdk に設定する必要があります。 (UNIX のみ)Java 仮想マシンがネイティブのスレッドを使用するかど うか。これは "native" に設定されます。この値は必須です。 ロギング・パラメータ(サーバー・レベル) ロギングを使用可能または使用禁止にできます。使用可能の場合、このアプリケーションの ログ・メッセージが書き込まれるディレクトリとファイルを指定できます。また、詳細レベ ル(0 から 15) を指定できます。値が低いほど重大な問題を示します。高い数値を指定する と、その詳細レベルまでのメッセージをすべて書き込むため、ログに出力されるメッセージ 数が多くなります。たとえば、詳細レベルを 3 に設定した場合、Logger は詳細レベルが 0、 1、2 および 3 のメッセージのログを出力します。 Oracle Application Server のすべてのコンポーネントが、同じ方法で詳細レベルの値を使用 します。詳細レベルの詳細は、『Oracle Application Server 管理者ガイド』を参照してくださ い。 ロギングのデフォルト設定では、システム・ロギングと同じ値が使用されます。 配布情報ファイルの作成 12-15 ECO/Java アプリケーションの設定 Java 環境(サーバー・レベル) このフォームにより、アプリケーション全体に名前と値のペアを指定できます。名前と値の ペアがオブジェクトからのみ参照できるようにする場合は、 「Java 環境(オブジェクト・レ ベル) 」フォームを使用してください。 これらの名前と値のペアは、アプリケーションのインストール時に ECO.APP ファイルから 読み込まれます。 トランザクション優先順位(サーバー・レベル) アプリケーションは、使用可能または使用禁止に設定できます。使用可能に設定した場合、 トランザクションの DAD をアプリケーションに指定できます。詳細は、第 14 章「ECO/ Java オブジェクトのトランザクション」を参照してください。 タイムアウト(アプリケーション・レベル) アプリケーション・インスタンスが指定した期間アイドルになっている場合(活動中のオブ ジェクトがなく、ホーム・インタフェースがすべてアイドルの場合) 、Oracle Application Server は、クライアントとアプリケーション・インスタンス間の接続を処理できます。タイ ムアウトは秒単位で指定し、そのデフォルト値は 3600(1 時間)です。接続を切断すると、 Oracle Application Server はアプリケーション・インスタンスを使用して他のクライアント の処理を行うか、またはインスタンスを破棄できます。 このタイムアウト機能は、クライアントが異常終了してオブジェクト・インスタンスを解放 できない場合に、インスタンスを解放することを目的としています。 最小インスタンス数と最大インスタンス数 (アプリケーション・レベル) Java 仮想マシンが起動されると、指定した最小数分のアプリケーション・インスタンスが作 成されます。クライアント数が最小数を超えると、Java 仮想マシンは、最小数 / 最大数設定 で指定された最大数に達するまでアプリケーション・インスタンスを作成します。これは、 優先順位をベースにしたチューニング(この項で前述したもう一方のチューニング・モー ド)とは対照的です。 認証文字列(アプリケーション・レベル) 認証サーバー方式を使用してアプリケーションを保護するには、アプリケーションに認証文 字列を割り当てます。認証文字列の形式は次のとおりです。 <scheme>(<realm>) [ {"|" | "&"} & <scheme>(<realm>) ... ] 詳細は、 『Oracle Application Server セキュリティ・ガイド』の「IIOP ベースのアプリケー ションのセキュリティ」を参照してください。 12-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド アプリケーションの再配布とリロード Java 環境(オブジェクト・レベル) このフォームにより、オブジェクトに名前と値のペアを指定できます。名前と値のペアをア プリケーション全体から参照可能にするためには、 「Java 環境(サーバー・レベル)」フォー ムを使用してください。これらの名前と値のペアは、アプリケーションのインストール時に 配置記述子から読み込まれます。 タイムアウト(オブジェクト・レベル) オブジェクト・インスタンスが指定した期間アイドルになっている場合(指定した期間、ク ライアントがリクエストを発行していない場合) 、Oracle Application Server は、クライアン トとオブジェクト・インスタンス間の接続を処理できます。タイムアウトは秒で指定しま す。デフォルト値は 0 で、アプリケーション・インスタンスに指定したものと同じタイムア ウト値です。 アプリケーションの再配布とリロード ECO/Java アプリケーションの再配布 アプリケーションを変更した場合、Oracle Application Server Manager または第 8 章で説明 した oasdeploy ユーティリティを使用してアプリケーションを再配布する必要があります。 アプリケーションを再配布するには、次のステップを実行します。 1. 再配布する必要のある ECO/Java アプリケーションの実行中のプロセスを停止します。 2. アプリケーションを再配布します。今回は、アプリケーションを再配布する際に「強 制」オプションを選択します。詳細な手順は、12-11 ページの「ECO/Java アプリケー ションの配布」を参照してください。 3. Oracle Application ServerManager で「すべて」を選択し、「リロード」アイコン をクリックします。これにより、Oracle Application Server の該当コンポーネン トに通知されます。Oracle Application Server を再起動する必要はありません。 注意 : コマンド行を使用してアプリケーションを配布または再配布する には、oasdeploy ユーティリティを使用する必要があります。第 8 章 「oasdeploy を使用したアプリケーションの配布」を参照してください。 配布情報ファイルの作成 12-17 パフォーマンスの改善 ECO/Java アプリケーションのリロード Oracle Application Server Manager を使用してアプリケーションの設定を変更した場合は、 設定データをリロードする必要があります。 設定データをリロードするには、Oracle Application ServerManager で「すべて」を選択し、 「リロード」アイコン をクリックします。これにより、Oracle Application Server の該 当コンポーネントに通知されます。Oracle Application Server を再起動する必要はありませ ん。 パフォーマンスの改善 この項では、ECO/Java アプリケーションのパフォーマンスを改善する方法について説明し ます。 Just-In-Time コンパイラ 複数のプラットフォーム間での移植性を維持するために、Java では、Java プログラムをバイ トコードにコンパイルするインタプリタを使用しています。バイトコードは Java 仮想マシ ンに対する命令です。それぞれのプラットフォームはソフトウェアで仮想マシンをインプリ メントしています。仮想マシンは、Java プログラムの実行時に仮想マシン命令を解析しま す。このため、Java プログラムのコンパイル済みバイトコードは、特定のプラットフォーム に依存することなく、どのマシン上でも実行できます。 通常、Java プログラムは、ネイティブ・マシン命令にコンパイルされた同じプログラムより も、実行の速度は遅くなります。つまり、移植性を確保するためにパフォーマンスが犠牲に なっています。 バイトコードは、ハードウェア・プラットフォームのネイティブ・マシン命令にコンパイル することが可能です。このようにすると、同じコードのセットをより高速に実行できます。 高速化によるデメリットは、命令のコンパイルに費やされる時間です。 このコンパイルは、Java プログラムが実行される直前に行われるため、Just-In-Time(JIT) コンパイルと呼ばれています。コンパイルは 1 回だけ必要で、再コンパイルされた命令は何 回でも使用できます。多くの JIT コンパイラは、最初に対応する Java メソッドが実行された 後に 1 回だけ仮想マシンの命令を再コンパイルし、それらの命令は終了するまでキャッシュ に入れられます。Java インタプリタには標準インタフェースが定義されているため、どの JIT コンパイラでもプラグインできるようになっています。 次の図に、ECO/Java オブジェクトで JIT コンパイラがどのように動作するかを示します。 12-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド パフォーマンスの改善 図 12-2 Just-In-Time コンパイル foo.class バイトコード ECO/Java サーバー バイトコード キャッシュされたバイトコード JIT コンパイラ ネイティブ・マシン命令 マシン名 JIT コンパイラを使用禁止にする Oracle Application Server には、デフォルトで JIT コンパイラが含まれており、Oracle Application Server 環境で使用できます。JIT コンパイラを使用禁止にする場合は、次のス テップを実行します。 1. Oracle Application Server Manager で、ご使用のアプリケーションの「環境変数」 フォーム(図 12-3)を表示します。 2. JAVA_COMPILER 環境変数を「NONE」に設定します。 注意 : JIT コンパイル済みのコードでは、例外スタックの出力時に行番号 情報が出力されません。アプリケーションをデバッグする場合、JIT コン パイラを使用禁止にすると、コードの問題点をトレースできます。 図 12-3 「環境変数」フォーム 配布情報ファイルの作成 12-19 ECO/Java アプリケーションのデバッグ アプリケーション・インスタンスのパフォーマンス設定の設定 Java 仮想マシンの起動などのハウスキーピング・タスクがリクエストの着信前に行われる と、アプリケーションのパフォーマンスが改善します。これにより、Oracle Application Server はより高速にリクエストを処理できます。 アプリケーションに対する最初のリクエストは、後続のリクエストよりも時間がかかる場合 があります。これは Oracle Application Server が、アプリケーション・インスタンスの最初 のリクエストを受け取ったときにのみ Java 仮想マシンを起動するためです。後続のリクエ ストは、すでに実行中の仮想マシンによって処理されます。 次のステップを実行することにより、このようなパフォーマンス・ヒットを回避できます。 ■ 初期起動サーバーまたはアプリケーション・インスタンスの最小数を 0 より大きな値に 設定します。これにより、Oracle Application Server はアプリケーション実行時に、指 定された数のサーバー・プロセスまたはアプリケーション・インスタンスを使用して Java 仮想マシンを起動します。 両方のモードの詳細は、 『Oracle Application Server パフォーマンス・チューニング・ガイ ド』を参照してください。 ECO/Java アプリケーションのデバッグ ECO/Java アプリケーションは、Oracle Application Server の本番プラットフォームでデ バッグする前に、可能な限り開発プラットフォームでデバッグしてください。開発プラット フォーム(たとえば、Oracle JDeveloper などの Java IDE)でデバッグする方が、より制御 された環境で作業することになるため、問題を効率的に判別し、解決することができます。 Oracle JDeveloper は、他の IDE に比べて、Oracle Application Server とより緊密に統合され ています。その利点の1つとして、ECO/Java オブジェクトのローカル・デバッグ機能があ ります。詳細は Oracle JDeveloper のドキュメントを参照してください。 開発プラットフォーム上で ECO/Java オブジェクトをテストし、デバッグした後、Oracle Application Server 上で実行およびテストします。Oracle Application Server には、ロギン グ・メッセージの形式のデバッグ機能があります。リモート・デバッグ(別の Java 仮想マ シンからデバッグする)はできません。 Logger クラス oracle.oas.eco.Logger クラスを使用すると、ECO/Java オブジェクトは、Oracle Application Server の Logger サービスにアクセスできます。Logger サービスは、ファイルやデータベー スにメッセージを書き込むことができます。Logger オブジェクトを取得するには、JNDI に URL 接頭辞 "oas_service:logger" を付けて使用します。 12-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECO/Java アプリケーションのデバッグ ログ・ファイル ECO/Java オブジェクトは、Oracle Application Server が使用するログ・ファイルか、また は別のログ・ファイルにメッセージを書き込むことができます。 ■ Oracle Application Server のログ・ファイルにメッセージを書き込む場合は、何もする 必要はありません。ロギング・サービスはデフォルトで、 「システム」フォームの「ロ グ・ディレクトリ」と「ログ・ファイル」フィールドで定義されたログ・ファイルに メッセージを書き込みます。Oracle Application Server Manager でこのフォームを表示 するには、 「website40 サイト」/「Oracle Application Server」/「ロギング」/「シス テム」をクリックします。 ■ ECO/Java アプリケーション専用のログ・ファイルにメッセージを書き込む場合、 「ロギ ング」フォームにログ・ファイルを指定します。Oracle Application Server Manager で このフォームを表示するには、 「website40 サイト」/「アプリケーション」/「< アプリ ケーション名 >」/「設定」/「ロギング」をクリックします。このフォームで指定され たログ・ファイルは、このアプリケーションのオブジェクトにのみ使用されます。 詳細は、 『Oracle Application Server 管理者ガイド』の「ロギング・ユーティリティとデータ ベース・ユーティリティ」の章を参照してください。 詳細レベル Logger クラスは、メッセージが詳細レベル以下の場合のみ、そのメッセージを書き込みま す。たとえば、Oracle Application Server の詳細レベルを 7 に設定した場合、詳細レベルが 7 以下のメッセージのみがログに書き込まれます。 Oracle Application Server 全体の詳細レベルは、 「システム」フォームの「詳細レベル」 フィールドで設定します。Oracle Application Server Manager でこのフォームを表示するに は、 「website40 サイト」/「Oracle Application Server」/「ロギング」/「システム」をク リックします。 Oracle Application Server の詳細レベルは、個々のアプリケーションごとにオーバーライド できます。特定のアプリケーションからのみ、より多くのメッセージを書き出す場合、これ が必要になることがあります。たとえば、Oracle Application Server 全体の詳細レベルを 1 などの低い値に設定し、一方でデバッグ中のアプリケーションの詳細レベルを 10 などの高 い値に設定できます。 詳細レベルをオーバーライドするには、ECO/Java アプリケーションの「ロギング」フォー ムを使用します。このフォームにアクセスするには、 「website40 サイト」/「アプリケー ション」/「< アプリケーション名 >」/「設定」/「ロギング」をクリックしてください。 メッセージの詳細レベルを設定するには、oracle.oas.eco.Logger インスタンスの setSeverity() メソッドをコールします。その後、setSeverity() メソッドを再度コールして詳 細レベルを変更するまでは、この ECO/Java オブジェクト・インスタンスから送信されたす べてのメッセージに、この詳細レベルが設定されます。現行の詳細レベルは、getSeverity() をコールすることによって調べます。デフォルトの詳細レベルは Logger.LOG_SEVERITY_DEBUG です。 配布情報ファイルの作成 12-21 ECO/Java アプリケーションのデバッグ ロギング・モード Logger はメッセージが発生するたびに書き込むことも、メッセージを収集してバッチ・ モードで書き込むこともできます。バッチ・モードは、非バッチ・モードのように Logger が何度もログ・ファイルにアクセスする必要がないため、より効率的です。しかし、バッ チ・モードの場合、システムに障害が起こると、ログ・ファイルへの書込みを待っている Logger メッセージが書き出されないことがあります。また、アプリケーションのデバッグ 中にバッチ・モードをオフにすると、ログ・ファイルのメッセージをほとんど同時に参照で きます。 バッチ・モードは、 「Oracle Application Server」ブランチの「ロギング」フォームで設定し ます。 図 12-4 「ロギング」フォーム 12-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 13 ECO/Java アプリケーションの クライアントの開発 この章では、ECO/Java アプリケーションのクライアント作成方法について説明します。ク ライアントは、オブジェクトのメソッドを実行する前に、そのオブジェクトのオブジェク ト・リファレンスを取得する必要があります。リファレンスを取得する方法は、クライアン トのタイプによって異なります(たとえば、オブジェクト・リファレンスを取得するための 要件は、スタンドアロン・クライアントとアプレット・クライアントとでは異なります) 。 これらの違いは、この章で説明します。 注意 : 現在、Enterprise JavaBeans は、Java クライアントからのみ使用さ れるように定義されています。これは、値によるオブジェクトの受渡し方 式で渡されるパラメータのサポート要件のためです。アプリケーションに Java 以外のクライアントからアクセスする必要がある場合、Oracle Application Server の ECO/Java コンポーネント・モデルを使用してアプ リケーションを開発、実行することをお薦めします。 内容 ■ 概要 ■ オブジェクトのオブジェクト・リファレンスの取得 ■ オブジェクトに対するメソッドの実行 ■ オブジェクトの破棄 ■ JNDI がサポートする機能 ■ クライアントに必要なファイル ■ APPLET タグ ■ コールバックの作成 ■ JNDI プロバイダのパフォーマンス機能 ECO/Java アプリケーションの クライアントの開発 13-1 概要 概要 ECO/Java アプリケーションのクライアントには次のものを使用できます。 ■ Java アプリケーション ■ ブラウザで動作する Java アプレット ■ 同じまたは他の ECO/Java アプリケーションのオブジェクト ■ JServlet カートリッジ ■ CORBA 準拠のクライアント ECO/Java アプリケーションとそのオブジェクトは CORBA オブジェクトで、Oracle Application Server の ORB に登録されます。これらのオブジェクトにアクセスするには、ク ライアントは HTTP のかわりに Internet Inter-ORB Protocol(IIOP)を使用します。ECO/ Java アプリケーションにアクセスするには、クライアントにはクライアント側の ORB が必 要です。クライアントが Java アプレットの場合、互換性のある ORB をブラウザで使用した り、純粋な Java ORB をアプレットの一部としてダウンロードできます。 ECO/Java アプリケーションの実行方法は、HTTP ベースの Oracle Application Server アプ リケーションの場合とは異なります。クライアントはオブジェクトのホーム・インタフェー スのオブジェクト・リファレンスを取得する必要があります。これを使用して、クライアン トはオブジェクトのメソッドを実行するための ECO/Java オブジェクトを作成できます。ク ライアントは、JNDI(Java Naming and Directory Interface)を使用してオブジェクト・リ ファレンスを取得します。クライアントはオブジェクト・インスタンスの使用を終了する と、remove() メソッドをコールしてそれを破棄します。 クライアントがアプリケーション・インスタンス内のホーム・インタフェースにアクセスす る必要がない場合、またはクライアント・プロセスの終了時に、クライアントは、このアプ リケーション・インスタンスの再使用を確実にするために初期 JNDI コンテキストから close() をコールします。 プロセスの概要は次のとおりです。 1. オブジェクトのホーム・インタフェースのオブジェクト・リファレンスを取得します。 2. ホーム・インタフェースの create() を実行します。これにより、ECO/Java としてオ ブジェクトのインスタンスが生成されます。 3. ECO/Java オブジェクトのリモート・インタフェース・メソッドを実行します。 4. ECO/Java オブジェクトが不要になったら、remove() を実行してそのオブジェクトを 破棄します。 5. アプリケーション・インスタンスが必要なくなったら、JNDI 初期コンテキストから close() をコールします。 オブジェクト・メソッドは、他の ECO/Java オブジェクトまたは RMI 互換の非リモート値 を返すことができ、クライアントはユーザーに戻り値を表示する方法を自由に決定できま 13-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド オブジェクトのオブジェクト・リファレンスの取得 す。たとえば、あるクライアントは単に値をテキスト・エリアに表示し、別のクライアント はそれをチャートの中にグラフィックで表示するということが可能です。 オブジェクトのオブジェクト・リファレンスの取得 クライアントはオブジェクト上でメソッドを実行する前に、まずそのオブジェクトのホー ム・インタフェースのオブジェクト・リファレンスを取得し、そのホーム・インタフェース に対して create メソッドを実行する必要があります。これを行う場合、クライアントは、 JNDI(Java Naming and Directory Interface)を使用します。JNDI は、リクエストの参照を 処理するためのネーム・サーバーを提供します。 Oracle Application Server の JNDI JNDI(Java Naming and Directory Interface)は、JavaSoft によって定義された一連の API で構成されています。この API は、基盤となるディレクトリ・サーバーから独立した、ディ レクトリ・サービスやネーム・サービスを提供します。JNDI は、JNDI API と JNDI SPI で 構成されています。 ■ JNDI API—Java アプリケーションが様々なディレクトリ・サービスにアクセスできるよ うにするためのクライアント API。 ■ JNDI SPI— サービス・プロバイダがネーム・サーバーまたはディレクトリ・サーバーの インプリメンテーションをプラグインできるようにするためのインタフェース。 Oracle Application Server には、JNDI ネーム・サーバー SPI が付属しています。JNDI ネー ム・サーバー SPI により、JNDI クライアントは、EJB および ECO/Java ホーム・インタ フェースのオブジェクト・リファレンスを取得できるようになります。 JNDI の詳細な情報については、JavaSoft の Web サイト(http://www.javasoft.com)を参照 してください。 名前領域の操作 クライアントはサーバーに名前を提供し、その名前がコンポーネントとして解析されるとオ ブジェクト・リファレンスを返します。名前は特定のコンテキストに対する相対名です。初 期コンテキストまたは取り出した相対コンテキストに対して相対的な名前を参照できます。 JNDI を使用してホーム・インタフェースへのオブジェクト・リファレンスを取得する際、 クライアントは次のステップを実行します。 1. 初期コンテキスト・ファクトリ・プロパティを設定します。 2. 初期コンテキストを取得します。 3. オブジェクト、あるいは複数のオブジェクトの取出し元の相対コンテキストを識別する 文字列または JNDI の複合名を指定します。 ECO/Java アプリケーションの クライアントの開発 13-3 オブジェクトのオブジェクト・リファレンスの取得 Oracle Application Server の JNDI 名前領域は、階層型の名前領域です。これは、URL プロトコルの "oas:" の接頭辞を使用して定義されます。"oas:" 接頭辞の付いた名前は、 実行ファイルに定義されたホスト、アプリケーションおよびオブジェクト名の組合せで す。 アプリケーション・ タイプ 4. JNDI URL ネーミング・プロトコル アプリケーション オブジェクトは、oas://<hostname>[:<port>]/ <application_name>/<object_name> によって識別されます。 アプレット オブジェクトは、oas:///<application_name>/<object_name> に よって識別されます。 初期コンテキスト(または相対コンテキスト)から lookup() を実行して、オブジェク ト・リファレンスへの名前解決を行います。名前領域は、クライアントには読込み専用 である点に注意してください。 初期コンテキストから lookup を実行して、相対コンテキストを取り出すことができま す。その後、異なる JNDI 名の相対コンテキストから複数の lookup を実行できます。 JNDI オブジェクト名は、文字列識別子または CompoundName オブジェクトとして lookup メソッドに渡すことができます。 a. 文字列識別子 : 文字列には、ECO/Java アプリケーションの名前とオブジェクトの ホーム・インタフェースの名前が含まれます。アプリケーション名とホーム・イン タフェース名は、"/" で区切られた階層名です。ホーム・インタフェースのフル ネームは、アプリケーション名とホーム・インタフェース名を "/" で区切って組み 合せたものです。 <application name>/<object’s home interface name> 配布情報の詳細は、第 12 章「配布情報ファイルの作成」を参照してください。 b. JNDI 複合名 : JNDI オブジェクト名に "oas:" を付けて CompoundName オブジェク トを作成できます。 保護されているリスナーのリファレンスの解決 保護されていないリスナーでは、JNDI の lookup は次のようにして実行されます。 String siteContext = "oas://host:port"; Context site = (Context) ( (new InitialContext(env)).lookup(siteContext) ); ただし、JNDI は保護されているリスナーに対する lookup は実行できません。前述の例で、 保護されているリスナーがポートを占有している場合、lookup は失敗します。開発者は、 https 接続を必要としないポートに対して lookup を実行する必要があります。 13-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド オブジェクトのオブジェクト・リファレンスの取得 Admin リスナー(デフォルトではポート 8889)は、保護されていないリスナーであるため、 lookup に使用できます。たとえば、次のようにします。 String siteContext = "oas://host:8889"; Context site = (Context) ( (new InitialContext(env)).lookup(siteContext) ); クライアントからのネーム・サーバーへのアクセス クライアントはネーム・サーバーを初期化し、このサーバーから初期コンテキストを取り出 します。この後の項では、各タイプのクライアントがどのように初期化および抽出プロセス を実行するかを説明します。 ■ Java アプリケーション・クライアント ■ Java アプレット・クライアント ■ ECO/Java および JServlet クライアント Java アプリケーション・クライアント クライアントは、次のステップを実行します。 1. Hashtable 型の環境変数を指定してネーム・サーバーを初期化します。 この Hashtable は、ネーム・サーバーが入った Java パッケージです。 javax.naming.Context.INITIAL_CONTEXT_FACTORY プロパティには、初期コン テキスト・ファクトリ・クラスの "oracle.oas.naming.jndi.RemoteInitCtxFactory" を指定する必要がありま す。 Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi.RemoteInitCtxFactory"); 2. 初期コンテキストを取得します。初期コンテキストを取り出すには 2 つの方法がありま す。 a. 環境変数内で JNDI パッケージに InitialContext コンストラクタを指定します。 javax.naming.Context initialContext = new InitialContext(env); b. コマンド行からシステム・プロパティ内の JNDI パッケージを設定します。java コ マンドの -D オプションを使用してシステム・プロパティを定義します。 prompt> java -Dorg.omg.CORBA.ORBClass=oracle.oas.orb.CORBA.ORB -Dorg.omg.CORBA.ORBSingletonClass=oracle.oas.orb.CORBA.ORB -Djava.naming.factory.initial= oracle.oas.naming.jndi.RemoteInitCtxFactory myClientApp ECO/Java アプリケーションの クライアントの開発 13-5 オブジェクトのオブジェクト・リファレンスの取得 コード内では、InitialContext を作成する必要がありますが、パラメータとして環 境変数を設定する必要はありません。 javax.naming.Context initialContext = new InitialContext(); 便宜上、Oracle Application Server には、次のシステム・プロパティを持つ java 実 行モジュールを実行する ooj という名前のスクリプトが含まれています。 org.omg.CORBA.ORBClass = oracle.oas.orb.CORBA.ORB org.omg.CORBA.ORBSingletonClass = oracle.oas.orb.CORBA.ORB ooj を使用して前述のコマンドを実行するには、次のコードを使用します。 prompt> ooj -Djava.naming.factory.initial= oracle.oas.naming.jndi.RemoteInitCtxFactory myClientApp Java アプレット・クライアント クライアントは、次のステップを実行します。 1. 次の 2 つのプロパティを指定して、ネーム・サーバーを初期化します。 a. oracle.oas.naming.jndi.appletinstance プロパティ。プロパティの値は、 アプレット・インスタンスの Java.lang.Applet オブジェクトです。 b. ネーム・サーバーを含んだ Java パッケージ。 javax.naming.Context.INITIAL_CONTEXT_FACTORY プロパティには、初期 コンテキスト・ファクトリ・クラスの "oracle.oas.naming.jndi.RemoteInitCtxFactory" を指定する必要があり ます。環境変数のタイプは、Hashtable です。 // code in the applet Hashtable env = new Hashtable(); // "this" refers to the applet env.put("oracle.oas.naming.jndi.appletinstance", this); env.put(Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi.RemoteInitCtxFactory"); 2. 初期コンテキストを取得します。環境変数内で JNDI パッケージに InitialContext コンストラクタに設定することにより、初期コンテキストを取り出すことができます。 Context initialContext = new InitialContext(env); 13-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド オブジェクトのオブジェクト・リファレンスの取得 3. アプレットを起動する HTML ファイルで、次の名前と値のペアをアプレットのパラ メータとして宣言します。 org.omg.CORBA.ORBClass = oracle.oas.orb.CORBA.ORB org.omg.CORBA.ORBSingletonClass = oracle.oas.orb.CORBA.ORB アプレットの起動に関する詳細は、13-17 ページ「APPLET タグ」を参照してください。 クライアントのブラウザが Java 1.2 をサポートしていない場合、クライアントのブラウザに Sun の Java 1.2 プラグインをインストールしてください。プラグインとインストール手順に ついては、次を参照してください。 http://java.sun.com ECO/Java および JServlet クライアント オブジェクトのクライアントが別のオブジェクトまたは JServlet アプリケーションの場合、 InitialContext が環境内の javax.naming.Context.INITIAL_CONTEXT_FACTORY を渡さないようにしてください。このタイプのクライアントの場合、このプロパティは Oracle Application Server によって事前に JVM に設定されます。引数なしで初期コンテキス トを取得できます。 // get the initial context without specifying an environment javax.naming.Context initialContext = new InitialContext(); 注意 : JServlet アプリケーションを使用して EJB を実行するための情報 は、 『Oracle Application Server JServlet および JSP アプリケーション開発 者ガイド』を参照してください。 必要なオブジェクトの識別およびルックアップ クライアントは、InitialContext クラスの lookup() メソッドを実行して、次の 2 つの いずれかを取り出します。 ■ オブジェクトのホーム・インタフェースのオブジェクト・リファレンス ■ 中間 JNDI コンテキスト lookup() メソッドは、次の 2 つのパラメータのいずれかを使用します。 ■ ホーム・インタフェースまたは中間コンテキストの名前を指定する文字列。 ■ ホーム・インタフェース名または中間コンテキスト名を持つ、接頭辞 "oas:" の付いた JNDI CompoundName オブジェクト。Names および CompoundNames の使用方法の 詳細は、JavaSoft JNDI のドキュメントを参照してください。 オブジェクト・リファレンスを識別し、参照するための基本を次に説明します。ただし、参 照する名前を指定するための要件は、クライアント・タイプによって異なります。基本を理 解した後で、該当するクライアント・タイプの要件を参照してください。 ECO/Java アプリケーションの クライアントの開発 13-7 オブジェクトのオブジェクト・リファレンスの取得 基本 ホーム・インタフェース名の文字列の指定 ■ ■ 中間コンテキストの文字列の指定 注意 : CompoundName 解決に関する例は、ここでは説明しません。詳 細は、JNDI のドキュメントを参照してください。 クライアント・タイプの要件 Java アプリケーション・クライアント ■ ■ Java アプレット・クライアント ■ ECO/Java クライアント ■ JServlet クライアント ホーム・インタフェース名の文字列の指定 文字列パラメータの形式は次のとおりです。 oas://<host>:<port>/<application>/<object> <host> Oracle Application Server のリスナー・コンポーネントが実行されるマシン。 <port> リスナーがリクエストをリスニングするポート番号。設定されていない 場合、デフォルトは 80 です。 <application> アプリケーションの名前。これは、ECO オブジェクトの「設定」フォー ムの「名前」パラメータと一致している必要があります。このフォーム は、Oracle Application Server Manager で次の順に選択することにより 参照できます。 ECO アプリケーション名→ ECO Objects →オブジェクト名 <object> ホーム・オブジェクトを参照するためのクラス・ファイル。これは、 ECO.APP ファイルの className からパッケージ名を除いた値と一致し ている必要があります。className プロパティの詳細は、12-4 ページの 「オブジェクト・セクション」を参照してください。 たとえば、"eco/myStack" という名前の ECO/Java アプリケーションがあり、このアプリ ケーションに "ServerStack" という名前のオブジェクトが含まれている場合、オブジェクト の絶対名は次のようになります。 oas://host2/eco/myStack/ServerStack 13-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド オブジェクトのオブジェクト・リファレンスの取得 この名前は、アプリケーションがマシン "host2" のポート 80 で稼動しているリスナーに登録 されているものと仮定しています。これを図示すると、名前階層は図 13-1 に示すとおりにな ります。 図 13-1 Oracle Application Server 環境のサンプル・オブジェクト Oracle Application Server host1 host2 application_1 eco sub_application_1 object_1 myStack ServerStack object_2 " oas://host2/eco/myStack/ServerStack" という名前は、myStack アプリケーショ ンの ServerStack オブジェクトのホーム・インタフェースを参照します。host1 と host2 は、 Oracle Application Server のリスナー・コンポーネントを実行するマシンです。リスナーは、 同じまたは異なる Oracle Application Server のサイトで稼動可能です。アプリケーション名 は、"/" で区切られた複数のコンポーネントで構成できるため、注意してください(つまり、 "application_1/sub_application_1")。 この文字列は、lookup() メソッドでは次のように使用されます。 ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas://host2/eco/myStack/ServerStack"), ServerStackHome.class); 注意 : PortableRemoteObject クラスは、返されたホーム・インタ フェースを RMI リモート・インタフェースに限定するために使用されま す。返されたオブジェクト・リファレンスを限定するために PortableRemoteObject を使用する方法の詳細は、13-12 ページの 「PortableRemoteObject を使用した絞込み」を参照してください。 中間コンテキストの文字列の指定 名前が完全にオブジェクトに解決されない場合、lookup() メソッドは Context オブジェ クトを返します。たとえば、ECO/Java アプリケーションにのみ解決される名前を使用して lookup() をコールする場合、次のようになります。 ECO/Java アプリケーションの クライアントの開発 13-9 オブジェクトのオブジェクト・リファレンスの取得 // resolve only to the ECO/Java application javax.naming.Context appCtx = (Context) initialContext.lookup( "oas://host2/eco/myStack"); このメソッドは、それ以降の lookup() コール(アプリケーションのオブジェクトのオブ ジェクト・リファレンスを取得する)で使用できる Context オブジェクトを返します。た とえば、appCtx コンテキスト・オブジェクトは次の文で使用できます。 // use a relative name, context is from the first lookup() ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(appCtx.lookup( "ServerStack"),ServerStackHome.class); 2 番目の lookup() コールは、最初の lookup() コールで返されたコンテキスト・オブ ジェクトに対して行われるものです。この名前は相対名です。 注意 : URL 表記 "oas:" は、初期コンテキストから参照を実行するときに のみ必要です。中間コンテキストを取得すると JNDI プロバイダがわかり、 名前を直接指定することができます。 Java アプリケーション・クライアント オブジェクトのオブジェクト・リファレンスを取得するには、次のいずれかの方法を使用し ます。 ■ オブジェクトを指す絶対名を作成してから、そのオブジェクト(オブジェクトのホー ム・インタフェース)の lookup() を作成します。次の例では、"oas://host2/eco/ myStack/ServerStack" の絶対名を作成し、この名前に lookup を実行します。 ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas://host2/eco/myStack/ServerStack"), ServerStackHome.class); ■ アプリケーションまたは別の中間コンテキストを指す絶対名を作成します。後ろに、そ のオブジェクトを指す後続の lookup() コールを付けます。次の例では、"oas:// host2/eco/myStack" を使用して、中間コンテキストを mystack アプリケーションに 取り出します。次に、クラス名 ServerStack を指定して、オブジェクトの lookup を行 います。 javax.naming.Context appCtx = (Context) initialContext.lookup( "oas://host2/eco/myStack"); ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(appCtx.lookup( "ServerStack"),ServerStackHome.class); 13-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド オブジェクトのオブジェクト・リファレンスの取得 Java アプレット・クライアント アプレット・クライアントの場合、JNDI の参照名にホストとポート情報を明示的に設定す る必要はありません。環境変数にアプレット・インスタンスを設定すると、アプレットの参 照元がマークされます。これにより、ホストとポートがわかります。次の例で、"oas:/// eco/myStack/ServerStack" の絶対パス名を示しています。これにはホスト名が含まれ ていないことに注意してください。 // The host and port info do not appear in the name. For clients // that are applets, the host and port information are the same as the host:port // from which the applet was downloaded. Note that three "/" are used in the // lookup name. ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas:///eco/myStack/ServerStack"),ServerStackHome.class); ECO/Java クライアント ECO/Java オブジェクトは、Oracle Application Server 内の他の ECO/Java オブジェクトに アクセスしようとします。lookup に使用される JNDI 名は、オブジェクトがアクセスしよう としているのが同じアプリケーション内の別のオブジェクトか、あるいは別のアプリケー ション内にあるオブジェクトかによって異なります。JNDI プロバイダは、相対名の参照を サポートしています。 同じアプリケーション内のオブジェクトにアクセスする ターゲットのホーム・インタ フェースとクライアント・オブジェクトが同じアプリケーションに属する場合、そのアプリ ケーションに関連するサーバー・オブジェクトのホーム・インタフェース名のみ指定する必 要があります。次の例では、JNDI の参照名が "oas:ServerStack2" で、これにはホスト 名、eco 識別子またはアプリケーション名が含まれないことを示しています。 // ServerStack2 is the object. // Initial Context is assumed to have been specified as above. ServerStack2Home stack2Home = (ServerStack2Home) PortableRemoteObject.narrow(initialContext.lookup( "oas:ServerStack2"),ServerStack2Home.class); 異なるアプリケーションにあるオブジェクトにアクセスする 別のアプリケーションのオブ ジェクトにアクセスする場合、アプリケーションの名前とオブジェクトのホーム・インタ フェース名を、次の形式で指定する必要があります。 oas:/app/home_interface_name Oracle Application Server は現行サイトへのアクセス方法を把握しているため、ホストおよ びポート情報を指定する必要はありません。 ServerStack2Home stack2Home = (ServerStack2Home) PortableRemoteObject.narrow(initialContext.lookup( "oas:/app_name/ServerStack2"),ServerStack2Home.class); ECO/Java アプリケーションの クライアントの開発 13-11 オブジェクトのオブジェクト・リファレンスの取得 ホーム・インタフェースが別の Oracle Application Server サイト(異なるリスナーおよび ポート)に属する場合は、ホストおよびポート情報が必要です。 ServerStack2Home stack2Home = (ServerStack2Home) PortableRemoteObject.narrow(initialContext.lookup( "oas://site2/host2/app_name/ServerStack2"), ServerStack2Home.class); JServlet クライアント lookup で指定される JNDI 名は、JServlet カートリッジがアクセスしようとしているのがこ の Oracle Application Server サイト内のオブジェクトか、あるいは別の Oracle Application Server サイト内のオブジェクトかによって異なります。次の例では、同じ Oracle Application Server にあるオブジェクトにアクセスする場合に、ホスト名を含めないことを 示しています。 // object reference of home interface of object // object is on same application server as client, // no need to specify host and port ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas:///eco/myStack/ServerStack"),ServerStackHome.class); オブジェクトと JServlet カートリッジが別の Oracle Application Server サイトで稼動する場 合のみ、ホストとポート情報を指定する必要があります。 // host and port needed (default port 80 used) ServerStackHome stackHome = (ServerStackHome) PortableRemoteObject.narrow(initialContext.lookup( "oas://host2/myStack/ServerStack"),ServerStackHome.class); PortableRemoteObject を使用した絞込み PortableRemoteObject クラスの主な目的は、RMI リモート・オブジェクト・リファレ ンスを絞り込み、適用することにあります。JNDI が Logger などのローカル・オブジェク トを返す場合、返されたオブジェクトは具体的なデータ型になります。これは、Java キャス ト演算子を使用して、指定されたタイプの変数に割り当てることができます。 ただし、これは、この章で説明するホーム・インタフェースまたはリモート・インタフェー スなどの、リモート・オブジェクトのリファレンスには当てはまりません。この場合、キャ ストが可能になる前に、返されるオブジェクトを特定のリモート・インタフェース・タイプ に絞り込む必要があります。PortableRemoteObject.narrow メソッドは、リモート・ リファレンス、および返すことになっているクラス・タイプを引数として渡します。このメ ソッドは、この時点でキャスト演算子を使用して割当て可能なオブジェクトの正しいスタブ を返します。 13-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド オブジェクトの破棄 PortableRemoteObject は、クライアント・コールバックとして使用する CORBA インプ リメンテーションをアクティブまたは非アクティブにするために使用する、エクスポート方 法とエクスポートの取消し方法を指定します。 これらのサービスは CORBA が直接提供しますが、PortableRemoteObject を使用するこ とにより、CORBA のスタブおよびスケルトンがなくてもコードをコンパイルできます。こ れにより、今後、コードを EJB に容易に移行できます。 オブジェクトに対するメソッドの実行 ホーム・インタフェースへのリファレンスを取得すると、ホーム・インタフェースを通じて create() を実行することにより、ECO/Java オブジェクト(リモート・インタフェース) のインスタンスを生成できます。その後、ECO/Java オブジェクトの業務メソッドを実行で きます。たとえば、次のようにします。 // assume that stackHome contains the reference to ServerStackHome ServerStackRemote stackRemote = stackHome.create(); // push and pop are business methods stackRemote.push("12"); // store the value "12" on the stack int val = stackRemote.pop(); // remove the value from the top of the stack 注意 : 同じインスタンスに対するメソッドの実行は、順番に行う必要が あります。クライアント・スレッドの実行中に別のクライアント・スレッ ドが実行されると、2 回目の実行に対しては例外が発行されます。 オブジェクトの破棄 オブジェクトを参照する必要がなくなると、クライアントはそのオブジェクト上 で remove() メソッドをコールする必要があります。これにより、ORB がオブジェクト・ インスタンス(リモート・インタフェース)を解放し、JVM がガーベッジ・コレクト中にこ れをクリーン・アップできます。remove() メソッドにはパラメータは存在しません。 // release the object stackRemote.remove(); ECO/Java アプリケーションの クライアントの開発 13-13 JNDI がサポートする機能 JNDI がサポートする機能 Oracle Application Server の JNDI インプリメンテーションでは、JNDI ネーム・サービスに 対して読込み専用アクセス権をサポートしています。ユーザーには、インプリメンテーショ ンの JNDI SPI を使用してネーム・サービスの内容を変更する許可がありません。次の機能 のみ使用可能です。 ■ 参照の完全なインプリメンテーション(lookup() を使用したサブコンテキストの部分 的な名前の参照を含む) 。 ■ list() および listBindings() を使用したネーム・サービスの内容のリスト。 ■ 次のメソッドを含む、Environment オブジェクトへのアクセス : getEnvironment()、 addToEnvironment()、removeFromEnvironment()。 ■ getNameParser() を使用した名前解析の取出し。これは、CompoundName とともに 使用します。 ■ このコンテキストに相対的な名前で、コンテキストの名前を作成するメソッド(たとえ ば、composeName() の使用) 。 ■ 以前アクセス可能であったコンテキストのクローズ。 ■ サポートされているすべてのメソッドの String と Name バージョンのインプリメンテー ション。 さらに、アプレット、セキュリティまたは JNDI パッケージ名の設定では、特定の JNDI プ ロパティを設定する必要があります。これらのプロパティは、次の表に示すように、このマ ニュアル内の他の箇所にリストされています。 プロパティ 記載場所 パッケージ名の設定 javax.naming.Context.INITIAL_ 13-5 ページの「クライアント CONTEXT_FACTORY または からのネーム・サーバーへのア java.naming.factory.url.pkgs 内で クセス」 設定します。 クライアントを アプレットとして記述 oracle.oas.naming.jndi. appletinstance セキュリティの設定 javax.naming.Context.SECURITY_ PROTOCOL、 SECURITY_PRINCIPAL および SECURITY_CREDENTIALS を 設定します。 13-6 ページの「Java アプレット・ クライアント」 『Oracle Application Server セ キュリティ・ガイド』の第 5 章 「EJB または ECO/Java クライ アントの認証の設定」 13-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド クライアントに必要なファイル 注意 : JNDI プロパティは、次の 3 通りの方法のいずれかで設定できま す。プログラムによる設定、"-D" オプションを使用したコマンド行での設 定またはアプレット内の <PARAM> タグによる設定。 使用できない JNDI 機能 Oracle Application Server の JNDI インプリメンテーションでは、次の JNDI メソッドへのク ライアントのアクセスをサポートしていません。bind()、rebind()、unbind()、 rename()、createSubContext()、destroySubContext()。禁止されているメソッド はすべて javax.naming.NoPermissionException 例外を発行します。 Oracle Application Server の SPI インプリメンテーションでは、名前領域に対して読込み専 用アクセス権しかないため、バインディングを更新できません。 注意 : JNDI 初期コンテキストでの参照の操作には時間がかかります。 クライアントが複数のホーム・インタフェースを参照する必要がある場合、 初期コンテキストを使用して共通の中間コンテキストを参照してから、こ の相対中間コンテキストを使用してホーム・インタフェースを参照します。 クライアントに必要なファイル ■ Java クライアントに必要なファイル ■ Java 以外のクライアントに必要なファイル ■ アプレットに必要なファイル Java クライアントに必要なファイル クライアントには、オブジェクト・クライアント API および配布中に生成されたスタブへの アクセスが必要です。API とスタブ・ファイルは次の場所に入っています。 ■ $ORAWEB_HOME/classes/ecoapi.jar ■ $ORAWEB_HOME/../apps/eco/<appName>/_client.jar ECO/Java アプリケーションの クライアントの開発 13-15 クライアントに必要なファイル 注意 : oasdeploy を使用して、Java アプリケーションがサーバー・アプ リケーションとの通信に必要とする、クライアント・スタブの入った JAR ファイルをダウンロードできます。クライアントには、Oracle Application Server 4.0.8 または JDeveloper 2.0 をインストールしておく必 要があります。JAR ファイルのダウンロード先のディレクトリを指定する には oasdeploy -c オプションを使用します。たとえば、次のようにな ります。 oasdeploy -a myStack -u admin/adminpasswd@node1:8888 -c /client/stubs クライアントが Java 以外のアプリケーションの場合、次のファイルを取り出し、ご使用の 言語に合うようにそこからスタブをコンパイルする必要があります。 ■ $ORAWEB_HOME/../apps/eco/<appName>/OASClientInterfaces.idl ORB を使用するクライアントには、CLASSPATH に次のファイルも追加する必要がありま す。 ■ $ORAWEB_HOME/classes/oasoorb.jar ■ $ORACLE_HOME/jlib/javax-ssl-1_2.jar ■ $ORACLE_HOME/jlib/jssl-1_2.jar 前述のファイル、アプリケーション・クラス・ファイルおよび必須の例外クラス・ファイル をクライアントの CLASSPATH に追加します。 Java 以外のクライアントに必要なファイル Java 以外のクライアントも、ECO/Java オブジェクトのクライアントにすることができま す。たとえば、クライアントは、C++ クライアントや LiveHTML アプリケーションで実行 される Perl スクリプトでもかまいません。 Java 以外のクライアントから ECO/Java オブジェクトにアクセスするには、次のステップを 実行する必要があります。 1. インタフェース IDL である $ORAWEB_HOME/../apps/eco4j/<appName>/ OASClientInterfaces.idl を取り出します。このファイルには、ECO/Java アプリケー ションへのアクセス用 IDL ファイルが含まれています。 2. クライアントのスタブとスケルトンを作成します。OASClientInterfaces.idl ファイルを コンパイルする必要があります。このファイルはご使用の言語に合うように、IDL ファ イルから適切な IDL スタブおよびスケルトンを生成します。 ■ Perl スタブおよびスケルトンの場合、Oracle Application Server に付属の IDL-to-Perl コンパイラである perlidlc を使用できます。このコンパイラの詳細は、 『Oracle Application Server Perl アプリケーション開発者ガイド』を参照してください。 13-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド APPLET タグ prompt> cd $ORAWEB_HOME/../apps/eco4j/myApp prompt> perlidlc -i -I $ORACLE_HOME/public -I $ORAWEB_HOME/../apps/eco4j/ myApp $ORAWEB_HOME/../apps/eco4j/myApp/OASClientInterfaces.idl ■ C++ スタブおよびスケルトンの場合、17-7 ページの「IDL-to-Java コンパイラの使用」 で説明する oasoidlc コンパイラを使用します。このコンパイラには C++ オプション があります。 % oasoidlc -g cplus -i -I $ORACLE_HOME/public -I $ORAWEB_HOME/../apps/eco4j/ myApp -t $ORAWEB_HOME/../apps/eco4j/myApp/OASClientInterfaces.idl 非 CORBA 例外は、Java 以外のクライアントからは直接アクセスできないため注意してくだ さい。メタデータ、ハンドルおよび Java 例外は、Java クライアント用と Java 以外のクライ アント用の 2 つの表現を使用して IDL に転送されます。 アプレットに必要なファイル 必須のファイルは、<APPLET> タグの archive 属性で指定する必要があります。必要な ファイルは次のとおりです。 ■ 前の項で説明したファイル ■ アプレットのクラス・ファイル 注意 : ターゲットのブラウザが、APPLET タグの archive 属性で複数の JAR ファイルをサポートしていない場合、アプレットに必要なすべてのク ラス・ファイルを含んだ 1 つの JAR ファイルを作成する必要があります。 APPLET タグ <EMBED> タグ(Netscape の場合)または <OBJECT> タグ(Internet Explorer の場合)で次 のパラメータを使用することにより、アプレット・クライアントは Pure Java バージョンの Oracle Application Server ORB を使用できます。 <PARAM NAME="org.omg.CORBA.ORBClass" VALUE="oracle.oas.orb.CORBA.ORB"> <PARAM NAME="org.omg.CORBA.ORBSingletonClass" VALUE="oracle.oas.orb.CORBA.ORB"> 次の例で、Netscape および Internet Explorer でアプレットを実行する HTML タグを示します。 例 13-1 Netscape でのアプレットの実行 <EMBED type = "application/x-java-applet;version=1.2" java_CODE = "myApp.TextFuncsDemo.class" java_CODEBASE = "http://myserver/applet_dir" java_ARCHIVE = "ecoapi.jar,_client.jar,oasoorb.jar,applet_class_files.jar" org.omg.CORBA.ORBClass = "oracle.oas.orb.CORBA.ORB" ECO/Java アプリケーションの クライアントの開発 13-17 APPLET タグ org.omg.CORBA.ORBSingletonClass = "oracle.oas.orb.CORBA.ORB" ORBdisableLocator = "true" pluginspage = "http://java.sun.com/products/plugin/1.2/plugin-install.html"> </EMBED> 例 13-2 Internet Explorer でのアプレットの実行 <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="http://java.sun.com/products/plugin/1.2/jinstall-12-win32.cab#Version=1,2,0,0"> <PARAM NAME="CODE" VALUE="myApp.TextFuncsDemo.class"> <PARAM NAME="CODEBASE" VALUE="http://myserver/applet_dir"> <PARAM NAME="ARCHIVE" VALUE="ecoapi.jar,_client.jar,oasoorb.jar,applet_class_files.jar"> <PARAM NAME="type" VALUE="application/x-java-applet;version=1.2"> <PARAM NAME="org.omg.CORBA.ORBClass" VALUE="oracle.oas.orb.CORBA.ORB"> <PARAM NAME="org.omg.CORBA.ORBSingletonClass" VALUE="oracle.oas.orb.CORBA.ORB" <PARAM NAME="ORBdisableLocator" VALUE="true"> </OBJECT> Internet Explorer ユーザーへの注意 : 前述の例では、codebase が 2 回 定義されています。1 回目(属性として)は、ローカル・マシンに Java 1.2 プラグインが存在しない場合に、これをダウンロードする場所を定義 しています。2 回目(パラメータとして)は、アプレットのクラスと JAR ファイルの場所の URL を指しています。 ■ codebase 属性には絶対 URL を指定する必要があります。"." は使用できません(現行 ディレクトリ) 。 ■ archive 属性には、クライアントに必要なファイルが正しい順序で含まれている必要が あります。これらのファイルを codebase ディレクトリにコピーします。複数の _client.jar ファイルが存在する場合、codebase ディレクトリ内で一意のファイル名を 使用してください。 ■ org.omg.CORBA.ORBClass と org.omg.CORBA.ORBSingletonClass パラメータ は、プライマリ ORB クラスを示します。Pure Java バージョンの ORB を使用しない場 合は、ご使用の ORB の該当するクラスを指定します。 ■ Visigenic の Gatekeeper を使用しない場合は、ORBdisableLocator パラメータが必要 です。これが指定されず、クライアントが Visigenic ORB を使用している場合、クライ アントの ORB は常に Gatekeeper を使用するものとみなします。 ■ JNDI SPI インプリメンテーションでは、<PARAM> タグから多くの環境属性を自動的に 抽出できます。例外は、INITIAL_CONTEXT_FACTORY と oracle.oas.naming.jndi.appletinstance です。 ■ 表示されているとおりに Internet Explorer の OBJECT タグを入力します。classid 属性 では、Windows レジストリ内の Java 1.2 プラグイン識別子を指定します。codebase 属性では、ローカル・マシンに Java 1.2 プラグインが存在しない場合に、これをダウン ロードする元の場所を定義します。 13-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド コールバックの作成 コールバックの作成 クライアントは、ECO/Java サーバー・オブジェクトがクライアントのリモート・インタ フェースを実行できるようにすることにより、コールバックを作成できます。基本的に ECO/Java サーバー・オブジェクトは、クライアントのリモート・インタフェースを、 Oracle Application Server の別のオブジェクトであるかのように実行します。クライアント は、ECO/Java の JAR ファイル内のリモート・インタフェースをオブジェクトであるかのよ うに、提供する必要があります。 ECO/Java がリモート・インタフェースにアクセスすると、クライアントは、クライアン ト・オブジェクトのオブジェクト・リファレンスをサーバーの ECO/Java オブジェクトに渡 します。このクライアント・オブジェクトは、CORBA ベースのオブジェクトである必要が あります。サーバーの ECO/Java オブジェクトはオブジェクト・リファレンスを使用して、 クライアントの CORBA オブジェクトに対してメソッドを実行します。図 13-2 に、その関 係を示します。 図 13-2 クライアント側の CORBA オブジェクトに対してメソッドを実行する ECO/Java オブジェクト 1. CORBA オブジェクトのリファレンスを渡す クライアント ECO/Java オブジェクト CORBA オブジェクト 2. リファレンスを使用して CORBA オブジェクトに対してメソッドを実行する クライアント側の CORBA オブジェクトの作成 1. CORBA オブジェクトのリモート・インタフェースを作成します。このリモート・イン タフェースは、JCORBA オブジェクトのガイドラインに従う必要があります。 2. 配布前に、リモート・インタフェース・ファイルを ECO/Java アプリケーションの JAR ファイルに挿入します。これによって、Oracle Application Server がリモート・インタ フェースから IDL ファイルを生成できるようになります。 3. CORBA オブジェクトのリモート・インタフェースで指定されたメソッドをインプリメ ントします。リモート・インタフェースのインプリメンテーション・クラスは、スケル トンを拡張する必要があります。これは、_<remoteInterface>ImplBase 抽象クラ スです。 4. オブジェクトのインスタンスに、SessionBean パラメータの一部としてリファレンスを 渡します。状態を保持する SessionBean はリファレンスを保持し、それをクライアント へのコールバックに使用できます。 ECO/Java アプリケーションの クライアントの開発 13-19 コールバックの作成 5. PortableRemoteObject.unexport() を使用して、コールバックを非アクティブにで きます。PortableRemoteObject.export() を使用すると、オブジェクトを引数とし て渡す前にアクティブにできます。ただし、ほとんどの ORB は、オブジェクトが引数 として送られるときにそれらのオブジェクトをアクティブにします。 サーバー側の ECO/Java オブジェクト内でのコールバックの作成 1. CORBA オブジェクトのリファレンスを受け取るメソッドをインプリメントします。 2. このリファレンスを変数に格納します。 3. このリファレンスを使用して CORBA オブジェクトに対してメソッドを実行します。 例 この例では、クライアント("GreetMe")が新しいオペレータをコールして、CORBA オブ ジェクトのインスタンスを生成し、ECO/Java オブジェクトにオブジェクト・リファレンス を渡しています。ECO/Java オブジェクトは、インスタンス変数にオブジェクト・リファレ ンスを格納します。 次にクライアントは、クライアント側の CORBA オブジェクトをコールする、サーバー側の ECO/Java オブジェクトのメソッドをコールします。図 13-3 にこれらのステップを示しま す。 図 13-3 例でクライアントが発行するコマンドの順序 クライアント サーバー 1. JNDI をコールして、 ECO/Java ホーム・インタフェースのリファレンスを取得する 2. ホーム・インタフェースから create を実行してオブジェクトを作成する 3. ECO/Java オブジェクトに対してメソッドをコールする CORBA オブジェクト 4. CORBA オブジェクトのインスタンスを生成する 5. CORBA オブジェクトのオブジェクト・ リファレンスを ECO/Java オブジェクトに渡す 6. ECO/Java オブジェクトに対してメソッドを コールする ECO/Java オブジェクト 7. CORBA オブジェクトに対して メソッドを実行する 13-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド コールバックの作成 両サイドのコードは次のとおりです。 ■ ECO/Java オブジェクト ■ クライアント ECO/Java オブジェクト ECO/Java オブジェクトには次のファイルが含まれます。 表 13-1 ECO/Java オブジェクトのファイル。 ファイル 説明 ServerHelloWorldHome.java ECO/Java オブジェクトのホーム・インタフェース。 ServerHelloWorldRemote.java ECO/Java オブジェクトのインタフェース。 ServerHelloWorld.java ECO/Java のインプリメンテーション。 CallbackHelloWorldInterface.java CORBA オブジェクトのインタフェース。 ECO.APP 配布情報ファイル。 ServerHelloWorldHome.java このファイルにはホーム・インタフェースが入っています。これに は create メソッドが含まれ、ECO/Java オブジェクトの独自のリモート・インタフェース のインスタンスを生成します。 package Greetings; public inteface ServerHelloWorldHome extends oracle.oas.eco.ECOHome { public ServerHelloWorldHome create() throws oracle.oas.eco.CreateException; } ServerHelloWorldRemote.java このファイルは、ECO/Java オブジェクトのリモート・インタ フェースを定義します。これには、次のメソッドが含まれています。 ■ registerCallbackObject()— コールバック用 CORBA オブジェクトのオブジェク ト・リファレンスをクライアント側の CORBA オブジェクトに保存します。 ■ useCallbackObject()— オブジェクト・リファレンスを使用してクライアント側の CORBA オブジェクトに対してメソッドを実行します。 ECO/Java アプリケーションの クライアントの開発 13-21 コールバックの作成 package greetings; public interface ServerHelloWorldRemote extends oracle.oas.eco.ECOObject { public String getMessage(); public void registerCallbackObject(CallbackHelloWorldInterface p_chwi); public String useCallbackObject(); } ServerHelloWorld.java このファイルには ECO/Java オブジェクトのインプリメンテーションが 入っています。これは、リモート・インタフェース ServerHelloWorldRemote.java をインプ リメントします。 package greetings; public class ServerHelloWorld { CallbackHelloWorldInterface _chwi = null; // constructor with no arguments public ServerHelloWorld() { } // A method that a client can invoke public String getMessage() { return "ServerHelloWorld.getMessage(): A quick brown fox jumps over a lazy dog."; } // The client calls this method to pass in the object reference to the // client-side CORBA object. The method stores the value in the // _chwi instance variable. // The variable is used by the useCallbackObject() method. public void registerCallbackObject(CallbackHelloWorldInterface p_chwi) { _chwi = p_chwi; } // The ECO/Java server object can invoke a method on the client-side // CORBA object. public String useCallbackObject() { String _str; if (_chwi == null) _str = "No CallbackObject has been registered!"; else { _str = "Invoking method on registered CallbackObject..." + System.getProperty("line.separator"); _str += _chwi.getMessage(); // invoke a method on a CORBA object } 13-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド コールバックの作成 return _str; } } CallbackHelloWorldInterface.java このファイルは、クライアント側の CORBA オブジェクトのリ モート・インタフェースです。このファイルには、ECO/Java オブジェクトから実行可能な getMessage メソッドがリストされています。 package greetings; public interface CallbackHelloWorldInterface extends org.omg.CORBA.Object { public String getMessage(); } ECO.APP これは、ECO/Java オブジェクトの配布情報ファイルです。 [APPLICATION] name = ECOCallback [ServerHelloWorld] className = greetings.ServerHelloWorld homeInterface = greetings.ServerHelloWorldHome remoteInterface = greetings.ServerHelloWorldRemote クライアント ECO/Java オブジェクトのクライアントは、CORBA オブジェクトのオブジェクト・リファ レンスを ECO/Java オブジェクトに渡す、スタンドアロンの Java アプリケーションです。 これは、ECO/Java オブジェクトに対して registerCallbackObject() メソッドをコー ルすることにより行います。 この CORBA オブジェクトは "CallbackHelloWorld" という名前で、そのインタフェースは "CallbackHelloWorldInterface" です。 ECO/Java アプリケーションの クライアントの開発 13-23 コールバックの作成 クライアントには次のファイルが含まれます。 表 13-2 クライアントのファイル ファイル 説明 GreetMe.java クライアントのメイン・ファイル。 CallbackHelloWorldInterface.java CORBA オブジェクトのインタフェース。 CallbackHelloWorld.java CORBA オブジェクトのインプリメンテーション。 ServerHelloWorldHome.java ECO/Java オブジェクトのホーム・ インタフェース。 ServerHelloWorldRemote.java ECO/Java オブジェクトのリモート・ インタフェース。 GreetMe.java このファイルはクライアントのメイン・ファイルです。アプリケーションの main() メソッドが含まれています。 package GreetingsClient; import import import import import import import import java.net.URL; java.util.Hashtable; javax.naming.*; oracle.oas.eco.*; oracle.oas.naming.jndi.*; greetings.ServerHelloWorldHome; greetings.ServerHelloWorldRemote; greetings.CallbackHelloWorldInterface; public class GreetMe { public static void main(String[] args) { ServerHelloWorldRemote remoteRef = null; Hashtable env = new Hashtable(); Context siteContext = null; try { String urlStr = args[0]; //Initialize the JNDI Naming Service and retrieve an initial ctx. env.put(Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi.RemoteInitCtxFactory"); Context initialContext = new InitialContext(env); // args[0] or urlStr is the first argument after the class name. 13-24 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド コールバックの作成 // It specifies the host that is running the listener component //of the app server in the form "oas://hostname:port" siteContext = initialContext.lookup(urlStr); // lookup home interface and instantiate related remote interface remoteRef = ((ServerHelloWorldHome) PortableRemoteObject.narrow(siteContext.lookup( "/ECOCallback/ServerHelloWorld"), ServerHelloWorldHome.class)).create(); // Invoke a simple method on ServerHelloWorld ECO/Java. System.out.println(remoteRef.getMessage()); // Create a new Callback CORBA Object. CallbackHelloWorldInterface helloWorld = new CallbackHelloWorld(); // Register it with the ServerHelloWorld ECO/Java. remoteRef.registerCallbackObject(helloWorld); // Invoke a method on the ServerHelloWorld ECO/Java which then // invokes a method on the Callback Object which was registered in the // previous step. System.out.println(remoteRef.useCallbackObject()); System.out.println(); System.out.println("ECO/Java Callback demo has completed successfully."); } catch ( java.net.MalformedURLException mfe) { mfe.printStackTrace(System.out); return; } } } CallbackHelloWorldInterface.java このファイルには CORBA オブジェクトのリモート・インタ フェースが入っています。 このファイルは ECO/Java オブジェクトにもコピーされます。ECO/Java アプリケーション のインストール時に、Oracle Application Server はインタフェースから IDL、スタブおよび スケルトンを生成します。 ECO/Java アプリケーションの クライアントの開発 13-25 JNDI プロバイダのパフォーマンス機能 package greetings; public interface CallbackHelloWorldInterface extends oracle.oas.eco.ECOObject { public String getMessage(); } CallbackHelloWorld.java これは、クライアント側の CORBA オブジェクトのインプリメンテー ションです。この中には、リモート・インタフェースに定義したメソッドが入っています。 スケルトン・クラスである _CallbackHelloWorldInterfaceImplBase を拡張していま す。 package GreetingsClient; public class CallbackHelloWorld extends _CallbackHelloWorldInterfaceImplBase { public String getMessage() { return "CallbackHelloWorld.getMessage(): A lazy fox jumps over a quick, brown dog."; } } ServerHelloWorldRemote.java このファイルには、ECO/Java オブジェクトのリモート・インタ フェースが入っています。これは、ECO/Java オブジェクトのファイルと同じファイルで す。 package greetings; public interface ServerHelloWorldRemote extends oracle.oas.eco.ECOObject { public String getMessage(); public void registerCallbackObject(CallbackHelloWorldInterface p_chwi); public String useCallbackObject(); } JNDI プロバイダのパフォーマンス機能 Oracle Application Server の JNDI SPI プロバイダは共同ロケーションをサポートしており、 ECO/Java アプリケーションのパフォーマンスを向上します。 オブジェクトの共同ロケーション 共同ロケーションにより、特定のクライアントからリクエストされたアプリケーション内の ホーム・インタフェースとオブジェクトがすべて同じ JVM に置かれていることを保証でき ます。すべてのオブジェクトを同じ JVM に置くことにより、Oracle Application Server はプ ロセス間通信とネットワーク上のリモート接続数を減らします。クライアントに関連付けら れているオブジェクトがすべて共同ロケーションにあるため、Oracle Application Server は クライアントのために使用するリソースをより効率的に管理および共有できます。 13-26 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド JNDI プロバイダのパフォーマンス機能 共同ロケーションは、SPI プロバイダのキャッシュを使用して設定します。アプリケーショ ンを使用するクライアントが特定のアプリケーション・インスタンスに接続されると、SPI は自分のキャッシュを使用して、同じアプリケーションに対する後続のリクエストが同じ JVM によって処理されることを保証します。つまり、アプリケーション名に対応するコンテ キストの参照が実行されると、JNDI は、クライアントを特定の JVM 内の特定のアプリケー ション・インスタンスに関連付けます。後続の同一アプリケーション名へのアクセスがあれ ば、同じアプリケーション・インスタンスに割り当てられます。 キャッシング方法 デフォルトのキャッシング方法に対応する動作は、クライアントのタイプによって異なりま す。 クライアント・アプリケーション デフォルトでは、静的キャッシュを使用します。キャッシュは静的変数です。JNDI リクエ ストは、すべて同じキャッシュを使用します。 Java アプレット デフォルトは、アプレット・インスタンスに関連付けられたキャッシュです。つまり、特定 のアプレット内で作成されたオブジェクトは、すべて処理されることを意味します。 Oracle Application Server の ECO/Java オブジェクト デフォルトでは、オブジェクトが実行されているアプリケーション・インスタンスに関連付 けられたキャッシュを使用します。これは、クライアントに属するオブジェクトが作成した オブジェクトも、すべて共同ロケーションに置かれることを意味します。 JServlet セッションを使用可能なサーブレットの場合、そのセッションに対応するキャッシュがデ フォルトです。詳細は、 『Oracle Application Server JServlet および JSP アプリケーション開 発者ガイド』を参照してください。 キャッシュのクリーン・アップ アプリケーション・インスタンスとクライアントとの関連付けは、キャッシュがクリーン・ アップされた時点で終了します。これは、ユーザーが初期コンテキストに対して Context.close() を実行したときに発生します。 ECO/Java アプリケーションの クライアントの開発 13-27 JNDI プロバイダのパフォーマンス機能 アプリケーション・インスタンスの終了 コンテキストがクローズされたためにクライアントのキャッシュが解放されると、関連付け が終了したことがアプリケーション・インスタンスに通知されます。この時点で、どのクラ イアントも JNDI 経由でホーム・インタフェースにはアクセスできなくなります。すべての オブジェクトが削除されているはずなので、アプリケーション・インスタンスはクライアン トとの関連付けを終了し、新しいクライアントに割り当てることができます。 ただし、クライアントがすべてのオブジェクトを削除(または破棄)していない場合もあり ます。かわりに、クライアントはオブジェクトに対するハンドルをシリアライズし、後で使 用できるようにファイルに保管していることがあります。このような場合、親のないアプリ ケーション・インスタンスは、残りのオブジェクトが削除されるか、あるいはタイムアウト になるまでアクティブである必要があります。この時点で、アプリケーション・インスタン スの関連付けは終了したものとみなされます。 関連付けが終了すると、アプリケーション・インスタンスの JNDI キャッシュがクリーン・ アップされます。関連付けの解消は、もとのアプリケーション・インスタンスのオブジェク トによって作成された他のすべてのアプリケーションに伝播します。 親のないアプリケーション・インスタンスによって消費されるリソースの量によっては、ク ライアント・アプリケーションを終了する前に(可能なら)オブジェクトをすべて削除し、 一時的に作成されたオブジェクトも削除されていることを確認することが重要です。 13-28 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 14 ECO/Java オブジェクトのトランザクション この章では、トランザクション型の ECO/Java オブジェクトの作成方法について説明しま す。宣言またはプログラムによる方法のいずれかを使用して、Bean 内でトランザクションを 使用可能にできます。 ■ 宣言トランザクション : ECO/Java のランタイムが Bean のかわりにトランザクション操 作を実行します。 ■ プログラムによるトランザクション : Bean が、必要に応じて各トランザクション操作を 実行する必要があります。 この章を読む前に、 『Oracle Application Server 管理者ガイド』の第 11 章「トランザクショ ンを使用可能にする」を読んで、Oracle Application Server のトランザクション・サービス について理解しておいてください。 内容 ■ 概要 ■ 宣言トランザクション ■ プログラムによるトランザクション ■ トランザクションとスレッド ■ 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション 概要 ECO/Java オブジェクトは、宣言トランザクションおよびプログラムによるトランザクショ ンをサポートしています。宣言トランザクションでは、Oracle Application Server が自動的 にトランザクションを区切ります。プログラムによるトランザクションでは、ユーザーが UserTransaction クラスのメソッドを使用してトランザクションを区切ります。 JDBC を使用して、ECO/Java オブジェクトからデータベースにアクセスします。トランザ クションに関係するデータベースが 1 つのみで、そのトランザクションを 1 回のメソッド・ ECO/Java オブジェクトのトランザクション 14-1 概要 コール内で完了できる場合、JTS を認識しない JDBC ドライバが使用できるため、JTS トラ ンザクションを使用する必要はありません。ただし、トランザクションが複数のメソッドに またがって実行されたり、複数のオブジェクトと一緒に実行されるか、あるいは複数のデー タベースにまたがる場合は、JTS および JTS を認識する JDBC ドライバを使用する必要があ ります。 JTS を JDBC と一緒に使用するには次のものが必要です。 ■ JTS を使用できる JDBC ドライバ。 Oracle Application Server には、Oracle7 と Oracle8 データベースに接続する、JTS の使 用が可能なドライバが付属しています。 ■ Oracle Application Server のトランザクションの DAD(Database Access Descriptor)。 DAD は、トランザクションに含まれるデータベースについての情報を提供します。ト ランザクションを使用できるように DAD を設定する方法は、 『Oracle Application Server 管理者ガイド』の第 11 章「トランザクションを使用可能にする」を参照してく ださい。 配布情報ファイルのトランザクション・パラメータ JTS を使用するアプリケーション用に JCO.APP ファイルを作成する場合、次のパラメータ を含める必要があります。 トランザクション このパラメータを JCO.APP の [APPLICATION] セクションに追加します。値は、ENABLED または DISABLED です。値には大文字・小文字の区別はありません。 transactionalDads このパラメータを JCO.APP の [APPLICATION] セクションに追加します。値は、アプリ ケーションが使用するトランザクションの DAD のカンマ区切りのリストです。 transactionMode このパラメータを JCO.APP の [<object>] セクションに追加します。値は、表 14-1 にリスト されているトランザクション・モードのうちの 1 つです。各モードは、宣言トランザクショ ン型オブジェクトまたはプログラムによるトランザクション型オブジェクトに使用されま す。 ■ 宣言トランザクション・モード : TX_NOT_SUPPORTED、TX_REQUIRED、 TX_SUPPORTS、TX_REQUIRES_NEW、TX_MANDATORY。 ■ プログラムによるトランザクション・モード : TX_BEAN_MANAGED または TX_BEAN_MANAGED_EXT。 14-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 概要 注意 : 受信したトランザクション・コンテキストを処理しない場合は、 TX_BEAN_MANAGED_EXT を使用します。受信したトランザクション・ コンテキストにアクセスして処理する場合は、 TX_BEAN_MANAGED_EXT を使用します。 このパラメータが指定されていない場合、次のルールが適用されます。 ■ transactions パラメータの値が DISABLED の場合、デフォルト値は TX_NOT_SUPPORTED。 ■ transactions パラメータの値が ENABLED の場合、デフォルト値は TX_BEAN_MANAGED_EXT。 逆に、transactionMode パラメータの値が TX_NOT_SUPPORTED 以外の場合、 transactions パラメータの値は ENABLED であるとみなされます。 例 14-1 JCO.APP 例 [APPLICATION] name = Payroll idleTimeOut = 2000 transactions = ENABLED transactionalDads = payroll, hr [DBProc] className = myApp.DBProc remoteInterface = myApp.DBInterface transactionMode = TX_BEAN_MANAGED JTS を使用可能な JDBC ドライバ トランザクション内でデータベース・アクセスに使用する JDBC ドライバは、Oracle Application Server 付属のドライバなど、JTS(Java Transaction Service)を使用できるもの にしてください。 JDBC では、DriverManager クラスの getConnection() メソッドを使用して、データ ベース接続をオープンします。このメソッドは、データベース URL を指定するパラメータ を使用して、データベースを検索し、ログインします。データベース URL の形式はドライ ブ固有です。 JTS の使用が可能な JDBC ドライバを使用する場合、データベースの URL は次の形式のいず れかになります。 jdbc:oracle:jts7:@<dadname> jdbc:oracle:jts8:@<dadname> ECO/Java オブジェクトのトランザクション 14-3 宣言トランザクション <dadname> には、トランザクションの DAD(Database Access Descriptor)の名前を指定 します。トランザクションを使用できるように DAD を設定する方法は、 『Oracle Application Server 管理者ガイド』の第 11 章「トランザクションを使用可能にする」を参照 してください。 データベース URL に DAD を(接続文字列のかわりに)使用することにより、ユーザーは、 トランザクションがどのデータベースを使用するかを知っている必要があります。トランザ クションの DAD には有効なユーザー名 / パスワードが必要です。 注意 : JTS の使用が可能なドライバは、常に非自動コミット・モードで す。ECO/Java オブジェクトに明示的にモードを設定する必要はありませ ん。JTS ドライバと OCI Oracle ドライバは、ECO/Java アプリケーション に事前に登録されています。DriverManager がドライバを探すために、 Class.forName() を使用する必要はありません。 宣言トランザクション 宣言トランザクションを使用する場合、ECO/Java ランタイムが、ECO/Java オブジェクト に配置記述子パラメータを設定してトランザクションを区切るようにします。ECO/Java ラ ンタイムは、各オブジェクトに設定されているパラメータ値の指定どおりに、自動的にトラ ンザクションを管理します。ECO/Java ランタイムは、オブジェクトにとって適切なとき に、トランザクションの開始、コミット、保留およびロールバックを行います。たとえば、 TX_REQUIRED モードにより定義されたオブジェクトのメソッドを実行すると、メソッドの 開始時に ECO/Java ランタイムがトランザクションを開始し、メソッドの終了時にエラーが 発生したかどうかに応じて、トランザクションのコミットまたはロールバックを行います。 宣言トランザクションとプログラムによるトランザクションのどちらを使用するかはユー ザーが決定できます。プログラムによるトランザクションでは手動でコードを作成する必要 がありますが、宣言トランザクションでは、ほとんどのトランザクションの区切りが自動的 に行われます。ただし、ECO/Java アプリケーションで宣言トランザクションを使用する場 合、OTS によりプロセス間でトランザクション・コンテキストが渡されます。アプリケー ションで複数の RM を使用する分散トランザクション用に OTS を使用すると、必要となる 2 フェーズ・コミットの通信オーバーヘッドのためにパフォーマンスが低下します。 宣言トランザクションの設定 ECO/Java オブジェクトの宣言トランザクションを定義するには、次のステップを実行しま す。 ■ 接続するデータベースを指定する。 ■ ECO/Java オブジェクトのトランザクション・モードを設定する。 ■ データベース操作を実行する。 14-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 宣言トランザクション データベースへの接続 データベースを指定するには、DriverManager クラスの getConnection() メソッドを コールします。詳細は、14-3 ページの「JTS を使用可能な JDBC ドライバ」に記載されてい ます。次のコードは、このメソッドの使用方法を示しています。 /* Connect to the Oracle 8 database using the DAD called DADNAME */ Connection conn = DriverManager.getConnection("jdbc:oracle:jts8:@DADNAME"); /* create a JDBC statement object */ Statement stmt = conn.createStatement(); アプリケーション内の各オブジェクトは、事前定義済みの DAD の集合をデータベース接続 に使用できます。これを行うには、各オブジェクトの「Object Environment」フォームにお いて、 「名前」フィールドで txdad プロパティによって DAD を指定し、「値」フィールドで カンマ区切りのリストとして DAD を指定します。例えば、名前と値のペアは次のようにな ります。 txdad = dad1,dad2,dad3 同じアプリケーション内のすべてのオブジェクトでデータベース接続を共有する場合は、 txdad パラメータを設定しないでください。オブジェクトは、アプリケーションの「トラン ザクション・プロパテイ」フォームにリストされている DAD を共有します。 これらのフォームの詳細は、12-12 ページの「ECO/Java アプリケーションの設定」または 『Oracle Application Sever 管理者ガイド』を参照してください。 トランザクション・モードの設定 トランザクション・モードは、ECO/Java ランタイムがトランザクションをいつ開始するか を指定します。クライアントが ECO/Java オブジェクト内のメソッドを実行すると、ECO/ Java ランタイムは、オブジェクトに設定されているモードに基づいてトランザクションの方 法を判断します。JCO.APP ファイルで、オブジェクト・レベルの transactionMode パラ メータのモードを次の値のいずれかに設定します。 ECO/Java オブジェクトのトランザクション 14-5 宣言トランザクション 表 14-1 トランザクション・モード モード 説明 TX_NOT_SUPPORTED ECO/Java オブジェクトのメソッドは宣言トランザクションをサポー トしていないため、これらはトランザクション・コンテキストの外で 実行されます。トランザクション・コンテキスト内にあるクライアン トが TX_NOT_SUPPORTED オブジェクトのメソッドをコールする と、現行のトランザクションは保留されます。メソッドがリターンす るとトランザクションは再開します。 TX_REQUIRED トランザクション・コンテキスト内のクライアントが ECO/Java オ ブジェクトのメソッドをコールした場合、そのメソッドを実行するた めにトランザクション・コンテキストが使用されます。クライアント がトランザクション・コンテキスト内にない場合は、新しいトランザ クションが起動されます。メソッドが終了するとトランザクションが コミットされます。 TX_SUPPORTS トランザクション・コンテキスト内のクライアントが ECO/Java オ ブジェクトのメソッドをコールすると、そのメソッドは同じトランザ クション・コンテキスト内で実行されます。 クライアントがトランザクション・コンテキスト内にない場合は、メ ソッドはトランザクションのスコープ外で実行されます。 TX_REQUIRES_NEW トランザクション・コンテキストにあるクライアントが ECO/Java オブジェクトのメソッドをコールすると、現行のトランザクションは 保留され、メソッドは新しいトランザクション・コンテキストで実行 されます。メソッドが終了すると新規のトランザクションはコミット されます。メソッドが終了すると最初のトランザクションが再開され ます。 クライアントがトランザクションのスコープ内にない場合、トランザ クション・コーディネータはメソッドを実行するための新規トランザ クションを開始して、メソッド終了時にトランザクションをコミット します。 TX_MANDATORY クライアントがトランザクション・コンテキスト内にある場合、クラ イアントは ECO/Java オブジェクト上でメソッドを実行する必要が あります。そうしないと、ECO/Java オブジェクトはクライアントに TransactionRequired 例外を発行します。 TX_BEAN_MANAGED TX_BEAN_MANAGED オブジェクトのメソッドは、 javax.jts.UserTransaction オブジェクトを使用してトランザク ションを区切ります。トランザクション属性を TX_BEAN_MANAGED に設定すると、ECO/Java オブジェクトがプ ログラムによるトランザクション・モデルを使用することを示しま す。 クライアントがすでにトランザクション・コンテキスト内にあるとき に、クライアントが ECO/Java オブジェクトを起動すると、受信し たトランザクションが保留されます。 14-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 宣言トランザクション 次の表は、TransactionMode ディレクティブの値がトランザクション・コンテキストにど のように影響するかを要約したものです。 表 14-2 トランザクション・モード(サマリー) 値 クライアントが トランザクション・コンテキスト 使用される にあるかどうか トランザクション・コンテキスト TX_NOT_SUPPORTED はい なし(クライアントのトランザク ションは保留される ) いいえ なし はい クライアントのトランザクショ ン・コンテキスト いいえ 新規のトランザクション・コンテ キスト はい クライアントのトランザクショ ン・コンテキスト いいえ なし はい 新規のトランザクション・コンテ キスト(クライアントのトランザ クションは保留される ) いいえ 新規のトランザクション・コンテ キスト はい クライアントのトランザクショ ン・コンテキスト いいえ TransactionRequired 例外の発 行 はい クライアントのトランザクション を保留 いいえ なし TX_REQUIRED TX_SUPPORTS TX_REQUIRES_NEW TX_MANDATORY TX_BEAN_MANAGED ECO/Java オブジェクトのトランザクション 14-7 宣言トランザクション 宣言トランザクションの例 この例では、クライアントは "Payroll/DBProc" という名前の ECO/Java オブジェクトに接 続し、そのオブジェクト上でメソッドを実行します。トランザクション・パラメータを ENABLED に設定し、トランザクションの DAD を設定して、トランザクション・モードを TX_REQUIRED に設定することにより、このオブジェクトは、その JCO.APP ファイル内で 宣言トランザクションとして宣言されます。クライアントが Payroll/DBProc オブジェクト 内でメソッドを実行すると、ECO/Java ランタイムは、現行トランザクション内で継続され るか、あるいは現在実行中のトランザクションがない場合には、新規トランザクションを開 始します。これが発生するのは、オブジェクトが TX_REQUIRED モードに設定されている ためです。 JCO.APP [APPLICATION] name = Payroll idleTimeOut = 2000 transactions = ENABLED transactionalDads = payrolldad [DBProc] className = DBprocessing remoteInterface = DBInterface transactionMode = TX_REQUIRED [DBProc.ENV] DBNAME = payrolldad ECO/Java オブジェクトのリモート・インタフェース // the remote interface for the ECO/Java object public interface DBInterface extends oracle.oas.jco.JCORemote { public void updateEmployees(); public void updateManagers(); } ECO/Java オブジェクト DBProc オブジェクトには、updateEmployees() と updateManagers() の 2 つのメソッドが含 まれます。オブジェクトは TX_REQUIRED として定義されています。このためどちらのメ ソッドも、実行されると、新規トランザクションを開始するかまたは既存のトランザクショ ンを継続します。トランザクションがいずれかのメソッドで開始された場合、そのトランザ クションは、メソッドの完了時にコミットまたはロールバックされます。 updateEmployees() メソッドは、決してトランザクション内でコールされないように設計さ れていますが、updateManagers() メソッドはトランザクション内からコールできます。 14-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 宣言トランザクション ■ updateEmployees()— このメソッドを使用すると、ECO/Java ランタイムは常にトラ ンザクションを開始し、コミットします。 ■ updateManagers()— このメソッドを使用すると、ECO/Java ランタイムは新しいトラ ンザクションを開始するか、またはトランザクション・コンテキストを継続します。メ ソッドがクライアントから直接コールされた場合、オブジェクトは新規トランザクショ ンを開始します。メソッドは、updateEmployees() からコールされると、コール元の メソッドで開始されたトランザクション・コンテキストを使用します。 1 つ以上のデータベース内で変更を行う場合、JTS の使用が可能な JDBC ドライバ接続を オープンして、トランザクションの DAD に接続する必要があります。データベースを識別 する DAD は、Oracle Application Server Manager 内で設定し、JCO.APP 内で指定する必要 があります。メソッドは、getConnection() コール内のデータベース URL の DAD 名の先 頭に "jdbc:oracle:jts7:@" を追加することにより、JTS の使用が可能なデータベース接続用 JDBC ドライバへの接続を手動でオープンします。 プログラムによるトランザクションの場合は、同じ例が若干変更されています。14-13 ペー ジの「プログラムによるトランザクションの例」を参照してください。 例 14-2 DBProc の ECO/Java オブジェクト // ECO/Java object that implements DBInterface import javax.ejb.*; public class DBprocessing implements javax.ejb.SessionBean { String url = null; UserTransaction usertran = null; SessionContext sessctx; void setSessionContext(SessionContext ctx) { // save the SessionContext sessctx = ctx; // save the transaction context usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } public void updateEmployees() { // A new transaction begins automatically when you enter this method //Each method must retrieve a database connection Connection db = DriverManager.getConnection(url); PrepareStatement st = db.... ECO/Java オブジェクトのトランザクション 14-9 宣言トランザクション st.executePrepared(...); ... if (managers_need_to_be_updated) updateManagers(); //return the database connection to the pool when closed db.close(); //The transaction commits or rolls back when method completes } public // // // void updateManagers() { If this method is called from updateEmployees(), the transaction begun in that method continues in this method. Statements are executed within the same transaction context. // If this method is called from the client directly, a new // transaction is started. This transaction is committed when this // method completes. //Each method must retrieve a database connection instead of being //able to use a connection across all methods. Connection db = DriverManager.getConnection(url); Statement st = db.createStatement(); st.execute(...); ... //return the database connection to the pool when closed db.close(); //If the transaction was started in this method, the transaction //commits or rolls back when method completes; otherwise, returns //to transactional method that invoked this method. } public void jcoCreate() throws CreateException { // creation tasks } public void jcoRemove() { } public void jcoActivate() { // activation tasks } public void jcoPassivate() { // passivation tasks } } 14-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド プログラムによるトランザクション クライアント public class Application { String appServer = "oas://..."; DBInterface dbp = null; public void doProcessing() { // Set up JNDI Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi"); javax.naming.Context context = new InitialContext(env); context = context.lookup(appServer); DBHome dph = (DBHome) PortableRemoteObject.narrow( context.lookup("Payroll/DBProc"),DBHome.class); dbp = dph.create(); ... dbp.updateEmployees(); ... dbp.updateManagers(); ... dbp.destroy(); dbp = null; } public void static main(String args[]) { Application ap = new Application(); ap.doProcessing(); } } プログラムによるトランザクション ECO/Java オブジェクトのプロパティを設定することにより、宣言でトランザクションを区 切るかわりに、javax.jts.UserTransaction オブジェクトを使用して、プログラムに よってトランザクションを区切ることができます。このオブジェクトのメソッドを使用し て、トランザクションを開始、コミットおよびロール・バックします。このオブジェクトの リファレンスを取得するには、SessionContext クラスの getUserTransaction() メソッ ドをコールします。 プログラムによるメソッドを使用する場合、JTS(Java Transaction Service)と JDBC(Java Database Connectivity)のトランザクション・プロトコルについて理解している必要があり ます。 ■ JTS — データベース、メソッドの実行および ECO/Java オブジェクトにまたがるトラン ザクションを定義できます。 ECO/Java オブジェクトのトランザクション 14-11 プログラムによるトランザクション JDBC—JTS は JDBC を使用してデータベースにアクセスします。トランザクションに関 係するデータベースが 1 つのみで、そのトランザクションを 1 回のメソッド・コール内 で完了できる場合、JTS を認識しない JDBC ドライバが使用できるため、JTS トランザ クションを使用する必要はありません。ただし、トランザクションが複数のメソッドに またがって実行されたり、複数のオブジェクトと一緒に実行されるか、あるいは複数の データベースにまたがる場合は、JTS および JTS を認識する JDBC ドライバを使用する 必要があります。 ■ 次のコードでは、トランザクション・コンテキストを usertran インスタンス変数に格納し ています。 import javax.ejb.*; public class myBean implements SessionBean { SessionContext sessctx; UserTransaction usertran = null; String url = null; void setSessionContext(SessionContext ctx) { // save the SessionContext sessctx = ctx; // save the transaction context usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } void myOperation() { Connection db = DriverManager.getConnection(url); usertran.begin(); // database operations PrepareStatement st = db.... st.executePrepared(...); usertran.commit(); db.close(); } } 接続に関する操作(問合せを含む)は、すべてトランザクション内で行う必要があります。 そうでない場合は、JTS の使用が可能なドライバから例外が発行されます。接続、切断、そ 14-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド プログラムによるトランザクション の他データベースの問合せや変更を伴わない処理は、トランザクション内で実行する必要は ありません。 このルールの例外は、DDL(data definition language)の操作です。DDL の操作(表の作 成など)は、トランザクションの外で行う必要があります。これらの操作は、常に自動的に コミットされます。 UserTransaction オブジェクト javax.jts.UserTransaction オブジェクトは次のメソッドをサポートしています。 ■ begin() ■ commit() ■ rollback() ■ getStatus() ■ setRollbackOnly() ■ setTransactionTimeout() プログラムによるトランザクションの例 Payroll/DBProc オブジェクトには、updateEmployees() と updateManagers() の 2 つのメ ソッドが含まれます。オブジェクトは TX_REQUIRED として定義されています。このため どちらのメソッドも、実行されると、新規トランザクションを開始するかまたは既存のトラ ンザクションを継続します。トランザクションがいずれかのメソッドで開始された場合、そ のトランザクションは、メソッドの完了時にコミットまたはロールバックされます。 updateEmployees() メソッドは、決してトランザクション内でコールされないように設計さ れていますが、updateManagers() メソッドはトランザクション内からコールできます。 ■ updateEmployees()— オブジェクトはメソッド内でトランザクションを開始し、コ ミットします。 ■ updateManagers()— オブジェクトが現在トランザクション・コンテキスト内にあるか どうかをチェックします。現在、トランザクション・コンテキスト内にない場合のみ、 新しいトランザクションを開始してコミットします。オブジェクトが現在、トランザク ション内にある場合は、現在の既存トランザクション・コンテキスト内で更新処理が実 行されます。 1 つ以上のデータベース内で変更を行う場合、JTS の使用が可能な JDBC ドライバ接続を オープンして、トランザクションの DAD に接続する必要があります。DAD によりデータ ベースが識別されます。DAD は、Oracle Application Server Manager 内で設定し、配布中 にプロパティとして指定する必要があります。そのメソッドは、getConnection() コール 内のデータベース URL の DAD 名の先頭に "jdbc:oracle:jts7:@" を追加することにより、JTS の使用が可能なデータベース接続用 JDBC ドライバへの接続を手動でオープンします。 ECO/Java オブジェクトのトランザクション 14-13 プログラムによるトランザクション 宣言トランザクションの場合は、同じ例が若干変更されています。14-8 ページの「宣言トラ ンザクションの例」を参照してください。 JCO.APP トランザクション・パラメータを ENABLED に設定し、トランザクションの DAD を設定し て、トランザクション・モードを TX_BEAN_MANAGED に指定することにより、このオブ ジェクトは、その JCO.APP ファイル内のプログラムによるトランザクション型オブジェク トとして宣言されます。オブジェクトは TX_BEAN_MANAGED モードで設定されているた め、オブジェクト内の各メソッドはトランザクションを開始、コミットまたはロールバック できます。 [APPLICATION] name = Payroll idleTimeOut = 2000 transactions = ENABLED transactionalDads = payrolldad [DBProc] className = DBprocessing remoteInterface = DBInterface transactionMode = TX_BEAN_MANAGED [DBProc.ENV] DBNAME = payrolldad ECO/Java オブジェクトのリモート・インタフェース // Remote interface for the ECO/Java object public interface DBInterface extends javax.ejb.EJBObject { public void updateEmployees() throws java.rmi.RemoteException; public void updateManagers() throws java.rmi.RemoteException; } ECO/Java オブジェクト // EJB object that implements DBInterface import javax.ejb.*; public class DBprocessing implements javax.ejb.SessionBean { String url = null; UserTransaction usertran = null; SessionContext sessctx; void setSessionContext(SessionContext ctx) { // save the SessionContext sessctx = ctx; 14-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド プログラムによるトランザクション // save the transaction context usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } public void updateEmployees() { // get a JDBC database connection from a pool Connection db = DriverManager.getConnection(url); usertran.begin(); // start new transaction PrepareStatement st = db.... st.executePrepared(...); ... if (managers_need_to_be_updated) updateManagers(); usertran.commit(); // commit transaction db.close(); // return connection to the pool } public void updateManagers() { // get a connection from a pool Connection db = DriverManager.getConnection(url); // Verify if transaction is active boolean newTransaction = (usertran.getStatus() == usertran.STATUS_NO_TRANSACTION); // Start transaction if needed if (newTransaction) usertran.begin(); Statement st = db.createStatement(); st.execute(...); ... // Commit transaction if started if (newTransaction) usertran.commit(...); // return connection to the pool db.close(); } } ECO/Java オブジェクトのトランザクション 14-15 トランザクションとスレッド クライアント public class Application { String appServer = "oas://..."; DBInterface dbp = null; public void doProcessing() { // Set up JNDI Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi"); javax.naming.Context context = new InitialContext(env); context = context.lookup(appServer); DBHome dph = (DBHome) PortableRemoteObject.narrow( initialContext.lookup("Payroll/DBProc"),DBHome.class); dbp = dph.create(); dbp.updateEmployees(); ... dbp.updateManagers(); ... dbp.destroy(); dbp = null; } public void static main(String args[]) { Application ap = new Application(); ap.doProcessing(); } } トランザクションとスレッド トランザクションはスレッドに対応しています。1 つのスレッドには、アクティブ・トラン ザクションは常に 1 つしか存在できません。つまり、現行のトランザクションが終了するま で、別のトランザクションを開始できません。通常は現行トランザクションを保留して、最 初のトランザクションをコミットする前に 2 番目のトランザクションを開始します。ただ し、現在 ECO/Java は、トランザクションの保留と再開をサポートしていません。 トランザクションとスレッド間の関連付けは非常に密接です。トランザクションは、それを 開始したスレッドと同じスレッド上でしかコミットやロールバックできません。また、トラ ンザクション内の処理はすべて同じスレッドから実行される必要があります。1 つのトラン ザクション内で追加のスレッドを作成することはできません。元のスレッドがトランザク ションをコミットするかぎり、スレッド内のオブジェクトは、そのトランザクションの有効 範囲内にある他のオブジェクトをコールできます。 14-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション 実行されたオブジェクトが現行のトランザクション・コンテキストを使用するように定義さ れると、トランザクションは中断されずに継続されます。オブジェクトが TX_REQUIRES_NEW として宣言された場合は、通常のレスポンスでは、ECO/Java ランタ イムが現行トランザクション内でサブトランザクションを開始します。ただし、現在 ECO/ Java はサブトランザクションをサポートしていません。既存のトランザクションを持つオブ ジェクトから TX_REQUIRES_NEW のオブジェクトをコールすると、そのトランザクション はロールバックされます(図 14-1 を参照) 。現在、この状態にフラグを立てる例外のログは 作成されません。このため、メソッドの実行によりこのタイプのシナリオが発生しないよう に検証する必要があります。 図 14-1 トランザクション・エラー状況 オブジェクト 1TX_REQUIRED オブジェクト 2TX_REQUIRES_ NEW Oracle Application Server の ECO/Java モデルのトランザクションを開始できるのは、 ECO/Java オブジェクトのみです。Oracle Application Server 外のクライアントは、トラン ザクションを開始できません。 状態を保持するオブジェクトと状態を保持しないオブジェクトの トランザクション クライアントが、同じトランザクション内のオブジェクトに、複数のコールを行う場合があ ります。これは、TX_BEAN_MANAGED モードで設定されている、状態を保持するオブ ジェクトを使用して行うことができます。状態を保持するオブジェクトは 1 つのクライアン トにのみ使用されるため、トランザクションが複数のクライアント・コールにまたがるよう なオブジェクトを設計できます。状態を保持しないオブジェクトの場合、メソッドが終了す るときに各トランザクションも終了する必要があります。状態を保持しないオブジェクト は、複数のクライアント・コールにまたがるトランザクションを持てません。 状態を保持するオブジェクトが TX_BEAN_MANAGED の場合、トランザクションをオブ ジェクト内の 1 つのメソッドで開始し、そのトランザクションをオブジェクト内の別のメ ソッドでコミットすることができます。両方のメソッドとも同じオブジェクトに存在する必 要があります。クライアントは、begin メソッドを起動してトランザクションを開始できま す。その後、クライアントはオブジェクト内の他のメソッドも実行します。これはすべてト ランザクションの一部となります。最後にクライアントは、commit メソッドを実行してト ランザクションを終了します。これにより、クライアントは、1 つのトランザクションの状 態を保持するオブジェクト内で、複数のメソッドをコールできます。 ECO/Java オブジェクトのトランザクション 14-17 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション 例 14-3 状態を保持する TX_BEAN_MANAGED オブジェクト 次の例では、TX_BEAN_MANAGED トランザクションを使用できるように定義された、状 態を保持するオブジェクトを定義しています。このオブジェクトは、クライアントが beginTransaction() を実行してトランザクションを開始し、トランザクション内の他の メソッド(updateEmployees() など)を実行し、最後に commitTransaction() を実行し てトランザクションをコミットできるように設計されています。 JCO.APP [APPLICATION] name = Payroll idleTimeOut = 2000 transactions = ENABLED transactionalDads = payrolldad [DBProc] className = DBprocessing remoteInterface = DBInterface transactionMode = TX_BEAN_MANAGED Stateless = FALSE [DBProc.ENV] DBNAME = payrolldad ECO/Java オブジェクトのリモート・インタフェース // Remote interface for the ECO/Java object public interface DBInterface extends javax.ejb.EJBObject { public void updateEmployees() throws java.rmi.RemoteException; public void updateManagers() throws java.rmi.RemoteException; } ECO/Java オブジェクト // ECO/Java object that implements DBInterface import javax.ejb.*; public class DBprocessing implements javax.ejb.SessionBean { String url = null; UserTransaction usertran = null; SessionContext sessctx; void setSessionContext(SessionContext ctx) { // save the SessionContext sessctx = ctx; // save the transaction context 14-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション usertran = ctx.getUserTransaction(); // get the DAD name from the deployment descriptor and use it to // form the URL for DriverManager.getConnection() String dadname = ctx.getEnvironment().getProperty("DBName"); url = "jdbc:oracle:jts7:@" + dadName; ... } public void beginTransaction() { usertran.begin(); // start new transaction } public void updateEmployees() { // get a JDBC database connection from a pool Connection db = DriverManager.getConnection(url); PrepareStatement st = db.... st.executePrepared(...); ... db.close(); // return connection to the pool } public void commitTransaction() { usertran.commit(); // commit transaction } クライアント public class Application { String appServer = "oas://..."; DBInterface dbp = null; public void doProcessing() { // Set up JNDI Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "oracle.oas.naming.jndi"); javax.naming.Context context = new InitialContext(env); context = context.lookup(appServer); DBHome dph = (DBHome) PortableRemoteObject.narrow( initialContext.lookup("Payroll/DBProc"),DBHome.class); dbp = dph.create(); dbp.beginTransaction(); dbp.updateEmployees(); ... ECO/Java オブジェクトのトランザクション 14-19 状態を保持するオブジェクトと状態を保持しないオブジェクトのトランザクション dbp.commitTransaction(); dbp.destroy(); dbp = null; } public void static main(String args[]) { Application ap = new Application(); ap.doProcessing(); } } 14-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 15 JCORBA アプリケーションから ECO/Java への移行 Oracle Application Server では JCORBA アプリケーションをサポートしていますが、既存の JCORBA アプリケーションを ECO/Java または EJB アプリケーションに移行する場合もあり ます。この章では、ECO/Java に移行するための手順を説明します。第 7 章「EJB アプリ ケーションへの移行」では、EJB に移行するための手順を説明します。 内容 この章で説明する手順に従って、JCORBA アプリケーションとそのクライアントを ECO/ Java に移行できます。 ■ JCORBA サーバー・オブジェクトの移行 ■ JCO.APP から ECO.APP への変換 ■ クライアントの移行 JCORBA サーバー・オブジェクトの移行 OAS 4.0.7 の JCORBA アプリケーションを ECO/Java に移行するには、ソース・コードを変 更する必要があります。Oracle Application Server のコンポーネント・モデルは、現在ホー ム・インタフェースおよびリモート・インタフェース、そして完全な JNDI サポートを提供 しています。 OAS 4.0.7 の JCORBA アプリケーションの移行には、次のものが含まれます。 ■ リモート・インタフェース ■ ホーム・インタフェース ■ インプリメンテーション・クラス ■ LifeCycle インタフェース JCORBA アプリケーションから ECO/Java への移行 15-1 JCORBA サーバー・オブジェクトの移行 ■ ObjectManager ■ JCO.APP ■ 例 リモート・インタフェース 各 ECO/Java リモート・インタフェースは、oracle.oas.eco.ECOObject から拡張する 必要があります。これにより、JCORBA リモート・インタフェースの oracle.oas.jco.JCORemote を置き換えます。 ホーム・インタフェース 各 ECO/Java オブジェクトには、ホーム・インタフェースが必要です。このインタフェース は、oracle.oas.eco.ECOHome から拡張する必要があります。ホーム・インタフェース の作成方法に関する詳細は、11-5 ページの「ホーム・インタフェースの作成」を参照してく ださい。 インプリメンテーション・クラス ■ 各 ECO/Java オブジェクトのインプリメンテーション・クラスは、 oracle.oas.eco.SessionBean インタフェースおよびそのメソッドをインプリメン トする必要があります。さらにインプリメンテーションでは、SessionContext オブジェ クトのリファレンスを取得し、それをコンポーネントの状態の一部として保存する必要 があります。たとえば、次のようにします。 public void setSessionContext(SessionContext ctx) { this.osc = ctx; } 11-6 ページの「SessionBean クラスの作成」を参照してください。 ■ 初期化処理を ecoCreate() メソッドに移動します。 LifeCycle インタフェース LifeCycle インタフェースのインプリメンテーションを、JCORBA アプリケーションから削 除する必要があります。 15-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド JCORBA サーバー・オブジェクトの移行 ObjectManager ObjectManager タイプをすべて SessionContext タイプに変更します。表 15-1 に、 ObjectManager クラスのメソッドと SessionContext クラスのマッピングを示します。 表 15-1 SessionContext と ObjectManager クラスのメソッド ObjectManager SessionContext getEnvironment() getEnvironment() getObjectManager() setSessionContext() に渡されるパラメータ getSelf() getECOObject() revokeSelf() getECOObject().remove() getLogger() JNDI から "oas_service:logger" とし て取得 getCurrentTransaction() getUserTransaction() JCO.APP ■ JCO.APP ファイルから ECO.APP へ名前を変更します。 ■ 新しい名前と値のペア、homeInterface = <home_interface_name> を追加し ます。 ■ minThreads、maxThreads および maxClients のエントリをすべて削除します。これ らのエントリは今後不要で、ECO.APP に存在する場合は無視されます。 ■ オプションのエントリを ECO.APP に含めることができます。これらのエントリの リストについては、12-2 ページの「配布情報ファイルの構造」を参照してくださ い。 例 次の表に、JCORBA オブジェクトを ECO/Java オブジェクトに移行する際に変更されるコー ドを示します。 JCORBA アプリケーションから ECO/Java への移行 15-3 JCORBA サーバー・オブジェクトの移行 表 15-2 JCORBA オブジェクトから ECO/Java オブジェクトへの変換 JCORBA ECO/Java package myStack; import oracle.oas.jco.*; import java.util.Properties; package myStack; import oracle.oas.eco.*; import java.util.Properties; import javax.naming.InitialContext; public class ServerStack implements Lifecycle { private int stackSize = 0; private String stackElements[]; private int top = -1; private ObjectManager mgr = null; private Logger logger = null; public class ServerStack implements SessionBean { private int stackSize = 0; private String stackElements[]; private int top = -1; private SessionContext osc = null; private Logger logger = null; 15-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド JCORBA サーバー・オブジェクトの移行 表 15-2 JCORBA オブジェクトから ECO/Java オブジェクトへの変換(続き) オブジェクトへの変換(続き) JCORBA ECO/Java public void setSessionContext( SessionContext ctx) { this.osc = ctx; } public void jcoCreate() { mgr = ObjectManager. getObjectManager(this); } Properties env = mgr.getEnvironment(); logger = mgr.getLogger(); logger.setSeverity(Logger. LOG_SEVERITY_DEBUG); try { setStackSize(Integer.parseInt( env.getProperty( "initialStackSize"))); } catch (Exception e) {} } public void ecoCreate() throws CreateException { Properties env = osc.getEnvironment(); // logger is now a service try { logger = (Logger)( new InitialContext()).lookup( "oas_service:logger"); logger.setSeverity( Logger.LOG_SEVERITY_DEBUG); } catch(javax.naming. NamingException ne) { System.err.println( "Could not get logger"); } try { setStackSize(Integer.parseInt( env.getProperty( "initialStackSize"))); } catch (Exception e) { throw new CreateException("Cannot parse initialStackSize"); } } JCORBA アプリケーションから ECO/Java への移行 15-5 JCORBA サーバー・オブジェクトの移行 表 15-2 JCORBA オブジェクトから ECO/Java オブジェクトへの変換(続き) オブジェクトへの変換(続き) JCORBA ECO/Java public void ecoRemove() { } public void ecoPassivate() { logger = null; } public void ecoActivate() { logger = (Logger) (new initialContext()). lookup("oas_service:logger"); } public int getStackSize() { logger.println(" Getting stack size..."); return stackSize; } public int getStackSize() { logger.println(" Getting stack size..."); return stackSize; } public void setStackSize(int size) throws StackException { if (size < 0) throw new StackException(); logger.println(" Setting stack size to " + size + "..."); top = -1; stackSize = size; stackElements = new String[size]; } public void setStackSize(int size) throws StackException { if (size < 0) throw new StackException(); logger.println(" Setting stack size to " + size + "..."); top = -1; stackSize = size; stackElements = new String[size]; } public void push(String value) throws StackException { if (top == stackSize - 1) throw new StackException(); logger.println(" Pushing ¥"" + value + "¥" onto the stack..."); stackElements[++top] = value; } public void push(String value) throws StackException { if (top == stackSize - 1) throw new StackException(); logger.println(" Pushing ¥"" + value + "¥" onto the stack..."); stackElements[++top] = value; } 15-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド JCO.APP から ECO.APP への変換 表 15-2 JCORBA オブジェクトから ECO/Java オブジェクトへの変換(続き) オブジェクトへの変換(続き) JCORBA ECO/Java public String pop() throws StackException { if (top == -1) throw new StackException(); logger.println(" Popping the stack (returning element " + stackElements[top] + ")..."); return stackElements[top--]; } } public String pop() throws StackException { if (top == -1) throw new StackException(); logger.println(" Popping the stack (returning element " + stackElements[top] + ")..."); return stackElements[top--]; } } JCO.APP から ECO.APP への変換 JCORBA アプリケーションの配布情報は JCO.APP ファイルに書き込みますが、ECO/Java アプリケーションの場合、このファイルの名前を ECO.APP に変更する必要があります。さ らに、次に示す homeInterface パラメータが含まれるように、このファイルを変更する必要 があります。 [APPLICATION] name = myStack idleTimeOut = 2000 [ServerStack] className = myStack.ServerStack remoteInterface = myStack.ServerStackRemote #add this statement homeInterface = myStack.ServerStackHome [ServerStack.ENV] ; property used by the ServerStack object initialStackSize = 10 さらに、次の JCO.APP パラメータは、今後 ECO/Java ではサポートされません。新規に作 成した ECO.APP からこれらのパラメータを削除する必要があります。 JCORBA アプリケーションから ECO/Java への移行 15-7 JCO.APP から ECO.APP への変換 アプリケーション・セクション 表 15-3 アプリケーション・プロパティ プロパティ 説明 minThreads JCORBA サーバー・プロセス内の JCORBA オブジェクトにアクセスで きるスレッドの最小数。スレッドの数は、オブジェクトが同時に扱える リクエストの数を決定します。 デフォルト : 1 maxThreads JCORBA サーバー・プロセス内の JCORBA オブジェクトにアクセスで きるスレッドの最大数。オブジェクト・インスタンスがスレッドよりも 多い場合、リクエストはスレッドが使用可能になるまで待機する必要が あります。 デフォルト : 10 オブジェクト・セクション 表 15-4 オブジェクト・プロパティ プロパティ 説明 minInstances プロセス開始時に、Oracle Application Server が JCORBA サーバー・プ ロセス内で起動するオブジェクト・インスタンスの数。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 0 maxInstances JCORBA サーバー・プロセスが保持できるオブジェクト・インスタンス の最大数。インスタンスの数は、プロセスがリクエストを受け取るたび に増加します。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 10 15-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド クライアントの移行 表 15-4 オブジェクト・プロパティ(続き) オブジェクト・プロパティ(続き) プロパティ 説明 minThreads JCORBA サーバー・プロセスのスレッドの最小数。各オブジェクト・イ ンスタンスは 1 つのスレッドを使用します。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 1 maxThreads JCORBA サーバー・プロセスのスレッドの最大数。オブジェクト・イン スタンスがスレッドよりも多い場合、リクエストはスレッドが使用可能 になるまで待機する必要があります。 このプロパティは、オブジェクト・レベルまたはアプリケーション・レ ベルで指定できます。両方のレベルで指定されている場合、オブジェク ト・レベルで指定された値が優先されます。 デフォルト : 10 poolSize プールが保持できるこのタイプのオブジェクトの数。プール・サイズは インスタンスの最大数と同じか、またはそれよりも小さくする必要があ ります。 デフォルト : 0 クライアントの移行 JCORBA クライアントを移行するには、次のステップを実行します。 ■ オブジェクト・リファレンスを取得するために ObjectFactory を使用している場合は、 ObjectFactory を JNDI に置き換えます。 オブジェクトのホーム・インタフェースを検索するには JNDI を使用します。JNDI が返 したオブジェクトがホーム・インタフェースへのリファレンスになります。 PortableRemoteObject.narrow() を使用して、これを必要なホーム・インタ フェースに絞り込むことができます。 JNDI アクセス方式に関しては、第 13 章「ECO/Java アプリケーションの クライアント の開発」を参照してください。 ■ クライアントに次の import 文を追加します。 import javax.naming.*; import java.util.Hashtable; ■ LifeCycle インタフェースのいずれかを削除します。 ■ リモート・オブジェクトによって発行される java.rmi.RemoteException 例外を捕 捉します。 JCORBA アプリケーションから ECO/Java への移行 15-9 クライアントの移行 ■ Java アプリケーションおよびアプレット内の Pure Java ORB に対応するには、 ■ org.omg.CORBA.ORBClass ■ org.omg.CORBA.SingletonORBClass の両方がパラメータとして定義されている必要があります。詳細は 13-5 ページの「クラ イアントからのネーム・サーバーへのアクセス」を参照してください。 15-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 16 リファレンス この章には、クラスのリファレンス・ページが含まれています。 ■ ECOBean インタフェース ■ ECOContext インタフェース ■ ■ ■ getCallerIdentity ■ getEnvironment ■ getHome ■ getRollbackOnly ■ getUserTransaction ■ isCallerInRole ■ setRollbackOnly ECOMetaData インタフェース ■ getHomeInterfaceClass ■ getECOHome ■ getPrimaryKeyClass ■ getRemoteInterfaceClass ■ isSession Handle インタフェース ■ ■ getECOObject SessionBean インタフェース ■ setSessionContext ■ ecoRemove リファレンス 16-1 ■ ■ ecoPassivate ■ ecoActivate SessionContext インタフェース ■ ■ ■ ■ ■ ■ ■ ■ getECOObject UserTransaction インタフェース ■ commit ■ begin ■ rollback ■ setRollbackOnly ■ getStatus ■ setTransactionTimeout Logger クラス ■ setSeverity ■ getSeverity PortableRemoteObject クラス ■ narrow ■ exportObject ■ unexportObject HeuristicMixedException 例外 ■ HeuristicMixedException() ■ HeuristicMixedException(String) HeuristicRollbackException 例外 ■ HeuristicRollbackException() ■ HeuristicRollbackException(String) TransactionRolledbackException 例外 ■ TransactionRolledbackException() ■ TransactionRolledbackException(String) OracleSSLCredential クラス ■ OracleSSLCredential 16-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ■ addTrustedCert ■ getTrustedCert ■ removeTrustedCert ■ getTrustedCertCount ■ setPrivateKey ■ getPrivateKey ■ getPvtKeyPassword ■ addCertChain ■ getCertChainCert ■ removeCertChainCert ■ getCertChainCount リファレンス 16-3 ECOBean インタフェース ECOBean インタフェース public interface ECOBean extends Serializable これは、SessionBean オブジェクトによって拡張された共通のスーパー・インタフェースで す。ECO/Java におけるこのインタフェースの機能は、EJB の javax.ejb.EnterpriseBean イン タフェースの機能と同じです。 図 16-1 ECOBean インタフェースの継承 java.lang.Object oracle.oas.eco.ECOBean 構文 public interface ECOBean extends Serializable ECOBean 用のメソッドはありません。 16-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECOContext インタフェース ECOContext インタフェース public interface ECOContext ECOContext は、インスタンスのランタイム・コンテキストにアクセスするための、ECO/ Java オブジェクト・インスタンスのメソッドを提供します。ECO/Java におけるこのインタ フェースの機能は、EJB の javax.ejb.EJBContext インタフェースの機能と同じです。 図 16-2 ECOContext インタフェースの継承 java.lang.Object oracle.oas.eco.ECOContext getCallerIdentity 構文 public abstract Identity getCallerIdentity() 説明 コール元の java.security.Identity を取得します。 戻り値 コール元を識別する Identity オブジェクト。 getEnvironment 構文 public abstract Properties getEnvironment() リファレンス 16-5 getHome 説明 ECO/Java オブジェクトの環境プロパティを取り出します。 戻り値 ECO/Java オブジェクトの環境プロパティ。ECO/Java オブジェクトに環境プロパティが存 在しない場合、空の java.util.Properties が返されます。NULL は返されません。 getHome 構文 public abstract ECOHome getHome() 説明 ECO/Java オブジェクトのホーム・インタフェースを取得します。 戻り値 ECO/Java オブジェクトのホーム・インタフェース・オブジェクト。 getRollbackOnly 構文 public abstract boolean getRollbackOnly() 説明 トランザクションがロールバックにのみマークされているかどうか判断します。 戻り値 現行トランザクションがロールバックにマークされている場合は True、そうでない場合は False。 16-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECOContext インタフェース getUserTransaction 構文 public abstract UserTransaction getUserTransaction() 説明 トランザクションの区切りのインタフェースを取得します。 戻り値 ECO/Java オブジェクト・インスタンスがトランザクションの区切りに使用できる UserTransaction インタフェース。 isCallerInRole 構文 public abstract boolean isCallerInRole(Identity role) 説明 コール元に、指定されたロールがあるかどうかを判断します。 パラメータ role ― テスト対象のロールの java.security.Identity。 戻り値 コール元に指定されたロールがある場合は True。 リファレンス 16-7 setRollbackOnly setRollbackOnly 構文 public abstract void setRollbackOnly() 説明 現行トランザクションを永久にロールバック対象としてマークします。このトランザクショ ンはコミットできません。 16-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ECOMetaData インタフェース ECOMetaData インタフェース public interface ECOMetaData ECOMetaData が提供するメソッドにより、アプリケーションを構成する ECO/Java オブ ジェクトを見つける際に開発ツールに必要となるメタデータが返されます。メタデータは、 クライアントがスクリプト言語を使用して ECO/Java オブジェクトにアクセスする場合にも 使用できます。 ECO/Java における ECOMetaData の機能は、EJB の javax.ejb.EJBMetaData の機能と同じです。 図 16-3 ECOMetaData インタフェースの継承 java.lang.Object oracle.oas.eco.ECOMetaData getHomeInterfaceClass 構文 public abstract Class getHomeInterfaceClass() 説明 ECO/Java オブジェクトのホーム・インタフェースの Class オブジェクトを取り出します。 getECOHome 構文 public abstract ECOHome getECOHome() 説明 ECO/Java オブジェクトのホーム・インタフェースを取得します。 リファレンス 16-9 getPrimaryKeyClass getPrimaryKeyClass 構文 public abstract Class getPrimaryKeyClass() 説明 ECO/Java オブジェクトの主キー・クラスの Class オブジェクトを取得します。 getRemoteInterfaceClass 構文 public abstract Class getRemoteInterfaceClass() 説明 ECO/Java オブジェクトのリモート・インタフェースの Class オブジェクトを取得します。 isSession 構文 public abstract boolean isSession() 説明 ECO/Java オブジェクトのタイプが "session" かどうかをテストします。 戻り値 ECO/Java オブジェクトのタイプが session の場合は True、そうではない場合は False。 16-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Handle インタフェース Handle インタフェース public interface Handle ハンドルは、ECO/Java オブジェクトのネットワーク・リファレンスの抽象化です。これ は、継続的な ECO/Java オブジェクトのリファレンスとして使用され、すべての ECO/Java オブジェクト・ハンドルによりインプリメントされます。 図 16-4 Handle インタフェースの継承 java.lang.Object oracle.oas.eco.Handle getECOObject 構文 public abstract ECOObject getECOObject() 説明 シリアライズされた ECO/Java オブジェクトに対するハンドルを取得します。このハンドル は、別のプロセスからの ECO/Java オブジェクトのオブジェクト・リファレンスを取得する ために使用できます。 リファレンス 16-11 SessionBean インタフェース SessionBean インタフェース public interface SessionBean extends ECOBean このインタフェースは、Oracle Application Server のランタイムが ECO/Java セッションの コンテキストの設定を可能にするためのメソッドを提供します。このインタフェースには、 コンテキストを使用してオブジェクトをシリアライズしたり、シリアライズを解除するため のメソッドもあります。ECO/Java インプリメンテーション・クラスでは、このインタ フェースとそのメソッドをインプリメントする必要があります。ECO/Java における SessionBean インタフェースの機能は、EJB の javax.ejb.SessionBean インタフェースの機能 と同じです。 図 16-5 SessionBean インタフェースの継承 java.lang.Object oracle.oas.eco.SessionBean setSessionContext 構文 public abstract void setSessionContext(SessionContext ctx) 説明 ECO/Java オブジェクト・インスタンスのセッション・コンテキストを設定します。このメ ソッドは、インスタンス作成後にコールされます。 戻り値 n/a 16-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionBean インタフェース ecoRemove 構文 public abstract void ecoRemove() throws RemoveException 説明 このメソッドは、セッション・オブジェクト終了前にコールされます。クライアントが削除 操作を実行したときや、オブジェクトがタイムアウトになったときにオブジェクトを終了で きます。 戻り値 n/a ecoPassivate 構文 public abstract void ecoPassivate() 説明 このメソッドは、オブジェクトが ” パッシブな ” 状態に入る前にコールされます。このメソッ ドは、ecoActivate() メソッドを使用して再取得できるリソースを解放する必要がありま す。 戻り値 n/a リファレンス 16-13 ecoActivate ecoActivate 構文 public abstract void ecoActivate() 説明 このメソッドは、オブジェクトが " パッシブな " 状態から再度アクティブになったときに コールされます。このメソッドは、ecoPassivate() メソッドによって解放されたリソース を再取得する必要があります。 戻り値 n/a 16-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド SessionContext インタフェース SessionContext インタフェース public interface SessionContext extends ECOContext このインタフェースは、セッション・オブジェクトのランタイム・セッション・コンテキス トへのアクセスを提供します。この機能は、EJB の javax.ejb.SessionContext に似ています。 図 16-6 SessionContext インタフェースの継承 java.lang.Object oracle.oas.eco.SessionContext getECOObject 構文 public abstract ECOObject getECOObject() 説明 セッション・インスタンスに対応するオブジェクトのリファレンスを取得します。 戻り値 セッション・インスタンスに対応するオブジェクト。 リファレンス 16-15 UserTransaction インタフェース UserTransaction インタフェース public interface UserTransaction このインタフェースは、ECO/Java オブジェクトのトランザクション属性が TX_BEAN_MANAGED に設定されている場合にトランザクションの区切りに使用されます。 これは、EJB の javax.jts.UserTransaction と同じです。 図 16-7 UserTransaction インタフェースの継承 java.lang.Object oracle.oas.eco.UserTransaction 表 16-1 UserTransaction 定数 定数 構文 説明 STATUS_ACTIVE public static final int STATUS_ACTIVE トランザクションは、 アクティブの状態で す。 STATUS_COMMITTED public static final int STATUS_COMMITTED トランザクションが コミットされました。 STATUS_COMMITTING public static final int STATUS_COMMITTING トランザクションは コミットされていま す。 STATUS_MARKED_ROLLBACK public static final int STATUS_MARKED_ROLLBACK トランザクションが ロールバック対象と してマークされまし た。 STATUS_NO_TRANSACTION public static final int STATUS_NO_TRANSACTION トランザクションは ターゲット・オブ ジェクトに関連付け られていません。 STATUS_PREPARED public static final int STATUS_PREPARED トランザクションは 準備中です。 STATUS_PREPARING public static final int STATUS_PREPARING トランザクションは 準備中です。 16-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド UserTransaction インタフェース 表 16-1 UserTransaction 定数(続き) 定数(続き) 定数 構文 説明 STATUS_ROLLEDBACK public static final int STATUS_ROLLEDBACK トランザクションが ロールバックされま した。 STATUS_ROLLING_BACK public static final int STATUS_ROLLING_BACK トランザクションが ロールバックしてい ます。 STATUS_UNKNOWN public static final int STATUS_UNKNOWN トランザクションの 状態は現時点では不 明です。 begin 構文 public abstract void begin() 説明 新規トランザクションを作成します。新規トランザクションは、現行スレッドに関連付けら れます。 戻り値 n/a commit 構文 public abstract void commit() throws TransactionRolledbackException, HeuristicMixedException, HeuristicRollbackException 説明 現行スレッドのトランザクションをコミットします。コミット後、スレッドとトランザク ションとの関連付けはなくなります。 リファレンス 16-17 getStatus 戻り値 n/a getStatus 構文 public abstract int getStatus() 説明 現行スレッドのトランザクションの状態を取得します。 戻り値 状態を示す UserTransaction 定数の 1 つ。 rollback 構文 public abstract void rollback() 説明 現行スレッドのトランザクションをロールバックします。 戻り値 n/a 16-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド UserTransaction インタフェース setRollbackOnly 構文 public abstract void setRollbackOnly() 説明 トランザクションで可能な操作が変更内容のロールバックのみになるように、現行スレッド のトランザクションを変更します。 戻り値 n/a setTransactionTimeout 構文 public abstract void setTransactionTimeout(int seconds) 説明 現行スレッドのトランザクションのタイムアウト値を定義します。 パラメータ seconds ― タイムアウト値(秒)。値が 0 の場合、デフォルトのタイムアウト値が使用され ます。 戻り値 n/a リファレンス 16-19 Logger クラス Logger クラス public abstract class Logger extends PrintWriter oracle.oas.eco.Logger クラスによって、ユーザーは Oracle Application Server のロギング機 能にメッセージを書き込めます。このクラスのメソッドにより、メッセージの詳細レベルを 設定できます。実際の書込みを行うメソッドは、PrintWriter クラスのメソッドです。 図 16-8 Logger クラスの継承 java.lang.Object java.io.Writer java.io.PrintWriter oracle.oas.eco.Logger 表 16-2 Logger クラス定数 定数 構文 説明 LOG_SERVICE public static final String LOG_SERVICE LOGGER にアクセスす るための JNDI URL。 LOG_SEVERITY_FATAL public static final int LOG_SEVERITY_FATAL ログ・ファイルの致命 的エラー・メッセージ の詳細(0)。 LOG_SEVERITY_ERROR public static final int LOG_SEVERITY_ERROR ログ・ファイルの非致 命的エラー・メッセー ジの詳細(1)。 LOG_SEVERITY_WARNING public static final int LOG_SEVERITY_WARNING ログ・ファイルの警告 メッセージの詳細(4)。 LOG_SEVERITY_DEBUG public static final int LOG_SEVERITY_DEBUG ログ・ファイルのデ バッグ・メッセージの 詳細(11)。 LOG_SEVERITY_FULL_TRACE public static final int LOG_SEVERITY_FULL_TRACE ログ・ファイルのト レース・メッセージの 詳細(15)。 16-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Logger クラス setSeverity クラス oracle.oas.eco.Logger 構文 public void setSeverity(int level) 説明 ロギングの詳細レベルを設定します。設定されていない場合、デフォルトは LOG_SEVERITY_DEBUG です。 パラメータ level ― 詳細レベル(0 から 15) 。次の定数を使用して、メッセージの詳細を指定できます。 値が低いほどメッセージは詳細になります。 表 16-3 Logger 変数 記号 説明 値 LOG_SEVERITY_FATAL 致命的エラー・メッセージ。 0 LOG_SEVERITY_ERROR 致命的でないエラー・メッセージ。 1 LOG_SEVERITY_WARNING 警告メッセージ。 4 LOG_SEVERITY_DEBUG デバッグ・メッセージ。これはデフォル トの詳細レベルです。 11 LOG_SEVERITY_FULL_TRACE トレース・メッセージ。 15 getSeverity クラス oracle.oas.eco.Logger 構文 public abstract int getSeverity() リファレンス 16-21 getSeverity 説明 ロギングの現行の詳細レベル。 戻り値 現行の詳細レベル。 16-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド PortableRemoteObject クラス PortableRemoteObject クラス public class PortableRemoteObject extends Object oracle.oas.eco.PortableRemoteObject クラスを使用すると、ヘルパー・クラスを直 接使用せずにインタフェースを絞り込めます。 図 16-9 PortableRemoteObject クラスの継承 java.lang.Object oracle.oas.eco.PortableRemoteObject narrow クラス oracle.oas.eco.PortableRemoteObject 構文 public static Object narrow(Object obj, Class class) 説明 インタフェースのオブジェクト・リファレンスからインタフェースを絞り込みます。 リファレンス 16-23 exportObject exportObject クラス oracle.oas.eco.PortableRemoteObject 構文 public static void exportObject(Object obj) 説明 クライアント・マシン上で実行できる CORBA インスタンスをアクティブにします。 戻り値 n/a unexportObject クラス oracle.oas.eco.PortableRemoteObject 構文 public static void unexportObject(Object obj) 説明 クライアント・マシン上で実行できる CORBA インスタンスを非アクティブにします。 戻り値 n/a 16-24 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド HeuristicMixedException 例外 HeuristicMixedException 例外 public class HeuristicMixedException extends Exception ヒューリスティックな決定が行われ、一部の更新内容がコミットされて残りはロールバック された場合、この例外が発行されます。 図 16-10 HeuristicMixedException クラスの継承 java.lang.Object java.lang.Throwable java.lang.Exception oracle.oas.eco.HeuristicMixedException HeuristicMixedException() 構文 public HeuristicMixedException() HeuristicMixedException(String) 構文 public HeuristicMixedException(String reason) パラメータ reason ― 例外が発生した理由。 リファレンス 16-25 HeuristicRollbackException 例外 HeuristicRollbackException 例外 public class HeuristicRollbackException extends Exception ヒューリスティックな決定が行われ、更新内容がすべてロールバックされた場合、この例外 が発行されます。 図 16-11 HeuristicRollbackExceptio クラスの継承 java.lang.Object java.lang.Throwable java.lang.Exception oracle.oas.eco.HeuristicRollbackException HeuristicRollbackException() 構文 public HeuristicRollbackException() HeuristicRollbackException(String) 構文 public HeuristicRollbackException(String reason) パラメータ reason ― 例外が発生した理由。 16-26 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド TransactionRolledbackException 例外 TransactionRolledbackException 例外 public class TransactionRolledbackException extends Exception 処理中のトランザクションがロールバックされるか、ロールバック対象としてマークされる と、この例外が発生します。リクエストされた処理は実行されません。 図 16-12 TransactionRolledbackException クラスの継承 java.lang.Object java.lang.Throwable java.lang.Exception oracle.oas.eco.TransactionRolledbackException TransactionRolledbackException() 構文 public TransactionRolledbackException() TransactionRolledbackException(String) 構文 public TransactionRolledbackException(String reason) パラメータ reason ― 例外が発生した理由。 リファレンス 16-27 OracleSSLCredential クラス OracleSSLCredential クラス public class OracleSSLCredential extends java.lang.Object このクラスは、credential オブジェクトを作成するためのメソッドの集合を提供します。 図 16-13 OracleSSLCredential クラスの継承 java.lang.Object oracle.security.ssl.OracleSSLCredential OracleSSLCredential クラス oracle.security.ssl.OracleSSLCredential 構文 public OracleSSLCredential() 説明 このメソッドは、このクラスの基本コンストラクタです。 addTrustedCert クラス oracle.security.ssl.OracleSSLCredential 構文 public void addTrustedCert( String b64TrustedCert ) throws NullPointerException public void addTrustedCert( byte[] DERtrustedCert ) throws NullPointerException 16-28 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OracleSSLCredential クラス 説明 このメソッドは、credential オブジェクトに信頼できる証明書を追加するために使用されま す。証明書は、BASE64 フォーマットの文字列または DER エンコードのバイト配列のいずれ かです。 getTrustedCert クラス oracle.security.ssl.OracleSSLCredential 構文 public byte[] getTrustedCert( int index ) throws IllegalArgumentException 説明 このメソッドは、index の位置にある、証明書を表す DER エンコードのバイト配列を返しま す。 removeTrustedCert クラス oracle.security.ssl.OracleSSLCredential 構文 public byte[] removeTrustedCert( int index ) throws IllegalArgumentException 説明 このメソッドは、index の位置にある証明書を削除します。 リファレンス 16-29 getTrustedCertCount getTrustedCertCount クラス oracle.security.ssl.OracleSSLCredential 構文 public int getTrustedCertCount() 説明 このメソッドは、この credential オブジェクトに含まれる証明書の数を返します。 setPrivateKey クラス oracle.security.ssl.OracleSSLCredential 構文 public void setPrivateKey( String String public void setPrivateKey( byte[] String b64pvtKey password ) throws NullPointerException DERpvtKey password ) throws NullPointerException 説明 このメソッドは、秘密鍵とパスワードを credential オブジェクトに割り当てます。秘密鍵は、 BASE64 フォーマットの文字列または DER エンコードのバイト配列のいずれかです。 getPrivateKey クラス oracle.security.ssl.OracleSSLCredential 16-30 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OracleSSLCredential クラス 構文 public byte[] getPrivateKey() 説明 このメソッドは、秘密鍵を表す DER エンコードのバイト配列を返します。 getPvtKeyPassword クラス oracle.security.ssl.OracleSSLCredential 構文 public String getPvtKeyPassword() 説明 このメソッドは、秘密鍵のパスワードを返します。 addCertChain クラス oracle.security.ssl.OracleSSLCredential 構文 public void addCertChain( String b64certChainCert ) throws NullPointerException public void addCertChain( byte[] DERcertChainCert ) throws NullPointerException 説明 このメソッドは、証明書チェーンに証明書を追加するために使用されます。証明書は、 BASE64 フォーマットの文字列または DER エンコードのバイト配列のいずれかです。 リファレンス 16-31 getCertChainCert getCertChainCert クラス oracle.security.ssl.OracleSSLCredential 構文 public byte[] getCertChainCert( int index ) throws IllegalArgumentException 説明 このメソッドは、証明書チェーン内の index の位置にある、証明書を表す DER エンコードの バイト配列を返します。 removeCertChainCert クラス oracle.security.ssl.OracleSSLCredential 構文 public void removeCertChainCert( int index ) throws IllegalArgumentException 説明 このメソッドは、証明書チェーンの index の位置にある証明書を削除します。 16-32 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド OracleSSLCredential クラス getCertChainCount クラス oracle.security.ssl.OracleSSLCredential 構文 public int getCertChainCount() 説明 このメソッドは、証明書チェーンに含まれる証明書の数を返します。 リファレンス 16-33 getCertChainCount 16-34 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 第 III 部 Oracle Application Server ORB for Java Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 17 Java から CORBA オブジェクトへのアクセス CORBA は分散オブジェクトの業界標準です。Oracle Application Server では、Oracle Application Server の ORB を使用して CORBA 標準のオブジェクトを作成できます。ただ し、Oracle Application Server で CORBA インタフェースを標準化する場合は、JCO を使用 してください。JCO は、内部で CORBA API を実行します。この章では、Oracle Application Server の ORB について説明します。ORB は、直接 CORBA オブジェクトにア クセスしたり作成する方法を定義しています。 ORB 機能は、IDL-to-Java コンパイラ(oasoidlc)と CORBA の実行時環境を提供するラ イブラリで構成されます。CORBA、IDL および IDL/Java 言語マッピングの設定は、Object Management Group(OMG)によって定義されています。IDL と IDL/Java 言語のマッピン グについては、第 18 章「IDL の構文とセマンティック」と第 19 章「IDL から Java への言語 マッピング」で説明されています。マッピング情報と CORBA の IDL 設定の詳細は、 http://www.omg.org の OMG の Web サイトを参照してください。 内容 ■ ORB での CORBA オブジェクトの作成 ■ 開発ステップのプロセス ■ 単純なサーバーとクライアントの作成 ■ IDL-to-Java コンパイラの使用 ■ サーバーおよびクライアント・アプリケーションの実行 ■ タイ・メカニズムによる既存コードの実行 Java から CORBA オブジェクトへのアクセス 17-1 ORB での CORBA オブジェクトの作成 ORB での CORBA オブジェクトの作成 ORB では、標準の IDL/Java 言語マッピングに準拠していることに加えて、次のような拡張 が行われています。 ■ ORB を使用するオブジェクトを、状態を保持するまたは保持しないとして登録するため の connect メソッド ■ クライアントが ORB に接続するための bind メソッド ■ 既存のアプリケーションへの処理の転送を可能にするタイ・メカニズムのサポート ■ オブジェクトの状態を識別するための OBJECT_STATELESS および OBJECT_TRANSIENT フラグ 注意 : bind() および connect() の拡張はオプションです。bind() を 使用するのは、ORB によって状態を保持しないオブジェクトを検索し、そ のオブジェクトにリクエストを転送する場合のみです。状態を保持する既 存のオブジェクトのオブジェクト・リファレンスが存在する場合、そのオ ブジェクトのメソッドを実行することにより、ORB の使用をバイパスする ことができます。 これらの拡張機能を使用する際、返されたオブジェクトを正しいオブジェクト型にタイプ キャストする必要があります。これにより、どのコールが標準で、どのコールが Oracle 固 有のものかを容易に識別できます。 これらの拡張は、異なるベンダーが提供する ORB を使用する CORBA 環境では動作しない 可能性があります。たとえば、クライアントが Visigenic の ORB を使用する Netscape Communicator 4 上で実行されるアプレットで、サーバー側の ORB が Oracle 提供のもので ある場合、操作の共通性に問題が発生する可能性があります。このような場合、Oracle Application Server の ORB で、クライアントが取得できるように、状態を保持するオブジェ クト・リファレンスを公開する必要があります。その後、クライアントがこのオブジェク ト・リファレンスに対してメソッドを実行します。これにより、Oracle の拡張が bind メ ソッドに使用されないようにします。 開発ステップのプロセス CORBA 環境でクライアントおよびオブジェクトを開発するには、次のステップを実行しま す。 1. IDL により、クライアントがオブジェクト上で実行できるメソッドまたは演算について 記述した、オブジェクトのインタフェースを定義します。IDL は CORBA の仕様で説明 されています。 17-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 単純なサーバーとクライアントの作成 2. IDL-to-Java コンパイラを使用して IDL ファイルをコンパイルし、IDL ファイルの Java バインディングを生成します。ORB に含まれるコンパイラは、oasoidlc と呼ばれま す。 注意 : CORBA の IDL インタフェースは、いくつかの言語にコンパイル できます。現在、OAS では Java 言語のみサポートしています。 3. oasoidlc によって生成された Java ファイルを使用して、オブジェクトのメソッド (IDL に指定した)をインプリメントします。 4. オブジェクトのインスタンスを生成するサーバーを作成します。 5. メソッドを実行するクライアントを作成します。 これらのステップの説明用に、ORB パッケージには "simple" という名前のデモが付属して います。デモは、$ORB_HOME/demo ディレクトリに入っています。 次の項では、これらのステップをより詳細に説明します。 ■ ■ 単純なサーバーとクライアントの作成 – IDL によるオブジェクトのインタフェースの定義 – インタフェース・メソッドのインプリメント – サーバー・アプリケーションの作成 – クライアント・アプリケーションの作成 サーバーおよびクライアント・アプリケーションの実行 単純なサーバーとクライアントの作成 CORBA では、Interface Definition Language(IDL)によって生成される次のファイルは、 クライアントと ORB 間、および ORB とサーバー間の通信を補助するためのものと指定され ています。IDL で生成されたクライアント・スタブはクライアント側の通信を補助し、IDL で生成されたスケルトンはサーバー側の通信を補助します。いずれのファイルも、IDL コン パイラにより、元の IDL ファイルから自動的に生成されます。 Java から CORBA オブジェクトへのアクセス 17-3 単純なサーバーとクライアントの作成 図 17-1 クライアント・リクエストのルート IDL IDL ORB 図 17-1 に、単純なクライアントとサーバーの環境においてオブジェクト・メソッドが実行さ れる方法を示し、次に説明します。 1. クライアント・アプリケーションが、目的のサーバー・オブジェクトのオブジェクト・ リファレンスを取得します。クライアントがオブジェクト上のメソッドを実行すると、 IDL が生成した、そのメソッドのスタブが実行されます。 2. スタブ・オブジェクトは、クライアントと ORB 間の通信を管理します。特に、メソッ ド実行のパラメータのマーシャルを行います。ORB は、スケルトンが置かれているリ モート・サーバーにリクエストを送信します。 3. スケルトンは、ORB とサーバー間の通信を管理します。特にスケルトンは、パラメータ が目的のメソッドを受け渡しする準備を行い、メソッドをコールして出力値またはパラ メータを返します。 この項では、simple というサーバー・インタフェースの作成プロセスについて説明します。 この simple の例では次の内容を説明します。 ■ simple インタフェースの IDL の作成 ■ このインタフェースの IDL ファイルからのスタブとスケルトンの生成 ■ クライアントから送られた文字列をエコーし、終了する操作のインプリメント ■ 適切なクライアント・コードとサーバー・インプリメンテーション・コードの追加 17-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 単純なサーバーとクライアントの作成 注意 : IDL コンパイラがスタブおよびスケルトン・ファイルを生成しま す。ユーザーはこれらのファイルを変更しません。 IDL によるオブジェクトのインタフェースの定義 サーバー・アプリケーション作成の際、サーバー・インタフェースを定義するために Interface Definition Language(IDL)ファイルを作成する必要があります。インタフェース とは、CORBA オブジェクトを定義するテンプレートです。オブジェクト指向言語のあらゆ るオブジェクトと同じように、ここには読込みまたは設定可能なメソッドとデータ要素が含 まれています。ただし、インタフェースは定義にすぎません。あるオブジェクトに対するイ ンタフェースがどのようなものになるかは、IDL インタフェースで定義します。IDL ファイ ルでは、オブジェクトとそのオブジェクト上でクライアントが実行できる操作を、各インタ フェースによって記述します。 注意 : IDL の構文は、第 18 章「IDL の構文とセマンティック」で説明さ れています。 この例では、simple.idl という名前を持ち、simple インタフェースを定義するファイルを作 成します。この simple インタフェースでは 2 つのメソッドを定義します。String の echo、 そして quit です。 simple.idl ファイルの内容は次のようになります。 interface simple { void echo( in string msg); void quit(); }; echo メソッドのメッセージ・パラメータには、in の方向属性があります。in 属性は、msg パラメータがクライアントからサーバーに渡されることを示します。out 属性は、パラメー タがサーバーからクライアントに渡されることを示し、inout は、パラメータが両方向で受 け渡されることを示します。 IDL ファイルのコンパイル $ORB_HOME/bin/ の oasoidlc コンパイラは、入力に IDL ファイルを使用して、オブジェ クトとクライアントのインプリメント時に使用するインタフェース、クラスおよびデータ構 造体を定義する Java ソース・ファイルを生成します。生成されたオブジェクトの名前は、 IDL/Java 言語マッピングの仕様に準拠しており、.java 拡張子を使用したファイル名として も使用されます。たとえば、simple クラスは simple.java ファイルに含まれます。 コンパイラを実行するコマンドは次のとおりです。 Java から CORBA オブジェクトへのアクセス 17-5 単純なサーバーとクライアントの作成 prompt> oasoidlc [options] IDLfile コマンドのオプションに関しては、17-7 ページの「IDL-to-Java コンパイラの使用」を参照 してください。 IDL コンパイラ・コマンド oasoidlc を使用して simple.idl ファイルをコンパイルします。 % oasoidlc -g java -t simple.idl これにより、クライアント・スタブとサーバー・スケルトン、Helper クラスと Holder クラ ス、およびインタフェース定義が生成されます。 図 17-2 ORB アプリケーションの作成 IDL oasoidlc IDL IDL Helper & Holder simple.idl ファイルをコンパイルすると、次のファイルが出力されます。 ファイル名 ファイル・タイプ simple.java simple のインタフェース定義 _stub_simple.java IDL のクライアント・スタブ _simpleImplBase.java IDL のサーバー・スケルトン simpleHelper.java simple の Helper クラス。このクラスで提供される最も重要なメ ソッドは、返されたオブジェクトが simple オブジェクトになるよ うにキャストする narrow メソッドと、インタフェースの識別子を 返す id メソッドです。 17-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL-to-Java コンパイラの使用 ファイル名 ファイル・タイプ simpleHolder.java simple の Holder クラス。Holder クラスにより、Java オブジェク トがクライアントに値を返せるようになります。 生成されたファイルは編集しないでください。サーバー・オブジェクトをインプリメントす るには、_ifcImplBase 抽象クラスを継承するクラスを作成します。ifc はインタフェース名で す。この新しいクラスで、IDL インタフェース用に生成されたファイルである ifc.java に宣 言されているメソッドをインプリメントします。 たとえば、単純なサーバーをインプリメントするには、IDL のサーバー・スケルトン _simpleImplBase.java を拡張する simpleImpl.java というファイルを作成します。 simple.java インタフェース定義に定義されている echo メソッドと quit メソッドを追加し、 インプリメントします。さらに、これらのメソッドを適切に実行するクライアント・アプリ ケーションを作成する必要があります。17-10 ページの「処理の定義」に、単純な simpleImpl.java のサーバー・インプリメンテーション方法を示します。 注意 : デフォルトでは、コンパイラは tie クラスを生成します。これは、 "-t" オプションを指定することによってオフにできます。詳細は、17-7 ページの「IDL-to-Java コンパイラの使用」を参照してください。 IDL-to-Java コンパイラの使用 IDL-to-Java コンパイラは oasoidlc で、Oracle Application Server がインストールされて いるマシンの $ORB_HOME/bin ディレクトリに存在します。oasoidlc コマンドは CORBA IDL を入力として受け付け、Oracle ORB のクライアントやサーバーを作成する際に使用で きる様々なファイルを生成します。 このコンパイラでは OMG IDL 仕様を使用できます。コンパイラが使用する IDL-to-Java 言 語マッピングは、CORBA 2.2 仕様に対応しています。 また、oasoidlc コンパイラは、CORBA 2.2 インタフェース・リポジトリに関するプラグマ ID、接頭辞およびバージョンをサポートしています。詳細は、http://www.omg.org/ の CORBA 仕様の第 6 章を参照してください。 例 IDL コンパイラ・コマンド oasoidlc を使用して simple.idl ファイルをコンパイルします。 % oasoidlc -g java -t simple.idl これにより、クライアント・スタブとサーバー・スケルトン、Helper クラスと Holder クラ ス、およびインタフェース定義が生成されます。 Java から CORBA オブジェクトへのアクセス 17-7 IDL-to-Java コンパイラの使用 オプション オプションは、すべてコンパイラのコマンド・ラインでも、またユーザー環境のリソース設 定でも指定できます。次のオプションは、Java 出力にのみ適用されます。 オプション 説明 -D name{=val} マクロ名を定義します。値がない場合は、#define name 1 と同じです。値がある 場合は、#define name value と同じです。このようにして定義されたマクロ名 は、すべて入力ファイルに存在するマクロより先に処理されます。 -E 入力に対してプリプロセッサのみ実行します。プリプロセスされた出力は、デ フォルトで stdout に書き出されます。出力をファイルにリダイレクトするには、 -o を使用してください。スタブは生成されません。 -f すべての oasoidlc 出力ファイルのリストをコンパイルします。リストは wbjidlc.lst に出力されます。 -g language 出力ファイルを生成するコード言語を指定します。java または cplus を使用でき ます。 -h 使用方法の情報を stdout に出力します。 -I pathname pathname で指定されたディレクトリ内の #include ファイルを検索します。詳細 は、次の「Include ファイルの検索(-I) ファイルの検索( )」を参照してください。指定しない場 合は、現行ディレクトリのみ検索します。 -i #include ファイルから IDL のスタブ・コードを生成します。通常インクルー ド・ファイルについては、最小限の宣言のみが生成され、スタブは生成されま せん。詳細は、次の「#include の IDL ファイルのコード生成」を参照してくだ ファイルのコード生成 さい。 -o pathname 出力ファイルが入るディレクトリを指定します。このディレクトリは既に存在 している必要があります。指定しない場合は、現行ディレクトリが使用されま す。 -p 生成されたクラスが入る Java パッケージを指定します。-p pkg1.pkg2 のよう に、ドットでレベルを区切って、複数レベルのパッケージを指定できます。IDL ファイルでモジュールがすでに指定されている場合、-p オプションで指定され たパッケージは、指定されたモジュールの先頭に追加されます。指定がなく、 IDL ファイルでモジュールが指定されていない場合、生成されたクラスはいず れのパッケージにも存在しません。 -t タイ・サポートの生成を禁止します。タイ・メカニズムの詳細は、17-17 ページ の「タイ・メカニズムによる既存コードの実行」の項を参照してください。 -T トレース情報を出力します。 -U name マクロ名の定義を解除します。これは、#undef name と同じです。-U オプショ ンは、すべて -D オプションの後、そして入力ファイルでプリプロセスが行われ る前に処理されます。このため、このオプションは、-D オプションを使用して 設定されたマクロ定義を解除する場合にのみ使用できます。 17-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL-to-Java コンパイラの使用 オプション 説明 -V バージョン・バナーを stderr に出力します。 -w エラー・メッセージのみ表示します。 Include ファイルの検索(-I ファイルの検索(-I) -I) #include 文のファイル名は、絶対ファイル名ではない場合、次のように検索されます。 ■ ファイル名が二重引用符(#include "fn")で囲まれている場合、現行ファイルの入って いるディレクトリが検索されます。山カッコ(#include <fn>)を使用すると、現行ディ レクトリの検索を禁止します。 ■ include ファイルが現行ディレクトリ内に存在しない場合、-I で指定されたディレクトリ が、コマンド・ラインに指定された順番で検索されます。 #include の IDL ファイルのコード生成 型コードなど、スタブ関数とオブジェクトのシングル・ポイント定義を確実にするため、通 常、#include ファイルから IDL のスタブ・ファイルへ定義は生成されません。かわりに、 インクルード・ファイルを別にコンパイルすることにより、関連する定義を生成する必要が あります。ただし、生成されたヘッダー・ファイルには、include ファイルからのすべての 型、関数およびオブジェクトの宣言が含まれます。 たとえば、次のようになります。 ファイル A.idl には次のコードが含まれます。 interface A { void doSomething(); }; ファイル B.idl には次のコードが含まれます。 #include "A.idl" interface B { A getA(); }; B.idl をコンパイルして生成されたヘッダー・ファイル B.h には、A.idl と B.idl 内のすべて の宣言、たとえば A、 、A_doSomething、 、B および B_getA などが含まれます。ただし、 B.idl のクライアントおよびサーバー・スタブ・ファイルには、B.idl からの定義、たとえば B や B_getA などのみ含まれます。 同様に、B.idl のコンパイル時に -S が定義されると、生成されたサーバー・インプリメン テーション・スケルトンには、A_doSomething の関数テンプレートは含まれません。 Java から CORBA オブジェクトへのアクセス 17-9 IDL-to-Java コンパイラの使用 B.idl を利用する予定のクライアントまたはサーバー・プログラムは、B.idl と A.idl の両方 をコンパイルし、クライアントまたはサーバー・スタブにリンクする必要があります。 この動作は、-i オプションによりオーバーライドできます。-i を使用すると、B.idl のコンパ イルにより、A.idl と B.idl の両方に含まれているものすべてに対して定義が作成されます。 インタフェース・メソッドのインプリメント インプリメンテーションは、インタフェースの実際のインスタンス生成です。つまり、イン プリメンテーションとは、IDL インタフェースに定義されているすべての関数とデータ要素 をインプリメントするコードです。 simpleImpl.java という名前のインプリメンテーション・クラスのファイルを作成します。 このファイル内に、echo および quit 関数をインプリメントします。サーバー・インプリメ ンテーションの simpleImpl は、IDL で生成されたスケルトン _simpleImplBase を拡張しま す。 _simpleImplBase スケルトンは ORB とサーバー・アプリケーションの間に存在し、サー バー・アプリケーションの実行はすべてこれを通して行われるようになります。このスケル トンは、パラメータを準備し、サーバー・メソッドをコールし、戻り値や出力パラメータま たは入力パラメータを保存します。また、このスケルトンで simple__ id を定義します。こ れは simple インタフェースに対して IDL コンパイラが指定した識別子です。 public class simpleImpl extends _simpleImplBase implements simple { public void echo(String msg) { } public void quit() { } } 処理の定義 simpleImpl.java ファイルに echo および quit 処理をインプリメントします。この例では、 echo 処理は文字列を出力します。quit 処理はメッセージを出力し、ORB::stop を使用して、 ORB ランタイムのリクエスト処理を停止します。 ORB::init メソッドを使用して、ORB ランタイムをプロセス用に初期化し、アクティブな ORB オブジェクト・リファレンスを取り出します。そのプロセスで ORB ランタイムがすで にアクティブになっている場合、init メソッドは、アクティブな ORB オブジェクト・リファ レンスを返します。init メソッドを使用して ORB オブジェクトを取り出すと、アプリケー ションがオブジェクトを保管する必要がありません。 アプレットから ORB オブジェクト・リファレンスを取り出すには、init(Applet, Properties) メソッドを使用します。パラメータを使用しないバージョンの init をアプレットからコール 17-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL-to-Java コンパイラの使用 すると、例外が返されます。init メソッドの詳細は、『Java API Specification』の org.omg.CORBA.ORB の説明を参照してください。 public class simpleImpl extends _simpleImplBase implements simple { public void echo(String msg) { System.out.println("simpleImpl echo: "+msg); } public void quit() { System.out.println("notifying server to shutdown"); // The init method grabs the active ORB object. The active object is // cast into an Oracle ORB object. // The stop method signals the ORB to end the ORB::run method // that is blocking the server process oracle.oas.orb.CORBA.ORB orb = (oracle.oas.orb.CORBA.ORB)org.omg.CORBA.ORB.init(); orb.stop(); } } サーバー・アプリケーションの作成 次に、サーバー・アプリケーションの主要部を作成します。この項では、次の機能を持つ sServer.java を示します。 ■ simple のオブジェクト・インスタンスを作成し、simple のインプリメンテーションを ORB に登録する ■ このクライアントに対する ORB プロセスが停止するまで、simple に対するクライアン ト・リクエストを処理する 例 17-1 サーバー・オブジェクト・リクエスト環境の初期化 sServer.java サーバー・アプリケーションは、この処理の ORB ランタイムを ORB::init によ り初期化します。ORB::init メソッドは、複数回コールできます。ただし、これで複数の ORB が初期化されるわけではありません。かわりに、ORB::init メソッド実行時に ORB オブ ジェクトがアクティブであれば、アクティブな ORB オブジェクト・リファレンスが返され ます。ORB::shutdown メソッドにより、この処理の ORB ランタイムが終了します。 注意 : 停止前に ORB が正しくクリーン・アップを行うように、 System.runFinalizersOnExit メソッドを実行してください。 Java から CORBA オブジェクトへのアクセス 17-11 IDL-to-Java コンパイラの使用 class sServer { public static void main(String[] args) { oracle.oas.orb.CORBA.ORB orb; /*Start ORB runtime for this process */ orb = (oracle.oas.orb.CORBA.ORB orb)org.omg.CORBA.ORB.init(); /*Tell the JVM to do a proper cleanup*/ System.runFinalizersOnExit(true); . . . /*main server code is described in the following examples*/ /*Finally, shut down the ORB runtime*/ orb.shutdown(); } } 例 17-2 ORB を使用した simple のオブジェクト・インスタンス作成と登録 sServer.java サーバー・アプリケーションの次のセグメントでは、simple のオブジェクト・ インスタンスを作成し、それを ORB に登録します。オブジェクト・インスタンスは simple のコンストラクタにより作成され、オブジェクトは ORB::connect メソッドにより ORB に登 録されます。ORB::connect メソッドは oracle.oas.orb.CORBA.ORB にキャストされます。 これは、Oracle がこのメソッドを拡張して、オブジェクトのスレッド・ポリシーを設定し、 オブジェクトが状態を保持しないかあるいは一時的に状態を保持するよう指定できるように しているためです。 simple obj; /*Create a simple object*/ obj = (simple) new simpleImpl(); /*Register implementation with the ORB*/ ((oracle.oas.orb.CORBA.ORB)orb).connect(obj, oracle.oas.orb.CORBA.ORB.OBJECT_STATELESS, "SimpleServer"); ORB::connect メソッドのオプションのパラメータの 1 つは整数値です。これは、インプリメ ンテーションのオブジェクト・インスタンスが、一時的に状態を保持するか (OBJECT_TRANSIENT)状態を保持しないか(OBJECT_STATELESS)のいずれかを定義し ます。OBJECT_STATELESS 値は、暗黙的にバインドされているリクエストの受信時に simple のインプリメンテーションを ORB に登録します。 17-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL-to-Java コンパイラの使用 connect メソッド connect メソッドは、オブジェクトがリクエストを受け取る準備ができていることを ORB に伝えます。IDL/Java 言語マッピングでは一時オブジェクトのみ使用可能ですが、ORB に よって機能が拡張され、オブジェクトのスレッド・ポリシーを設定し、状態を保持しないオ ブジェクトまたは一時的に状態を保持するオブジェクトを指定することもできます。クライ アントは、bind() を使用して状態を保持しないオブジェクトにアクセスできます。スレッ ドとオブジェクトの状態には関連がありません。 オブジェクトの状態 簡単に言えば、ORB は状態を保持しないオブジェクトと一時的に状態を保持するオブジェク トの 2 つの型のオブジェクトを持つことができます。状態を保持しないオブジェクトはコン テキストのないオペレーションに使用され、一時的に状態を保持するオブジェクトはサー バー・プロセスの間、情報を維持します。状態を保持するオブジェクトは、データベースや ファイル・システムに格納されないため、一時的と呼ばれます。プロセスの終了時に、オブ ジェクトのオフサイクルが終了します。 connect() メソッドはブロック化されていません。このメソッドはオブジェクトを登録し、 次にリクエストを処理します。simple デモのインプリメンテーションでは、状態を保持しな いオブジェクトを使用します。クライアントは、bind() を使用してオブジェクト・リファ レンスを取得します。 オブジェクトの状態を OBJECT_STATELESS に設定すると、bind() を使用してオブジェク トにアクセスできます。 例 17-3 リクエスト処理用のブロック ORB::run メソッドは、simple でインプリメントされている処理に対するリクエストを処理 するスレッドをブロックします。このメソッドは、ORB::stop メソッドを使用してクライア ントが ORB にリクエスト処理を停止するようリクエストするまで、ブロックします。この simple の例では、quit のインプリメンテーションにより、ORB のこれ以上のリクエスト処 理を停止します。 /*Block while object requests are being serviced by the orb*/ /*This is unblocked when the orb is stopped (orb.stop()) */ orb.run(); 例 17-4 サーバーと ORB の非アクティブ化およびリソースの解放 ORB::run が返された場合、ORB::disconnect を使用してオブジェクト・インスタンスをパッ シブにする必要があります。このメソッドはオブジェクトをパッシブにし、オブジェクト・ リファレンスを解放します。 /*When orb.run returns, the ORB is done servicing requests*/ /*Disconnect the simple object. This releases the object instance*/ /*deactivates the implementation and destroys the implementation*/ orb.disconnect(obj); Java から CORBA オブジェクトへのアクセス 17-13 IDL-to-Java コンパイラの使用 クライアント・アプリケーションの作成 サーバーの作成後、クライアントを作成する必要があります。simple の例のクライアント は、sClient.java 内に存在します。 例 17-5 クライアントの初期化 sClient.java クライアントは、ORB::init により、クライアント・プロセスの ORB ランタイム を初期化します。ORB ランタイムの初期化後、クライアントは ORB::bind により、simple オブジェクトに暗黙的にバインドされたオブジェクト・リファレンスを取得します。ORB は、バインドとともに提供されたインタフェース識別子とインプリメンテーション識別子を 満たす、simple のインプリメンテーションのオブジェクト・リファレンスを返します。通 常、クライアントは IDL ファイルに作成されたインタフェース識別子のみ提供します。この 例では、simple の識別子は simpleHelper.id() メソッドにより返されます。 注意 : 特定のインプリメンテーションが必要な場合は、そのインプリメ ンテーションを定義する文字列を指定します。たとえば、この例で作成し たインプリメンテーションを返すには、sServer.java ORB::connect メソッ ドに指定された文字列の "SimpleServer" が、simple のこのインプリメン テーションのバージョンを示しています。クライアントがインタフェース 識別子しか提供しない場合、ORB は使用可能なインプリメンテーション・ インスタンスのうち、どれを取り出すかわかりません。 ORB::bind は、simple オブジェクトのオブジェクト・リファレンスを取得します。ただし、 返されるオブジェクト・リファレンスは、Object 型です。クライアントは narrow メソッド を使用して、返されたオブジェクト・リファレンスを simple 型のオブジェクトにタイプ キャストします。 クライアントがオブジェクト・リファレンスを取得すると、simple のメソッドである echo と quit を実行できます。 注意 : サーバーのメソッド実行時に、NULL または空の文字列をパラ メータとして渡すと、サーバーに渡されるときにどちらも空の文字列に変 換されます。 class sClient { public static void main(String[] args) { /*Create and start an ORB */ oracle.oas.orb.CORBA.ORB orb; orb = (oracle.oas.orb.CORBA.ORB) org.omg.CORBA.ORB.init(); 17-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド サーバーおよびクライアント・アプリケーションの実行 /*Retrieve an object reference to an object that implements simple*/ /*Upon return, typecast the object reference to the simple object*/ simple obj = simpleHelper.narrow(orb.bind(simpleHelper.id())); /*Process incoming arguments*/ for (int i = 0; i <args.length; i++) { /*execute the simple.quit or simple.echo methods, as appropriate*/ if (args[i].equals("-q")) obj.quit(); else obj.echo( args[i]); } 例 17-6 メモリーの解放と非アクティブ化 最後にクライアントは、Object::_release メソッドをコールしてオブジェクト・リファレンス (obj)が使用したリソースを解放し、ORB::shutdown をコールしてこの処理の ORB ランタ イムを終了します。 /*Release the object reference memory*/ obj._release(); /*Shut down the ORB*/ orb.shutdown(); } } サーバーおよびクライアント・アプリケーションの実行 クライアントとサーバーの作成が終了し、スタブとスケルトンをすべて生成すると、アプリ ケーションを実行する準備は完了です。simple デモを実行するには、次のようにします。 1. ORB を設定します。ORB の設定は、 『Oracle Application Server 管理者ガイド』の第 9 章で説明されています。 2. OAS 4.0 の管理用 GUI を使用して ORB を起動します。 3. simple デモを実行します。 a. バックグラウンドでサーバー・プロセスを開始します。 % java sServer& Java から CORBA オブジェクトへのアクセス 17-15 サーバーおよびクライアント・アプリケーションの実行 b. oasostat コマンドで、simple インタフェースが ORB に登録されたことを検証しま す。 % oasostat -l Interface Implementation Active Request =============================================================================== IDL:simple:1.0 SimpleServer 41 3 host:pid test-sun:16053 2 test-sun:16054 1 test-sun:16052 0 ------------------------------------------------------------------------------IDL:omg.org/CosNaming/NamingContext:1.0 test-sun 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydf/loader:1.0 test-sun:15388 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydimr/imr:1.0 orb.oasoorb 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydmtd/svr:1.0 orb.oasoorb 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydreaper/ydreap:1.0 test-sun:15388 1 0 host:pid test-sun:15388 0 出力を見ると、インタフェース識別子 IDL:simple:1.0 で示された simple インタ フェースが、SimpleServer というインプリメンテーション名(ORB::connect メ ソッドの sServer.java に定義されている)で登録されており、3 つのインプリメン テーション・インスタンスに 41 個のリクエストが実行されたことがわかります。 注意 : ORB::connect メソッドにインプリメンテーション名を指定しない 場合、SimpleServer のかわりに文字列 "orb.javaApp" が表示されます。 現在、アクティブな simple のオブジェクトは 3 つあります。これらのインスタン スは test-sun 上に存在し、プロセス ID16053、16054 および 16052 でリスニングし ています。各インスタンスに対して起動されたリクエスト数は、host:pid リストの 横にリストされます。残りのリクエストは、アクティブでなくなったインスタンス に対して実行されています。 c. クライアントを実行し、文字列が引用符内でエコーされるように指定します。 $ java sClient "your_message" 17-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド タイ・メカニズムによる既存コードの実行 サーバーが文字列をエコーします。 simpleImpl echo: "your_message" d. テストを完了したら、quit メソッドを使用して simple を中断します。 % java sClient -q simple インタフェースはまだ ORB に登録されていますが、非アクティブ(0)とし て識別されています。 % oasostat -l Interface Implementation Active Request =============================================================================== IDL:simple:1.0 SimpleServer 0 41 ------------------------------------------------------------------------------IDL:omg.org/CosNaming/NamingContext:1.0 test-sun 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydf/loader:1.0 test-sun:15388 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydimr/imr:1.0 orb.oasoorb 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydmtd/svr:1.0 orb.oasoorb 1 0 host:pid test-sun:15388 0 ------------------------------------------------------------------------------IDL:ydreaper/ydreap:1.0 test-sun:15388 1 0 host:pid test-sun:15388 0 タイ・メカニズムによる既存コードの実行 CORBA オブジェクト以外の複数の既存アプリケーションを使用している場合があります。 CORBA クライアントは、タイ・メカニズムを使用して既存のアプリケーションなどの非 CORBA オブジェクト上でメソッドを実行できます。CORBA 階層に準拠するように既存の アプリケーションを再構築しない場合、このメカニズムを使用できます。 タイ・メカニズムは、メソッドの実行を実際のインプリメンテーションに転送する(または " 委任する ")Java クラス("tie" クラスと呼ばれる)を作成します。これは、IDL/Java 言語 マッピングによって指定されるクラス階層に適合する必要はありません。Java では継承は 1 つしか使用できず、IDL/Java 言語マッピングは Java で作成された基本クラスからの継承が 必要なため、これは便利です。すべての CORBA オブジェクトは、IDL が生成したクラスを 継承する必要があります。 oasoidlc コンパイラは、IDL に定義されている各インタフェースの tie クラスを生成します。 コンパイラは、インプリメンテーション用の tie クラスを生成し、既存インプリメンテー Java から CORBA オブジェクトへのアクセス 17-17 タイ・メカニズムによる既存コードの実行 ションの Operations クラスを生成します。前の章で示した simple デモでは、oasoidlc によ り次の tie ファイルが生成されます。 表 17-1 simple 用に生成された tie ファイル ファイル 説明 _tie_simple.java IDL クラスである _simpleImplBase クラスをインプリメント する _tie_simple クラスを定義します。tie オブジェクトのコ ンストラクタは、対応する Operations クラスの型を持つ引 数を取ります。この引数は、そのメソッドに委任されるオブ ジェクトを指定します。 simpleOperations.java IDL のメソッドを指定する simpleOperations インタフェー スを定義します。これは、委任されるオブジェクトの型で す。 CORBA サーバー・アプリケーション内に既存オブジェクトを結び付けるには、2 つの変更 が必要です。 ■ インプリメンテーションは、IDL が生成したスケルトン・クラスのかわりに Operations インタフェースをインプリメントする。 ■ サーバー・アプリケーションは、インプリメンテーション・オブジェクトではなく、tie オブジェクトにインプリメンテーションを登録する。 インプリメンテーションへの変更 既存コードに tie クラスを使用している場合、サーバーのインプリメンテーションではスケ ルトン・クラスのかわりに、Operations インタフェースをインプリメントします。 例 17-7 tie クラスを使用したインプリメンテーションの拡張 simpleImpl.java では、simpleImpl クラスは _simpleImplBase クラスのかわりに、 simpleOperations インタフェースをインプリメントします。 public class simpleImpl implements simpleOperations { public echo(String str) { ... } public void quit() {....} } スケルトン・クラスも使用されます。これは、tie クラスによって拡張されます。 17-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド タイ・メカニズムによる既存コードの実行 サーバーへの変更 tie クラスを使用している場合、ORB::connect コールのオブジェクトはクラスのインプリメ ンテーションではなく、tie クラスのインスタンスです。ただし、インプリメンテーション・ オブジェクトは tie オブジェクト内でパラメータとして渡されます。このため、tie オブジェ クトは非 CORBA オブジェクトからメソッドを実行できます。サーバーは、インプリメン テーション・オブジェクトと tie オブジェクトの両方のインスタンスを生成します。 例 17-8 tie オブジェクトへの接続 次の例では、ORB::connect コールに対して simpleImpl オブジェクト sobj のインスタンスを 生成せず、かわりに tie オブジェクト tobj が作成され、connect コール内で渡されることを 示しています。simpleImpl オブジェクトは、入力パラメータとして tie オブジェクトに渡さ れます。 /*create the simple implementation instance*/ simpleImpl sobj = new simpleImpl(); /*create the tie instance given the simple implementation*/ _tie_simple tobj = new _tie_simple(sobj); ((oracle.oas.orb.CORBA.ORB)orb).connect(tobj, oracle.oas.orb.CORBA.ORB.OBJECT_STATELESS); スケルトンの invoke メソッドは、tie クラスの該当するメソッドをコールします。tie クラス のメソッドは、提供されたオブジェクトの既存メソッドをコールします。 tie と tie 以外の両方のケースで、同じクライアントを使用することができます。クライアン トがオブジェクト上でコールを実行する場合、プロセス・フローは次のようになります。 Java から CORBA オブジェクトへのアクセス 17-19 タイ・メカニズムによる既存コードの実行 図 17-3 tie クラスを使用した制御フロー sClient.java public class sClient { public static void main(String[] args) { // init stuff here (see code below) obj.echo(args[1]); // close stuff here (see code below) } } クライアント サーバー _tie_simple.java public class _tie_AccountManager extends simpleImplBase { private simpleOperations $_delegate; public _tie_simple(simpleOperations $_delegate){ ... } public void echo(String msg){ this.$_delegate.echo(msg); } simpleImpl.java public class simpleImpl implements simpleOperations{ public echo (String name) { // ... } } 17-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 18 IDL の構文とセマンティック この付録では、インタフェース定義の際に守る必要のある構文とセマンティック・ルールに ついて説明します。この付録には次の内容が記載されています。 ■ IDL について ■ 字句規則 ■ IDL のプリプロセス ■ IDL の文法 ■ IDL の仕様 ■ 継承 ■ 定数宣言 ■ 型宣言 ■ 例外宣言 ■ 演算宣言 ■ 属性宣言 ■ CORBA モジュール ■ 名前と有効範囲 ■ 標準例外 IDL の構文とセマンティック 18-1 IDL について IDL について IDL(Interface Definition Language)は、クライアントとサーバーが ORB を通じて通信す る際に使用するインタフェースを定義します。IDL で作成されたインタフェース定義は、イ ンタフェースの高水準の定義を提供し、各演算のパラメータを指定します。IDL ファイル は、インタフェースの演算を使用するクライアントや、その演算をインプリメントするサー バーを開発するために必要な情報を提供します。 IDL からプログラム言語要素へのマッピングは、クライアント言語で使用できる機能によっ て異なります。たとえば、IDL 例外が例外にマップされる言語もありますが、例外という概 念がない言語の場合は構造体にマップされることもあります。 IDL で作成されたインタフェース仕様を含んだソース・ファイルには、拡張子 ".idl" が必要 です。ORB には、IDL ファイルを C、C++ および Java の 3 つの言語のいずれかに変換する IDL コンパイラが付属しています。IDL 概念から Java 言語へのバインディングは、第 19 章 「IDL から Java への言語マッピング」で説明されています。 注意 : この項の情報は、OMG の CORBA 2.2 仕様書の第 24 章 「Mapping of OMG IDL to Java」からの抜粋です。OMG の仕様書とこの マニュアルの間でコードおよびマッピングの説明が類似している部分につ いては、そのコードおよび説明の著作権は Object Management Group に 帰属します。 IDL と C++ の比較 IDL のセマンティックは C++ 言語と似ていますが、分散の概念をサポートするために新し いキーワードが導入されています。また、IDL は標準 C++ のプリプロセス機能を完全にサ ポートしています。IDL 仕様には、ANSI 標準化の動きにより C++ に導入された変更点と同 様の変更が行われる予定です。 IDL の文法は、ANSI C++ 標準案のサブセットで、そこに演算実行メカニズムをサポートす る構成体を追加したものです。IDL は宣言言語です。定数、型および演算宣言について C++ の構文をサポートしています。アルゴリズムの構造や変数は含まれていません。 IDL 固有のプラグマは、仕様のどこにでも使用できます。ただし、これらのプラグマのテキ スト内での位置は、特定のインプリメンテーションにより意味上の制約を受ける場合があり ます。 IDL は C++ の構文にほぼ準拠していますが、IDL の方が多くの制限事項があります。現在 の制限事項は次のとおりです。 ■ 関数の戻り型は必須です。 ■ 演算宣言の中で、それぞれの仮パラメータに名前を指定する必要があります。 ■ シングル・トークン void で構成されるパラメータ・リストでは、空のパラメータ・リス トのシノニムは許可されません。 18-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 字句規則 ■ 構造体、識別子付き共用体および列挙には、タグが必要です。 ■ 整数型は単に int または unsigned で定義することはできません。明示的に short または long と宣言する必要があります。 ■ char 型に、signed または unsigned キーワードを付けることはできません。 字句規則 IDL の字句規則では、IDL 仕様のトークンを定義し、コメント、識別子、キーワードおよび リテラル(たとえば整数、文字、そして浮動小数点定数と文字列リテラルなど)について説 明します。 IDL 仕様は、論理的には 1 つ以上のファイルで構成されます。 IDL では、ISO Latin-1(8859.1)キャラクタ・セットを使用します。このキャラクタ・セッ トは、アルファベット文字、数字、図形文字、スペース(空白)文字および書式文字にわか れています。 アルファベット文字 表 18-1 に、IDL のアルファベット文字を示します。同じ文字の大文字と小文字がペアになっ ています。 表 18-1 114 アルファベット文字 文字 説明 文字 説明 Aa A の大文字 / 小文字 Àà 抑音符付きの A の大文字 / 小文字 Bb B の大文字 / 小文字 Áá 揚音符付きの A の大文字 / 小文字 Cc C の大文字 / 小文字 Ââ 曲折符付きの A の大文字 / 小文字 Dd D の大文字 / 小文字 Ãã ティルダ付きの A の大文字 / 小文字 Ee E の大文字 / 小文字 Ää 分音符号付きの A の大文字 / 小文字 Ff F の大文字 / 小文字 Åå 上に丸が付いた A の大文字 / 小文字 Gg G の大文字 / 小文字 A E ae A と E の連字の大文字 / 小文字 Hh H の大文字 / 小文字 Çç シディラ付きの C の大文字 / 小文字 Ii I の大文字 / 小文字 Èè 抑音符付きの E の大文字 / 小文字 Jj J の大文字 / 小文字 Éé 揚音符付きの E の大文字 / 小文字 Kk K の大文字 / 小文字 Êê 曲折符付きの E の大文字 / 小文字 Ll L の大文字 / 小文字 Ëë 分音符号付きの E の大文字 / 小文字 IDL の構文とセマンティック 18-3 字句規則 表 18-1 114 アルファベット文字(続き) アルファベット文字(続き) 文字 説明 文字 説明 Mm M の大文字 / 小文字 Ìì 抑音符付きの I の大文字 / 小文字 Nn N の大文字 / 小文字 Íí 揚音符付きの I の大文字 / 小文字 Oo O の大文字 / 小文字 Îî 曲折符付きの I の大文字 / 小文字 Pp P の大文字 / 小文字 Ïï 分音符号付きの I の大文字 / 小文字 Qq Q の大文字 / 小文字 Do アイスランド語の eth(エズ)の大文字 / 小文字 Rr R の大文字 / 小文字 Ññ ティルダ付きの N の大文字 / 小文字 Ss S の大文字 / 小文字 Òò 抑音符付きの O の大文字 / 小文字 Tt T の大文字 / 小文字 Óó 揚音符付きの O の大文字 / 小文字 Uu U の大文字 / 小文字 Ôô 曲折符付きの O の大文字 / 小文字 Vv V の大文字 / 小文字 Õõ ティルダ付きの O の大文字 / 小文字 Ww W の大文字 / 小文字 Öö 分音符号付きの O の大文字 / 小文字 Xx X の大文字 / 小文字 Øø 斜線付きの O の大文字 / 小文字 Yy Y の大文字 / 小文字 Ùù 抑音符付きの U の大文字 / 小文字 Zz Z の大文字 / 小文字 Úú 揚音符付きの U の大文字 / 小文字 Ûû 曲折符付きの U の大文字 / 小文字 Üü 分音符号付きの U の大文字 / 小文字 Yy 揚音符付きの Y の大文字 / 小文字 アイスランド語の thorn(ソーン)の大文字 / 小 文字 ß ドイツ語のシャープ S の小文字 ÿ 分音符号付きの Y の小文字 10 進数 表 18-2 に、IDL の 10 進数を示します。 表 18-2 10 進数 10 進数 0123456789 18-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 字句規則 記号 表 18-3 に記号を示します。 表 18-3 記号 文字 説明 文字 説明 ! 感嘆符 ¡ 逆感嘆符 " 二重引用符 ¢ セント記号 # シャープ記号 £ イギリス・ポンド記号 $ ドル記号 ¤ 通貨記号 % パーセント記号 ¥ 円記号 & アンパサンド ' アポストロフィ § 項 / 段落記号 ( 左カッコ ¨ 分音符号 ) 右カッコ © 著作権記号 * アスタリスク ª 女性形表示 + プラス記号 « 左側引用符 , カンマ ¬ ノット記号 - ハイフン・マイナス記号 . ピリオド、終止符 ® 登録商標記号 / スラッシュ ? 長音記号 : コロン ° 摂氏記号 ; セミコロン ± プラス・マイナス記号 < 不等号(小なり記号) 2 2 の上付き文字 = 等号 3 3 の上付き文字 > 不等号(大なり記号) ´ 揚音符 ? 疑問符 µ マイクロ @ アット記号 ¶ 段落記号 [ 左大カッコ • 中黒 ¥ 円記号 ・ シディラ ] 右大カッコ 縦破線 ソフト・ハイフン 1 1 の上付き文字 IDL の構文とセマンティック 18-5 字句規則 表 18-3 記号(続き) 記号(続き) 文字 説明 文字 説明 ^ 曲折符号 º 男性形表示 _ アンダースコア » 右側引用符 ' 抑音符 1 分数 1/4 4 { 1 左中カッコ 分数 1/2 2 | 3 縦線 分数 3/4 4 } 右中カッコ ¿ 逆疑問符 ~ ティルダ ¥ 乗算記号 ÷ 除算記号 書式記号 表 18-4 に書式記号を示します。 表 18-4 書式記号 説明 略称 ISO 646 の 8 進数値 警告 BEL 007 バックスペース BS 010 水平タブ HT 011 改行 NL、LF 012 垂直タブ VT 013 改ページ FF 014 改行 CR 015 トークン トークンには 5 種類あります。識別子、キーワード、リテラル、オペレータおよびその他の セパレータです。空白、水平タブおよび垂直タブ、改行、改ページおよびコメントは、トー クンを区切る以外は無視されます。隣接した識別子、キーワードおよび定数を区切るには、 多少の空白が必要です。 18-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 字句規則 コメント コメントには、アルファベット文字、数字、図形文字、空白、水平タブ、垂直タブ、改ペー ジおよび改行文字を使用できます。/* の記号はコメントを開始し、このコメントは */ の記号 で終了します。これらのコメントはネストしません。// の記号はコメントを開始し、このコ メントはその行の終わりで終了します。コメント記号 //、/* および */ は、// コメントの中で は特定の意味を持たず、他の文字と同じように扱われます。同様に、コメント記号 // および /* は、/* コメントの中では特定の意味を持ちません。 識別子 識別子は、一連のアルファベット文字、数字およびアンダースコア("_")記号で構成されま す。先頭の文字はアルファベット文字にする必要があります。 識別子には大文字・小文字の区別はありません。複数の識別子の違いが大文字・小文字の区 別のみの場合は競合し、コンパイル・エラーが発生します。ただし、定義用の識別子は、仕 様内で綴りが一貫している(大文字・小文字に関して)必要があります。 競合を避けるために 2 つの識別子を比較するときは、次の点に注意してください。 ■ 大文字と小文字は同じ文字として扱われます。表 18-1「114 アルファベット文字」に、 対応する等価のマッピング定義が示されています。 ■ この比較では、二重字および文字のペアを同じものとはみなしません(たとえば "ae" と、" ae " は同じものとみなしません)。また、アクセントの付いた文字と付いていない 文字も同じものとはみなしません(たとえば、"Á" と "A" は同じものとみなしません) 。 ■ すべての文字に意味があります。 ■ IDL 識別子には 1 つの名前領域のみ存在します。たとえば、定数とインタフェースに同 じ識別子を使用すると、コンパイル・エラーが発生します。 キーワード 表 18-5 にリストされている識別子はキーワードとして確保されており、他のものには使用で きません。 表 18-5 キーワード any double interface readonly unsigned attribute enum long sequence union boolean exception module short void case FALSE Object string wchar char fixed octet struct wstring const float oneway switch context in out TRUE default inout raises typedef IDL の構文とセマンティック 18-7 字句規則 キーワードは識別子の規則(18-7 ページの「識別子」を参照)に従い、前述のリストどおり になっている必要があります。たとえば、boolean は正しく、Boolean ではコンパイル・エ ラーが発生します。Object キーワードは型指定子として使用できます。 句読点文字 IDL 仕様では、次の文字を句読点として使用します。 表 18-6 句読点文字 ; { } : , = + - ( ) < > [ ] ' " ¥ | ^ & * / % ~ プリプロセッサ・トークン さらに、次のトークンはプリプロセッサにより使用されます。 表 18-7 プリプロセッサ・トークン # ## ! || && リテラル 整数リテラル 一連の数字で構成される整数リテラルは、0(数字のゼロ)で始まる場合以外は 10 進数(基 数 10)とみなされます。0 で始まる一連の数字は 8 進整数(基数 8)とみなされます。数字 の 8 と 9 は 8 進数の数字ではありません。0x または 0X が先頭につく一連の数字は 16 進整 数(基数 16)とみなされます。16 進数の数字には、10 進数の 10 から 15 に相当する a また は A から f または F が含まれます。たとえば、数字の 12 は 12(10 進法)、014(8 進法)、 または 0XC (16 進法)のように表現できます。 文字リテラル 文字リテラルとは、'x' のように、引用符に囲まれた 1 つ以上の文字です。文字リテラルは char 型です。 文字は 8 ビット長で、0 から 255(10 進法)の数値を持っています。空白、アルファベット 文字、数字または記号リテラルの値は、ISO Latin-1(8859.1)キャラクタ・セット規格で定 義された文字の数値です(表 18-1「114 アルファベット文字」、表 18-2「10 進数」および表 18-3「記号」を参照)。NULL の値は 0(ゼロ)です。書式記号の値は、ISO 646 規格で定義 された文字の数値です(表 18-4「書式記号」参照) 。他のすべての文字の意味は、インプリ メンテーションに依存します。 18-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 字句規則 非記号文字の表記には、次の表 18-8 に定義されているように、エスケープ・シーケンスを使 用する必要があります。文字リテラルの引用符や円記号を表記するには、エスケープ・シー ケンスを使用する必要がある点に注意してください。 表 18-8 エスケープ・シーケンス 説明 エスケープ・シーケンス 説明 エスケープ・シーケンス 改行 ¥n 警告 ¥a 水平タブ ¥t 円記号 ¥¥ 垂直タブ ¥v 疑問符 ¥? バックスペース ¥b 一重引用符 ¥' 改行 ¥r 二重引用符 ¥" 改ページ ¥f 8 進数 ¥ooo 16 進数 ¥xhh 円記号の後の文字がここに指定されているもの以外の場合、動作は定義されていません。エ スケープ・シーケンスは 1 つの文字を指定します。 エスケープ ¥ooo は、円記号の後に 1 つ、2 つまたは 3 つの 8 進数値を続けたもので、対象と なる文字の値を指定するものとみなされます。エスケープ ¥xhh は、円記号の後に x と、1 つ または 2 つの 16 進数値を続けたもので、対象となる文字の値を指定するとみなされます。 一連の 8 進数値または 16 進数値は、それぞれ 8 進数値および 16 進数値以外の文字が現れた ところで終了します。文字定数の値は、char の最大値を超えた場合、インプリメンテーショ ンによって異なります。 長文字および長文字列リテラルは、文字および文字列リテラルとまったく同じように指定し ます。すべての文字および文字列リテラルは、長、非長ともに、ISO 8859-1 キャラクタ・ セットに定義されている文字を使用した場合のみ指定できます(移植可能な状態で) 。つま り、インタフェース名、演算名および型名は今後も ISO 8859-1 キャラクタ・セットに限定さ れます。 浮動小数点リテラル 浮動小数点リテラルは、整数部、小数点、小数部、e または E、および(オプションで)符 号付き整数指数で構成されます。整数部と小数部は、いずれも一連の 10 進数値(基数 10) で構成されます。整数部または小数部のいずれかが(ただし片方のみ)存在しない場合があ ります。さらに、小数点、または文字 e(または E)と指数のどちらかが(ただし片方のみ) 存在しない場合があります。 文字列リテラル 文字列リテラルとは、一連の文字(18-8 ページの「文字リテラル」に定義されている)が、 "..." のように二重引用符で囲まれたものです。 IDL の構文とセマンティック 18-9 IDL のプリプロセス 隣接した文字列リテラルは連結されます。連結された文字列の文字は識別されます。たとえ ば、次のようになります。 "¥xA" "B" の場合、連結後、¥xA と B という 2 つの文字が含まれます(1 つの 16 進文字 ¥xAB ではあり ません) 。 連結後の文字列リテラルのサイズは、引用符で囲まれた文字リテラルの数になります。リテ ラルのサイズはリテラルに関連しています。文字列内では、二重引用符号 " の前に ¥ を付け る必要があります。 文字列リテラルには、文字 '¥0' を含めることはできません。 固定小数点リテラル 固定小数点 10 進数リテラルは、整数部、小数点、小数部および d または D で構成されま す。整数部と小数部は両方とも一連の 10 進数(基数 10)の数値で構成されます。整数部ま たは小数部のいずれかが(ただし片方のみ)存在しない場合があります。さらに、小数点が (ただし文字 d や D ではない)存在しない場合があります。 IDL のプリプロセス IDL 仕様は、論理的には 1 つ以上のファイルで構成されます。ファイルは、概念的にはいく つかのフェーズに変換されます。最初のフェーズはプリプロセスで、これは # で始まる行に よって導入されるディレクティブが制御します。 IDL プリプロセスは ANSI C++ プリプロセスをベースにしており、マクロ置換、条件付きコ ンパイルおよびソース・ファイルのインクルードが可能です。ディレクティブは、診断やシ ンボリック・デバッグ時の行番号を制御し、特定のトークンの順序に関する診断メッセージ を生成し、インプリメンテーションに依存した動作を実行します(#pragma ディレクティ ブ) 。事前定義済みの名前がいくつか存在します。これらの機能は概念的にはプリプロセッ サが処理しますが、実際には別のプロセスとしてインプリメントされている場合と、されて いない場合があります。 # で始まる行(" ディレクティブ " とも呼ばれる)は、プリプロセッサと通信します。# の前 に空白を置く場合もあります。これらの行は IDL の残りの部分からは独立した構文を持って います。これらはどこにでも使用でき、変換単位の終わりまで影響します(IDL 有効範囲規 則に依存しない) 。IDL 固有のプラグマのテキスト内での位置は、意味的に制約されること があります。 プリプロセス・ディレクティブ(または、これに限らずあらゆる行)は、ソース・ファイル の次の行に継続できます。このためには、継続する行の最後の改行文字の直前に円記号(¥) を置きます。プリプロセッサは、入力されたシーケンスがトークンに分けられる前に、円記 号と改行を削除することにより、行の継続を有効にします。 18-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL のプリプロセス 注意 : ソース・ファイルの最後の文字には円記号を使用できません。 プリプロセスの結果、一連のトークンができます。プリプロセスの後、このような一連の トークンは変換単位 変換単位と呼ばれます。プリプロセス・トークンとして使用できるのは、IDL 変換単位 トークン(18-6 ページの「トークン」を参照) 、ファイル名(#include ディレクティブ内) 、 または他のプリプロセス・トークンと一致しない、空白以外のあらゆる単一の文字です。 プリプロセス機能の主な用途は、他の IDL 仕様から定義を挿入することです。#include ディレクティブを使用して挿入されたファイル内のテキストは、挿入先のファイルにある場 合と同様に扱われます。 バージョン制御 インタフェースのバージョン・ナンバーは、#pragma バージョン・プリプロセス・コマンド により制御できます。バージョンが指定されていない場合は、デフォルトの 1.0 を使用しま す。 #pragma version <componentname> <version-number> <componentname> は、フォーム <modulename>::<interfacename> に定義されているインタ フェースの名前です。名前には、含めるモジュールをすべて含める必要があります。 #pragma バージョン定義は、インタフェース定義の後に置く必要があります。 例 18-1 simple.idl のバージョン・ナンバーの追加 interface simple { void echo( in string msg); void quit(); }; #pragma version simple 2.2 これにより、simpleHelper 内の simple インタフェース識別子が次のように変更されます。 "IDL:simple:2.2" IDL の構文とセマンティック 18-11 IDL の文法 IDL の文法 IDL の文法記述には、Extended Backus-Naur format(EBNF)と同様の構文表記法を使用し ます。表 18-9 に、このフォーマットに使用する記号とその意味をリストします。 表 18-9 IDL EBNF フォーマット 記号 意味 ::= ∼と定義される | 代替(どちらか一方) <text> 非終端 "text" リテラル * その前の構文単位の 0 回以上の繰返し + その前の構文単位の 1 回以上の繰返し {} 囲まれた構文単位が 1 つの構文単位としてグループ化されている [] 囲まれた構文単位はオプションで、0 または 1 回発生する可能性がある 次に IDL 言語のサマリーを示し、後の項でさらに詳細に説明します。 <specification> ::= <definition> + <definition> ::= | | | | <module> ::= “module” <identifier> “{“ <definition> + “}” <interface> ::= <interface_dcl> | <forward_dcl> <interface_dcl> ::= <interface_header> “{” <interface_body> “}” <forward_dcl> ::= “interface” <identifier> <interface_header> ::= “interface” <identifier> [<inheritance_spec>] <interface_body> ::= <export> * <export> ::= <type_dcl> “;” | <const_dcl> “;” | <except_dcl> “;” <type_dcl> “;” <const_dcl> “;” <except_dcl> “;” <interface> “;” <module> “;” 18-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL の文法 | | <attr_dcl> “;” <op_dcl> “;” <inheritance_spec> ::= “:” <scoped_name> { “,” <scoped_name> } * <scoped_name> ::= | | ::= <identifier> “::” <identifier> <scoped_name> “::” <identifier> “const” <const_type> <identifier> “=” <const_exp> <const_type> ::= | | | | | | | | <integer_type> <char_type> <wide_char_type> <boolean_type> <floating_pt_type> <string_type> <wide_string_type> <fixed_pt_const_type> <scoped_name> <const_exp> <or_expr> ::= ::= | ::= | ::= | <const_dcl> <xor_expr> <and_expr> <or_expr> <xor_expr> <or_expr> “|” <xor_expr> <and_expr> <xor_expr> “^” <and_expr> <shift_expr> <and_expr> “&” <shift_expr> <shift_expr> ::= <add_expr> | <shift_expr> “>>” <add_expr> | <shift_expr> “<<” <add_expr> <add_expr> ::= <mult_expr> | <add_expr> “+” <mult_expr> | <add_expr> “-” <mult_expr> <mult_expr> ::= | | | <unary_expr> ::= <unary_operator> <primary_expr> | <primary_expr> <unary_operator> ::= "-" | "+" <unary_expr> <mult_expr> “*” <unary_expr> <mult_expr> “/” <unary_expr> <mult_expr> “%” <unary_expr> IDL の構文とセマンティック 18-13 IDL の文法 | <primary_expr> "~" ::= <scoped_name> | <literal> | “(” <const_exp> “)” <literal> ::= | | | | | | | <boolean_literal> ::= | <positive_int_const> <type_dcl> ::= | | | | <integer_literal> <string_literal> <wide_string_literal> <character_literal> <wide_character_literal> <fixed_pt_literal> <floating_pt_literal> <boolean_literal> "TRUE" "FALSE" ::= <const_exp> “typedef” <type_declarator> <struct_type> <union_type> <enum_type> "native" <simple_declarator> <type_declarator> ::= <type_spec> <declarators> <type_spec> ::= <simple_type_spec> | <constr_type_spec> <simple_type_spec> ::= <base_type_spec> | <template_type_spec> | <scoped_name> <base_type_spec> ::= | | | | | <floating_pt_type> <integer_type> <char_type> <wide_char_type> <boolean_type> <octet_type> | | <template_type_spec>::= | | | <any_type> <object_type> <sequence_type> <string_type> <wide_string_type> <fixed_pt_type> <constr_type_spec> ::= <struct_type> 18-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL の文法 | | <union_type> <enum_type> <declarators> ::= <declarator> { “,” <declarator> } * <declarator> ::= <simple_declarator> | <complex_declarator> <simple_declarator> ::= <identifier> <complex_declarator>::= <array_declarator> <floating_pt_type> ::= "float" | "double" | "long" "double" <integer_type> ::= <signed_int> | <unsigned_int> <signed_int> ::= | | ::= <signed_long_int> <signed_long_int> <signed_short_int> <signed_longlong_int> "long" <signed_short_int> ::= "short" <signed_longlong_int>::="long" "long" <unsigned_int> ::= <unsigned_long_int> | <unsigned_longlong_int> | <unsigned_short_int> <unsigned_long_int> ::= "unsigned" "long" <unsigned_short_int>::= "unsigned" "short" <char_type> ::= "char" <boolean_type> ::= "boolean" <octet_type> <any_type> <object_type> <struct_type> ::= ::= ::= ::= <member_list> ::= <member>+ "octet" "any" "object" “struct” <identifier> “{” <member_list> “}” IDL の構文とセマンティック 18-15 IDL の文法 <member> ::= <type_spec> <declarators> “;” <union_type> ::= “union” <identifier> “switch” “(” <switch_type_spec> “)” “{” <switch_body> “}” <switch_type_spec> ::= <integer_type> | <char_type> | <boolean_type> | <enum_type> | <scoped_name> <switch_body> ::= <case>+ <case> ::= <case_label>+ <element_spec> “;” <case_label> ::= “case” <const_exp> “:” | "default" ":" <element_spec> ::= <type_spec> <declarator> <enum_type> ::= “enum” <identifier> “{” <enumerator> { “,” <enumerator> } * “}” <enumerator> ::= <identifier> <sequence_type> ::= “sequence” “<” <simple_type_spec> “,” <positive_int_const> “>” | “sequence” “<” <simple_type_spec> “>” <string_type> ::= | <wide_string_type> ::= | “string” “<” <positive_int_const> “>” "string" “wstring” “<” <positive_int_const> “>” "wstring" <array_declarator> ::= <identifier> <fixed_array_size>+ <fixed_array_size> ::= “[” <positive_int_const> “]” <attr_dcl> ::= [ “readonly” ] “attribute” <param_type_spec> <simple_declarator> { “,” <simple_declarator> }* <except_dcl> ::= “exception” <identifier> “{“ <member>* “}” <op_dcl> ::= [ <op_attribute> ] <op_type_spec> <identifier> 18-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL の仕様 <parameter_dcls> [ <raises_expr> ] [ <context_expr> ] <op_attribute> ::= "oneway" <op_type_spec> ::= <param_type_spec> | “void” <parameter_dcls> ::= “(” <param_dcl> { “,” <param_dcl> } * “)” | "(" ")" <param_dcl> ::= <param_attribute> <param_type_spec> <simple_declarator> <param_attribute> ::= "in" | "out" | "inout" <raises_expr> ::= “raises” “(” <scoped_name> { “,” <scoped_name> } * “)” <context_expr> ::= “context” “(” <string_literal> { “,” <string_literal> } * “)” <param_type_spec> ::= <base_type_spec> | <string_type> | <wide_string_type> | <fixed_pt_type> | <scoped_name> <fixed_pt_type> ::= “fixed_pt_type” “<” <positive_int_const> “>” | "fixed_pt_type" <fixed_pt_const_type> ::= "fixed" IDL の仕様 IDL の仕様は、1 つ以上の型定義、定数定義、例外定義またはモジュール定義で構成されま す。構文は、次のとおりです。 <specification> ::= <definition> + <definition> ::= | | | | <type_dcl> “;” <const_dcl> “;” <except_dcl> “;” <interface> “;” <module> “;” IDL の構文とセマンティック 18-17 IDL の仕様 仕様 参照する項 <const_dcl> 18-23 ページの「定数宣言」 <type_dcl> 18-27 ページの「型宣言」 <except_dcl> 18-36 ページの「例外宣言」 <interface> 18-18 ページの「インタフェース宣言」 <module> 18-18 ページの「モジュール宣言」 モジュール宣言 モジュール定義には、次の構文を使用します。 <module> ::= “module” <identifier> “{“ <definition> + “}” たとえば PingDemo の例では、モジュール demo は、キーワード module の後に識別子 demo を付けて定義されています。次のようになります。 module demo { . . . }; モジュール構成体は、IDL 識別子のスコープを定めるために使用します。詳細は 18-40 ペー ジの「名前と有効範囲」を参照してください。 インタフェース宣言 インタフェース定義には、次の構文を使用します。 <interface> ::= <interface_dcl> | <forward_dcl> <interface_dcl> ::= <interface_header> “{” <interface_body> “}” <forward_dcl> ::= “interface” <identifier> <interface_header> ::= “interface” <identifier> [ <inheritance_spec> ] <interface_body> ::= <export> * <export> ::= <type_dcl> “;” | <const_dcl> “;” | <except_dcl> “;” 18-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL の仕様 | | <attr_dcl> “;” <op_dcl> “;” インタフェース・ヘッダー インタフェース・ヘッダーは次の 2 つの要素で構成されます。 ■ インタフェース名。名前の先頭には、キーワード interface を付ける必要があり、インタ フェースを命名する識別子で構成されます。 ■ 継承仕様(オプション) 。継承仕様は、18-19 ページの「継承仕様」で説明されていま す。 インタフェースを命名する <identifier> には、有効な型名を定義します。この型名は、 <identifier> が文法的に有効であれば、次の項で説明する構文上の制約に従って、どこでで も使用できます。インタフェース型であるパラメータや構造体メンバーは、オブジェクトの リファレンスのみを保持できるため、そのインタフェースをサポートするオブジェクト・リ ファレンスと同様の意味を持ちます。各言語バインディングでは、プログラマがこのような インタフェース・リファレンスをどのように表記する必要があるかを説明しています。 たとえば、次に demo.PingDemo インタフェースのインタフェースを示します。ここでは、 キーワード interface の後にインタフェース名 PingDemo が続きます。 module demo { interface PingDemo { void ping(); void shutdown(); }; }; 継承仕様 継承の構文は次のとおりです。 <inheritance_spec> ::= “:” <scoped_name> {“,” <scoped_name>}* <scoped_name> ::= <identifier> | “::” <identifier> | <scoped_name> “::” <identifier> <inheritance_spec> 内の各 <scoped_name> は、すでに定義済みのインタフェースを示す必 要があります。継承に関する説明は、18-21 ページの「継承」を参照してください。 たとえば、新規インタフェース derived を既存インタフェース simple から導出する場合、 IDL 定義は次のようになります。 IDL の構文とセマンティック 18-19 IDL の仕様 interface derived : simple { }; または、demo モジュールの PingDemo インタフェースから継承するには、次のようにしま す。 interface derived : demo :: PingDemo { }; インタフェース本体 インタフェース本体には、次のような種類の宣言が含まれます。 ■ 定数宣言。これはインタフェースがエクスポートする定数を指定します。定数宣言構文 は、18-23 ページの「定数宣言」に説明されています。 ■ 型宣言。これはインタフェースがエクスポートする型定義を指定します。型宣言構文 は、18-27 ページの「型宣言」に説明されています。 ■ 例外宣言。これはインタフェースがエクスポートする例外構造体を指定します。例外宣 言構文は、18-36 ページの「例外宣言」に説明されています。 ■ 属性宣言。これはインタフェースがエクスポートする関連属性を指定します。属性宣言 構文は、18-39 ページの「属性宣言」に説明されています。 ■ 演算宣言。これは、インタフェースがエクスポートする演算とそれぞれのフォーマット を指定します。これには、演算名、返されるデータ型、演算のすべてのパラメータの 型、実行の結果として返される有効な例外、およびメソッドのディスパッチに影響する 可能性のあるコンテキスト情報が含まれます。演算宣言構文は、18-37 ページの「演算 宣言」に説明されています。 空のインタフェース(宣言を含まないもの)も使用できます。 インプリメンテーションには、インタフェース本体の前にインタフェース固有のプラグマが 必要な場合があります。 前方宣言 前方宣言では、インタフェースを定義せずに名前を宣言します。これにより、相互参照する インタフェースの定義が可能となります。構文は単純に、キーワード・インタフェースの後 にインタフェースを命名する <identifier> を付けて構成されます。実際の定義は、後に仕様 の中で行う必要があります。 同じインタフェース名の複数の前方宣言は有効です。 たとえば、CosNaming モジュールを定義する際、BindingIterator インタフェースは本体の 始めで前方宣言として定義されますが、本体の最後に到達するまで完全には定義されませ ん。 18-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 継承 module CosNaming { interface BindingIterator; . . . /*other interface definitions that refer to BindingIterator*/ . . . interface BindingIterator { boolean next_one(out Binding b); boolean next_n(in unsigned long how_many, out BindingList bl); void destroy(); }; }; 継承 インタフェースは別のインタフェースから導出できます。導出元のインタフェースは、導出 されたインタフェースの基本インタフェースと呼ばれます。導出されたインタフェースは他 のインタフェースと同様に、新規要素(定数、型、属性、例外および演算)を宣言できま す。また、導出されたインタフェースで再定義されないかぎり、基本インタフェースの要素 を、導出されたインタフェースの要素であるかのように参照できます。名前変換演算子(::) を使用して、明示的に基本要素を参照できます。これにより、導出されたインタフェースに 再定義されている名前を参照できるようになります。 導出されたインタフェースでは、継承したすべての型、定数および例外名を再定義できま す。このように継承された名前の有効範囲規則は、18-40 ページの「CORBA モジュール」 に説明されています。ただし、継承された演算と属性は、導出されたインタフェースでは再 定義できません。 <inheritance_spec> に指定されている場合は直接基本インタフェースと呼ばれ、直接基本で はないが、<inheritance_spec> に指定されているインタフェースの基本インタフェースに なっている場合は、間接基本インタフェースと呼ばれます。 インタフェースは、任意の数の基本インタフェースから導出できます。このように複数の直 接基本インタフェースを使用する場合、複数継承 複数継承と呼ばれます。導出の順序は重要ではあり 複数継承 ません。 インタフェースは、導出されたインタフェースの直接基本インタフェースとしては 1 回しか 指定できません。しかし、間接基本インタフェースとしては複数回指定できます。次の例を 見てみましょう。 interface interface interface interface A { ... } B: A { ... } C: A { ... } D: B, C { ... } 図 18-1 に、これらのインタフェース間の関係を示します。このひし形は有効です。 IDL の構文とセマンティック 18-21 継承 図 18-1 有効な複数継承の例 A C B D 基本インタフェース要素の参照は明確に行う必要があります。使用する式が、複数の基本イ ンタフェース内の定数、型あるいは例外を参照する場合、基本インタフェース要素のリファ レンスは明確ではありません。 (現在は、同じ演算または属性名を持つ 2 つのインタフェー スから継承したり、導出されたインタフェースの演算または属性名を再定義することはでき ません。 )あいまい性は、インタフェース名を使用して名前を修飾することにより解決でき ます(たとえば <scoped_name> を使用します) 。 定数、型および例外へのリファレンスは、等価のグローバルな <scoped_name> を使用して 定義された場合、インタフェースにバインドされます。これにより、インタフェースが、導 出されたインタフェースの基本インタフェースになっている場合に、その構文や意味が変更 されないことが保証されます。 次の例を見てみましょう。 const long L = 3; interface A { void f (in float s[L]); }; // s has 3 floats interface B { const long L = 4; }; interface C: B, A {} // what is f()'s signature? インタフェース定義の早い段階で定数、型および例外をバインドすることにより、インタ フェース C の演算 f のシグネチャが次のようになることが保証されます。 void f(in float s[3]); これは、インタフェース A の場合と同様です。また、この規則により、導出されたインタ フェースの定数、型および例外の再定義が、基本インタフェースから継承した演算や属性に 影響を与えないようにします。 18-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 定数宣言 インタフェース継承により、継承ツリーの中にあるすべての識別子が現行の名前の有効範囲 にインポートされます。有効範囲内の型名、定数名、列挙値名または例外名は、現行の有効 範囲内で再定義できます。修飾せずにあいまいな名前を使用すると、コンパイル・エラーが 発生します。 演算名は、実行時にスタブおよび動的インタフェースで使用されます。このため、特定のオ ブジェクトに適用される可能性のある演算は、すべて一意の名前を持っている必要がありま す。この要件により、導出されたインタフェースの演算名の再定義、および同じ名前を持つ 2 つの演算の継承が禁止されます。 定数宣言 この項では、定数宣言の構文を説明します。 構文 定数宣言の構文は次のとおりです。 <const_dcl> ::= “const” <const_type> <identifier> “=” <const_exp> <const_type> ::= | | | | | <const_exp> ::= <or_expr> <or_expr> ::= <xor_expr> | <or_expr> “|” <xor_expr> <xor_expr> ::= <and_expr> | <xor_expr> “^” <and_expr> <and_expr> ::= <shift_expr> | <and_expr> “&” <shift_expr> <shift_expr> ::= <add_expr> | <shift_expr> “>>” <add_expr> | <shift_expr> “<<” <add_expr> <add_expr> ::= <mult_expr> | <add_expr> “+” <mult_expr> | <add_expr> “-” <mult_expr> <integer_type> <char_type> <boolean_type> <floating_pt_type> <string_type> <scoped_name> IDL の構文とセマンティック 18-23 定数宣言 <mult_expr> ::= | | | <unary_expr> ::= <unary_operator> <primary_expr> | <primary_expr> <unary_operator> ::= "-" | "+" | "~" <primary_expr> ::= | | <literal> ::= | | | | <boolean_literal> ::= | <unary_expr> <mult_expr> “*” <unary_expr> <mult_expr> “/” <unary_expr> <mult_expr> “%” <unary_expr> <scoped_name> <literal> “(” <const_exp> “)” <integer_literal> <string_literal> <character_literal> <floating_pt_literal> <boolean_literal> "TRUE" "FALSE" <positive_int_const>::= <const_exp> たとえば、次の例では、<const_type> ub4 の定数値、値 10 を持つ err_max の <identifier> を宣言します。 const ub4 err_max = 10; セマンティック <const_type> プロダクションの <scoped_name> は、<integer_type>、<char_type>、 <wide_char_type>、<boolean_type>、<floating_pt_type>、<fixed_pt_const_type>、 、 <string_type> または <wide_string_type> の、すでに定義済みの名前になっている必要があ ります。 <positive_int_const> では、正の整数定数まで求める必要があります。 "+"、"-" などの挿入 挿入演算子は、2 つの整数、浮動小数点または固定小数点を組み合せること 挿入 ができます。これらのタイプを混合して組み合せることはできません。挿入演算子は、整 数、浮動小数点および固定小数点型にしか適用できません。たとえば、4.0 と 3.125 の加算は できますが、4 と 3.125 は型が混在しているために加算できません。 18-24 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 定数宣言 定数データ型 定数はデータ型とともに宣言されます。宣言されたデータ型が定数値としては不適切な場合 があります。次の表に、一部のデータ型を、定数値としてより適切なデータ型に変換する方 法を示します。 定数に宣言されたデータ型 変換対象のデータ型 long または unsigned long unsigned long 負の定数に対しては signed long signed long long long または unsigned long long unsigned long long signed long long signed long long 浮動小数点定数に対しては double double 浮動小数点定数に対しては long double long double 固定小数点 10 進数定数式 固定小数点リテラルの全体の桁数と小数部の桁数は明確に決まっ ています。ただし、小数点の前にある重要でないゼロも含め、先頭と後尾のゼロは除外され ます。たとえば、0123.450d は fixed<5,2> とみなされ、3000.00 は fixed<1,3> とみなされま す。先頭の演算子は、精度に影響を与えません。先頭の + はオプションで、結果は変わりま せん。挿入表現 fixed<d1,s1> op fixed<d2,s2> の桁数の上限と結果のスケールを次の表に示 します。 演算子 結果 : fixed<d,s> + fixed<max(d1-s1,d2-s2) + max(s1,s2) + 1, max(s1,s2)> - fixed<max(d1-s1,d2-s2) + max(s1,s2) + 1, max(s1,s2)> * fixed<d1+d2,s1+s2> / fixed<(d1-s1+s2) + sinf,sinf> 単項演算子と 2 項演算子 次の表には、単項演算子と 2 項演算子が適用されるところを示します。 単項演算子 2 項演算子 適用可能な式 + – * / + – 浮動小数点式 + – ~ * / % + – << >> & | ^ 整数式 IDL の構文とセマンティック 18-25 定数宣言 ~ 単項演算子 "~" 単項演算子は、適用対象の式のビット補数を生成する必要があることを示 します。このような式の場合、値は 2 の補数です。このため、補数は次のように生成できま す。 整数定数式型 生成された 2 の補数 long long -(value+1) unsigned long unsigned long (2**32-1) - value long long long long -(value+1) unsigned long long unsigned long (2**64-1) - value %2 項演算子 "%"2 項演算子は、最初の式を 2 番目の式で除算したものの余りを生成します。 "%" の第 2 オペランドが 0 の場合、結果は未定義です。それ以外の場合は次のようになりま す。 (a/b)*b + a%b これは、a と等価です。両方のオペランドが負でない場合、余りも負ではありません。それ 以外の場合は、余りの符号はインプリメンテーションにより異なります。 ビット単位 2 項演算子 次の表には、ビット単位 2 項演算子の機能を説明します。 ビット単位 2 項演算子 機能 << 左側のオペランドの値を、右側のオペランドで指定されたビッ ト数だけ左に移動し、空いたビットを 0 で埋める必要があるこ とを示します。右側のオペランドは、0 <= 右側のオペランド < 64 の範囲に入っている必要があります。 >> 左側のオペランドの値を、右側のオペランドで指定されたビッ ト数だけ右に移動し、空いたビットを 0 で埋める必要があるこ とを示します。右側のオペランドは、0 <= 右側のオペランド < 64 の範囲に入っている必要があります。 & 左側と右側のオペランドの論理的な、ビット単位の AND を生 成する必要があることを示します。 | 左側と右側のオペランドの論理的な、ビット単位の OR を生成 する必要があることを示します。 ^ 左側と右側のオペランドの論理的な、ビット単位の XOR を生 成する必要があることを示します。 18-26 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 型宣言 型宣言 IDL には、データ型を命名するための構成体があります。つまり、識別子を型に関連付け る、C 言語のような宣言が用意されています。IDL では、名前をデータ型に関連付けるため に typedef キーワードを使用します。また、struct、union、enum および native 宣言を使 用して、名前をデータ型に関連付けることもできます。構文は次のとおりです。 <type_dcl> <type_declarator> ::= | | | | ::= “typedef” <type_declarator> <struct_type> <union_type> <enum_type> "native" <simple_declarator> <type_spec> <declarators> 型宣言を行うために、IDL では型を持った値を表す一連の型指定子を定義します。構文は次 のとおりです。 <type_spec> ::= | <simple_type_spec> ::= | | <base_type_spec> ::= | | | | | | <template_type_spec>::= | | | <constr_type_spec> ::= | | <simple_type_spec> <constr_type_spec> <base_type_spec> <template_type_spec> <scoped_name> <floating_pt_type> <integer_type> interface <char_type> <wide_char_type> <boolean_type> <octet_type> <any_type> <sequence_type> <string_type> <wide_string_type> <fixed_pt_type> <struct_type> <union_type> <enum_type> <declarators> ::= <declarator> { “,” <declarator> } * <declarator> ::= <simple_declarator> | <complex_declarator> <simple_declarator> ::= <identifier> <complex_declarator>::= <array_declarator> <simple_type_spec> の <scoped_name> には、すでに定義されている型を指定する必要がありま す。 IDL の構文とセマンティック 18-27 型宣言 前述のように、IDL 型指定子はスカラー・データ型と型コンストラクタで構成されていま す。IDL 型指定子を演算宣言の中で使用して、データ型を演算パラメータに割り当てること ができます。次の項で、基本型および構成体型の指定子について説明します。 基本データ型 基本型の構文は次のとおりです。 <floating_pt_type> ::= "float" | "double" | "long""double" <integer_type> ::= <signed_int> | <unsigned_int> <signed_int> ::= <signed_long_int> | <signed_longlong_int> | <signed_short_int> <signed_long_int> ::= "long" <signed_longlong_int> ::="long""long" <signed_short_int> ::= "short" <unsigned_int> ::= <unsigned_long_int> | <unsigned_longlong_int> | <unsigned_short_int> <unsigned_long_int> ::= "unsigned" "long" <unsigned_longlong_int> ::="unsigned""long""long" <unsigned_short_int>::= "unsigned" "short" <char_type> <wide_char_type> ::= "char" ::= "wchar" <boolean_type> ::= "boolean" <octet_type> ::= "octet" <any_type> ::= "any" それぞれの IDL データ型は、適切な言語マッピングによりネイティブなデータ型にマップさ れます。IDL データ型と、それにマップされているネイティブな型の間の変換エラーが、演 算実行時に発生することがあります。無効な値を変換しようとすると、実行メカニズム(ク ライアント・スタブ、動的実行エンジンおよびスケルトン)がクライアントに例外条件を発 行する場合があります。このような状況で発行される標準例外は、18-44 ページの「標準例 外」に定義されています。 18-28 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 型宣言 整数型 IDL は、short、 、unsigned short、 、long、 、unsigned long、 、long long および unsigned long long 整数データ型をサポートしています。 short 範囲は -215 .. 215 - 1 long 範囲は -231 .. 231 - 1 long long 範囲は -263 .. 263 - 1 unsigned short 範囲は 0 .. 216 - 1 unsigned long 範囲は 0 .. 232 - 1 unsigned long long 範囲は 0 .. 264 - 1 浮動小数点型 IDL 浮動小数点型は次のとおりです。 ■ float - IEEE 単一精度浮動小数点数を表します。 ■ double - IEEE 倍精度浮動小数点数を表します。 ■ long double - IEEE 倍精度拡張浮動小数点数(指数長は最低 15 ビット、符号付き小数部 は最低 64 ビット)を表します。 詳細な仕様は、バイナリ浮動小数点演算の IEEE 標準、ANSI/IEEE 標準 754-1985 を参照し てください。 char 型 IDL は、8 ビット長からなる char データ型を定義しています。これは次のいずれかに使用し ます。 1. バイト指向のコード・セットからシングルバイト文字をエンコードする。 2. 配列内で文字を使用する際に、マルチバイト・コード・セットからマルチバイト文字を エンコードする。 インプリメンテーションにおいて、文字データのエンコードには、内部的にどのようなコー ド・セットでも使用できます。ただし転送の際、別の形式への変換が必要な場合もありま す。 ISO Latin-1(8859.1)キャラクタ・セット規格では、使用できるすべての記号(表 18-1 から 表 18-3 に定義されているスペース文字、アルファベット文字、数字および記号など)の意味 と表記を定義しています。NULL および書式文字の意味と表記(表 18-4 を参照)は、ASCII (ISO 646)規格に定義されている文字の数値です。他のすべての文字の意味は、インプリメ ンテーションに依存します。 IDL の構文とセマンティック 18-29 型宣言 文字は、転送中に、特定の言語バインドに必要な別の該当する形式に変換される場合があり ます。このような変換により、文字の表記は変わることがありますが、文字の意味は変わり ません。たとえば、国際文字セットでは文字が該当する表記に変換されることがあります。 長文字型 IDL では、すべてのキャラクタ・セットから長文字をエンコードするための wchar データ型 を定義しています。インプリメンテーションにおいて、長文字のエンコードには、内部的に はどのような長いコード・セットでも使用できます。ただし転送の際、別の形式への変換が 必要な場合もあります。wchar のサイズは、インプリメンテーションによって異なります。 ブール型 boolean データ型は、値 TRUE と FALSE のいずれか一方しか受け入れないデータ項目を表 します。 octet 型 octet 型は 8 ビット長で、通信システムで送信されたときに変換されないことが保証されて います。 any 型 any 型では、どの IDL 型でも表現できる値の指定が可能です。 構成体型 構成体型は次のとおりです。 <constr_type_spec> ::= <struct_type> | <union_type> | <enum_type> IDL で再帰型の仕様を生成することは構文的には可能ですが、こうした再帰は意味的に制約 されています。再帰型仕様に認められている唯一の形式は、sequence テンプレート型を使 用するもののみです。 Oracle ORB IDL コンパイラでは、構造体の最上位レベルでの再帰しか認められていません。 たとえば、次は有効です。 struct foo { long value; sequence<foo> chain; }; しかし、次は無効です。 18-30 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 型宣言 struct foo { struct bar { sequence<foo> chain; } f1; }; また、配列やシーケンスのシーケンスなどの複合メンバー宣言に再帰シーケンスを記述する のも無効です。 struct foo { sequence<foo> f1; sequence<sequence<foo>> f2; sequence<foo> f3[5]; }; // OK // not supported // not supported sequence テンプレート型の詳細は、18-33 ページの「sequence」を参照してください。 構造体 構造体の構文は、次のとおりです。 <struct_type> ::= “struct” <identifier> “{” <member_list> “}” <member_list> ::= <member>+ <member> ::= <type_spec> <declarators> “;” <struct_type> の <identifier> は、新しい有効な型を定義します。また、構造体型は typedef 宣言を使用しても命名できます。 名前の有効範囲規則により、特定の構造体内のメンバー宣言子は一意であることが必要で す。struct の値は、そのすべてのメンバーの値です。 識別子付きの共用体 識別子付きの union の構文は、次のとおりです。 <union_type> ::= “union” <identifier> “switch” “(” <switch_type_spec> “)” “{” <switch_body> “}” <switch_type_spec> ::= <integer_type> | <char_type> | <boolean_type> | <enum_type> | <scoped_name> IDL の構文とセマンティック 18-31 型宣言 <switch_body> ::= <case>+ <case> ::= <case_label>+ <element_spec> “;” <case_label> ::= “case” <const_exp> “:” | "default" ":" <element_spec> ::= <type_spec> <declarator> IDL 共用体は、C の union と switch 文を合わせたようなものです。IDL の共用体は識別さ れる必要があります。つまり、現行のコールのインスタンスに使用する共用体メンバーを決 定するための、型を持ったタグ・フィールドを、共用体のヘッダーで指定する必要がありま す。union キーワードに続く <identifier> は、新しい有効な型を定義します。また共用体型 は、typedef 宣言を使用しても命名できます。<case_label> の <const_exp> は、 <switch_type_spec> と一貫性を持っている必要があります。デフォルトのケースは、1 回し か現れません。<switch_type_spec> プロダクションの <scoped_name> には、すでに定義さ れている integer、char、boolean または enum 型を指定する必要があります。 ケース・ラベルは、ディスクリミネータの定義済みの型に一致するか、または自動的にキャ ストできる必要があります。表 18-10 に、すべての一致規則を示します。 表 18-10 ケース・ラベルの一致 ディスクリミネータ型 一致対象 long long の値の範囲内のすべての整数値 long long long long の値の範囲内のすべての整数値 short short の値の範囲内のすべての整数値 unsigned long unsigned long の値の範囲内のすべての整数値 unsigned long long unsigned long long の値の範囲内のすべての整数値 unsigned short unsigned short の値の範囲内のすべての整数値 char char wchar wchar boolean TRUE または FALSE enum ディスクリミネータ enum 型のすべての列挙 名前の有効範囲規則により、特定の union の要素宣言子は一意であることが必要です。 <switch_type_spec> が <enum_type> の場合、列挙の識別子は union の有効範囲内にある ため、要素宣言子とは別になっている必要があります。 18-32 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 型宣言 union ディスクリミネータが使用可能なすべての値が <switch_body> にリストされる必要 はありません。union の値は、ディスクリミネータの値と、次のような組合せのうちで可能 な他の値です。 ■ ディスクリミネータの値が case 文に明示的にリストされている場合、union の値は、 ディスクリミネータの値と case 文に対応する要素の値です。 ■ デフォルトの case ラベルが指定されている場合、union の値は、ディスクリミネータの 値と、デフォルトの case ラベルに対応する要素の値です。 ■ union の値は、ディスクリミネータの値のみです。 ディスクリミネータおよび関連要素へのアクセスは、言語マップによって異なります。 列挙 列挙型は、順序付けられた識別子のリストで構成されます。構文は、次のとおりです。 <enum_type> <enumerator> ::= “enum” <identifier> “{” <enumerator> { “,” <enumerator> } * “}” ::= <identifier> 最大で 232 の識別子が列挙の中で指定できます。このため、列挙された名前は、列挙の最大 サイズを表現できるネイティブのデータ型にマップされる必要があります。列挙の仕様の中 で識別子が命名される順序が、識別子の相対的な順序を決定します。2 つの列挙が比較可能 な場合、または列挙の後続 / 先行機能を定義しているすべての言語マッピングの場合は、こ の順序関係に従う必要があります。enum キーワードに続く <identifier> で新しい有効な型 を定義します。また、列挙型は typedef 宣言を使用しても命名できます。 テンプレート型 テンプレート型は次のとおりです。 <template_type_spec>::= | | | <sequence_type> <string_type> <wide_string_type> <fixed_pt_type> sequence sequence は、最大サイズ(コンパイル時に固定される)と長さ(実行時に決定される)とい う 2 つの特徴を持った 1 次元配列です。 構文は、次のとおりです。 <sequence_type> ::= “sequence” “<” <simple_type_spec> “,” <positive_int_const> “>” | “sequence” “<” <simple_type_spec> “>” IDL の構文とセマンティック 18-33 型宣言 sequence 宣言の 2 番目のパラメータには、sequence の最大サイズを指定します。最大サイ ズに正の整数定数が指定された場合、その sequence は境界ありの sequence と呼ばれます。 境界ありの sequence を関数の引数として(または、構造体や共用体のフィールドとして) 渡す前に、sequence の長さを設定する必要があります。設定方法は言語マップによって異な ります。演算の実行から sequence の結果を受け取ると、返された sequence に長さが設定さ れています。この値の取得方法は言語マップによって異なります。 最大サイズが指定されていない場合、sequence のサイズは未指定です(境界なし) 。このよ うな sequence を関数の引数として(または、構造体や共用体のフィールドとして)渡す前 に、sequence の長さ、最大サイズおよび sequence を保持するバッファのアドレスを設定す る必要があります。設定方法は言語マップによって異なります。演算の実行からこのような sequence の結果を受け取ると、返された sequence に長さが設定されています。この値の取 得方法は言語マップによって異なります。 sequence 型は、別の sequence 型のタイプ・パラメータとして使用できます。たとえば、次 を見てください。 typedef sequence< sequence<long> > Fred; ここでは Fred の型を、"long の境界なしの sequence の、境界なしの sequence" と宣言して います。ネストされた sequence 宣言では、宣言を終了する 2 つの ">" トークンの間には、2 つのトークンが 1 つの ">>" トークンとして解析されることを防ぐために空白が必要です。 文字列 IDL では string 型を、NULL を除くすべての 8 ビット長で構成される文字列と定義していま す。string は、char の sequence の場合と似ています。すべての型のシーケンスと同様に、 文字列を関数の引数として(または、構造体や共用体のフィールドとして)渡す前に、文字 列長を設定する必要があります。設定方法は言語マップによって異なります。構文は、次の とおりです。 <string_type> ::= “string” “<” <positive_int_const> “>” | "string" string 宣言の引数は、文字列の最大サイズです。正の整数の最大サイズが指定されている場 合、その string は境界ありの string と呼ばれます。最大サイズが指定されていない場合、そ の string は境界なしの string と呼ばれます。 string は独立した型として別の扱いを受けます。これは多くの言語で、文字列処理用に独自 の組込み関数や標準ライブラリ関数があるためです。一般的な型の sequence を使用してで きることに比べ、別の string 型を設けることにより、文字列操作を実質的に最適化できま す。 長文字列型 wstring データ型は、NULL(長文字の NULL)で終了する wchar の sequence を示します。 wstring 型は、要素型が char でなく wchar である点を除いて、string と同じです。 18-34 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 型宣言 fixed 型 fixed データ型は、有効数字 31 桁までの固定小数点数を示します。通常スケール・ファクタ は、桁の総数以下の非負整数です。有効な負のスケールを持つ定数、たとえば 10000 などは 常に許可されます。ただし言語や環境によっては、負のスケールや桁数よりも大きいスケー ルを持つ型を扱える場合があります。 複合宣言子 配列 IDL では、多次元の固定サイズの配列を定義しています。配列には、各次元に対して明示的 なサイズが含まれます。 配列の構文は次のとおりです。 <array_declarator> ::= <identifier> <fixed_array_size>+ <fixed_array_size> ::= “[” <positive_int_const> “]” (各次元における)配列のサイズはコンパイル時に固定されます。演算の実行のパラメータ として配列が渡されるとき、配列のすべての要素が送信されます。 配列索引のインプリメンテーションは言語マッピングに固有のものです。配列索引をパラ メータとして渡すと、不適切な結果を生じることがあります。 native 型 IDL では、暗黙的な型定義のためにオブジェクト・アダプタが使用する宣言が用意されてい ます。この暗黙的な型の表記は、そのオブジェクト・アダプタの言語マッピングにより指定 されます。 構文は、次のとおりです。 <type_dcl> ::= "native" <simple_declarator> <simple_declarator> ::= <identifier> この宣言は、指定された名前を持つ新しい型を定義します。native 型は、IDL の基本型に似 ています。native 型に指定できる値は、値を作成したり操作する手段と同様、言語マッピン グによって異なります。native 型を定義するすべてのインタフェースは、native 型をプログ ラム言語にマップする方法を定義する、言語マッピングを必要とします。 native 型は、演算パラメータや結果を定義するために使用できます。ただし、この型の値 は、直接であろうと、作成された型のコンポーネントとしてであろうと、リモート実行の中 では許可されません。native 型の値をリモート実行で送信しようとすると、MARSHAL 標準 例外が発行される可能性があります。 IDL の構文とセマンティック 18-35 例外宣言 使用するプログラム言語の型名に関する通常のマッピング規則に従って、native 型を、各プ ログラム言語の該当する型の名前にマップすることをお薦めします。たとえば、仮に Object Adapter IDL モジュールでは次のようにします。 module HypotheticalObjectAdapter { native Servant; interface HOA { Object activate_object(in Servant x); }; }; IDL 型 Servant は、C++ の HypotheticalObjectAdapter::Servant にマップし、activaet_object 演算は次の C++ メンバー関数シグネチャにマップします。 CORBA::Object_ptr activate_object( HypotheticalObjectAdapter::Servant x); C++ 型の HypotheticalObjectAdapter::Servant の定義は、HypotheticalObjectAdapter モ ジュールの C++ マッピングの一部として提供されます。 native 型宣言は、オブジェクト・アダプタ・インタフェース用に特に用意されているもので す。このインタフェースは、オブジェクト・インプリメンテーション・インスタンスの具体 的な表現となる値を持つパラメータを必要とします。サービスまたはアプリケーション・イ ンタフェースでは使用しないことを強くお薦めします。native 型宣言を使用すると、オブ ジェクト・アダプタが、IDL 言語を変更せずに新しい基本型を定義できます。 例外宣言 exception 宣言を使用すると、リクエスト実行中に例外的な状況が発生したことを示すため に返される、構造体に似たデータ構造の宣言が可能になります。構文は次のとおりです。 <except_dcl> ::= “exception” <identifier> “{“ <member>* “}” 各例外は、IDL 識別子、exception 型識別子および対応する戻り値の型(宣言内の <member> で指定されている)によって特徴付けられます。リクエストの結果として例外が 返された場合、例外の識別子の値にプログラマがアクセスして、どの特定の例外状況が発生 したかを判断できます。 メンバーを使用して例外が宣言されている場合、プログラマは、例外状況が発生したときに そのメンバーの値にアクセスできます。メンバーが指定されていないと、例外状況が発生し ても追加情報にアクセスできません。 リクエストの実行時に発生する可能性がある標準的なランタイム・エラーについては、一連 の標準例外が定義されています。これらの標準例外は、18-44 ページの「標準例外」に記載 されています。 18-36 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 演算宣言 演算宣言 IDL における演算宣言は、C 関数宣言と同様のものです。構文は、次のとおりです。 <op_dcl> <op_type_spec> ::= [ <op_attribute> ] <op_type_spec> <identifier> <parameter_dcls> [ <raises_expr> ] [<context_expr> ] ::= <param_type_spec> | "void" 演算宣言は次のもので構成されます。 ■ 演算が実行されたときに通信システムが提供すべき実行方法を指定するための、オプ ションの演算属性。演算属性については、次の「演算属性」で説明します。 ■ 演算が返す結果の型。この型は、IDL で定義できるものならどれでも使用できます。結 果を返さない演算の場合、void 型を指定する必要があります。 ■ 定義されているインタフェースの有効範囲内にある演算を命名する識別子。 ■ 演算に対してゼロ以上のパラメータ宣言を指定するパラメータ・リスト。パラメータ宣 言は、18-38 ページの「パラメータ宣言」で説明されています。 ■ オプションの raises 式。これは、この演算の実行の結果としてどの例外が発行されるか を示します。Raises 式については、18-38 ページの「Raises 式」で説明しています。 ■ オプションの context 式。これは、演算をインプリメントするメソッドが参照するリク エスト・コンテキストの要素を示します。Context 式については、18-39 ページの 「Context 式」で説明しています。 一部のインプリメンテーションや言語マッピングでは、影響を受ける演算宣言の直前に、そ の演算固有のプラグマが必要になります。 演算属性 演算属性は、特定の演算実行時に、通信サービスが提供する必要のある実行方法を指定しま す。演算属性はオプションです。この仕様の構文は次のとおりです。 <op_attribute> ::= "oneway" クライアントが oneway 属性を指定して演算を実行すると、この実行方法は「可能な限り」 で行われることを意味します。これはコールの配信を保証しません。 「可能な限り」は、演 算が最大で 1 回実行されることを意味します。oneway 属性を持つ演算にはアウトプット・ パラメータを含めることができず、必ず void 戻り型を指定する必要があります。oneway 属性を使用して定義された演算には raises 式を含めることはできません。ただし、このよう な演算を実行すると標準例外が発行される場合があります。 <op_attribute> が指定されていない場合、例外状況が発生すると実行方法は「ほとんど 1 回」となり、演算実行が正しく返されると実行方法は「1 回のみ」となります。 IDL の構文とセマンティック 18-37 演算宣言 パラメータ宣言 IDL 演算宣言のパラメータ宣言の構文は次のとおりです。 <parameter_dcls> ::= “(” <param_dcl> { “,” <param_dcl> } * “)” | "(" ")" <param_dcl> ::= <param_attribute> <param_type_spec> <simple_declarator> <param_attribute> ::= "in" | "out" | "inout" <param_type_spec> ::= <base_type_spec> | <string_type> | <scoped_name> パラメータ宣言には、クライアントとサーバーの両方の通信サービスにパラメータを渡す方 向を知らせる方向属性が必要です。方向属性には次のものがあります。 ■ in ― パラメータはクライアントからサーバーに渡される ■ out ― パラメータはサーバーからクライアントに渡される ■ inout ― パラメータは両方向に渡される インプリメンテーションで in パラメータを変更しないようにしてください。変更すること 自体可能かどうかは言語マッピングに依存します。この場合の結果は未定義です。 実行の結果、例外状況が発生した場合、返された結果や out および inout パラメータの値は 未定義です。 境界のない string や sequence を inout パラメータとして渡すとき、戻り値を入力値より長 くすることはできません。 Raises 式 raises 式は、演算の実行の結果としてどの例外を発行できるかを指定します。この仕様の構 文は次のとおりです。 <raises_expr> ::= “raises” “(” <scoped_name> { “,” <scoped_name> } * “)” raises 式の中の <scoped_name> には、すでに定義済みの例外を指定する必要があります。 raises 式にリストされている演算固有の例外のみクライアントに返されます。クライアント に返され、raises 式にリストされていない演算固有の例外は、CORBA::UNKNOWN にマッ プされます。 18-38 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 属性宣言 raises 式に指定されている演算固有の例外以外に、ORB によって通知される一連の標準例外 があります。これらの標準例外は、18-44 ページの「標準例外」で説明されています。ただ し、標準例外は raises 式にリストされない場合もあります。 ある演算において raises 式が存在しないということは、演算固有の例外が存在しないことを 意味します。このような演算を実行した場合、やはり標準例外を受け取る可能性がありま す。 Context 式 context 式は、クライアントのコンテキストのどの要素が、オブジェクトによるリクエスト の実行に影響を与えるかを指定します。この仕様の構文は次のとおりです。 <context_expr> ::= “context” “(” <string_literal> { “,” <string_literal> } * “)” ランタイム・システムは、リクエストが送られたときに、オブジェクトのインプリメンテー ションで、クライアントのコンテキストの各 <string_literal> に対応する値が使用できるよ うにすることを保証します。ORB やオブジェクトは、リクエストの解決や実行中にこのリク エスト・コンテキストの情報を自由に使用できます。 context 式がないということは、この演算のリクエストに対応するリクエスト・コンテキス トが存在しないことを意味します。 各 string-literal は、アルファベット文字、数字、ピリオド(".")、アンダースコア("_")お よびアスタリスク("*")で構成される任意の長さのシーケンスです。文字列の先頭の文字は アルファベット文字にする必要があります。アスタリスクは文字列の最後の文字としてのみ 使用可能です。一部のインプリメンテーションでは、ピリオドを名前領域の分割に使用しま す。 属性宣言 インタフェースは属性と演算の両方を持つことが可能です。このような場合、属性はインタ フェースの一部として定義されます。attribute 定義は、論理的には、1 組の accessor 関数を 宣言するのと同じです。1 つは属性の値を取り出すためのもので、もう 1 つは属性の値を設 定するためのものです。 属性宣言の構文は次のとおりです。 <attr_dcl> ::= [ "readonly" ] "attribute" <param_type_spec> <simple_declarator> { “,” <simple_declarator> }* オプションの readonly キーワードは、accessor 関数が 1 つしかない(つまり値取得関数し かない)ことを示しています。次の例を見てみましょう。 interface foo { enum material_t {rubber, glass}; IDL の構文とセマンティック 18-39 CORBA モジュール struct position_t { float x, y; }; attribute float radius; attribute material_t material; readonly attribute position_t position; • • • }; この attribute 宣言は、次の擬似仕様の一部と同じです。 • • • float void material_t void _set position_t • • • _get_radius (); _set_radius (in float r); _get_material (); _material (in material_t m); _get_position (); 実際の accessor 関数名は言語マッピング固有のものです。Java マッピングについては 19-28 ページの「Java クライアントの CORBA 擬似オブジェクト API」で説明します。属性名は IDL の名前の有効範囲規則に従う必要があります。Accessor 関数名は、IDL で指定できる有 効な演算名と競合しないことが保証されています。 属性演算は、標準例外によってエラーを返します。 属性は継承されます。属性名は異なる型に再定義できません。再定義の制約やあいまい性の 取扱いに関する詳細は、18-40 ページの「CORBA モジュール」を参照してください。 CORBA モジュール CORBA 仕様内で定義された名前が、プログラム言語や他のソフトウェア・システム内の名 前と競合するのを防ぐため、CORBA によって定義された名前は、すべて CORBA と名付け られたモジュール内で定義されたかのように扱われます。ただし、IDL 仕様内では、Object などの IDL キーワードの前に CORBA:: という接頭辞を付けることはできません。 TypeCode などの他のインタフェース名は IDL キーワードではないため、IDL 仕様内では、 完全に有効範囲内にある名前(たとえば、CORBA::TypeCode)を使用して参照する必要が あります。 名前と有効範囲 IDL ファイル全体が名前の有効範囲を形成します。また、次の種類の定義はネストされた有 効範囲を形成します。 ■ モジュール ■ インタフェース 18-40 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 名前と有効範囲 ■ 構造体 ■ 共用体 ■ 演算 ■ 例外 次の種類の定義の識別子は有効範囲付きです。 ■ タイプ ■ 定数 ■ 列挙値 ■ 例外 ■ インタフェース ■ 属性 ■ 演算 識別子は、有効範囲内で 1 度しか定義できません。ただし、ネストされた有効範囲の中では 識別子を再定義できます。モジュールを宣言する識別子は、スコープに最初に現れたときに 定義されたとみなされます。同じスコープ内で続けてモジュールが宣言されると、モジュー ルが再オープンされ、定義が追加できるようになります。 将来、言語バインドに制限が課される可能性があるため、IDL 識別子には大文字・小文字の 区別があります。つまり、2 つの識別子で文字の違いが大文字・小文字のみのものは、それ ぞれもう一方の再定義とみなされます。しかし、定義に対するすべてのリファレンスでは、 定義されているオカレンスどおりに大文字・小文字を使用する必要があります。 (これによ り、大文字・小文字を区別する言語に自然にマップできるようになります。 ) 有効範囲内で定義された型名は、その有効範囲内ですぐに使用できます。特に、型定義のサ イクルについては 18-30 ページの「構成体型」を参照してください。 名前は、特定の有効範囲内で未修飾で使用できます。これは、含まれている有効範囲を続け て検索することにより解決されます。一度有効範囲内で未修飾の名前を使用すると、再定義 できません。たとえば、現行の有効範囲に含まれている有効範囲に定義されている名前を使 用すると、現行の有効範囲にその名前のバージョンを再定義できません。このように再定義 するとコンパイル・エラーが発生します。 修飾名(フォーム <scoped-name>::<identifier> の 1 つ)は、まず修飾子 <scoped-name> を有効範囲 S に解決し、次に <identifier> の定義を S 内に置くことにより解決されます。識 別子は直接 S 内で定義されるか、あるいは S がインタフェースの場合は S に継承される必要 があります。含まれている有効範囲では、<identifier> は検索されません。 修飾名が "::" で始まるとき、解決のプロセスは含まれている最小モジュールから始まり、前 の段落で説明した規則によって、修飾名の中の次の識別子を検索します。 IDL の構文とセマンティック 18-41 名前と有効範囲 ファイル内のすべての IDL 定義は、そのファイル内でグローバル名を持っています。定義の グローバル名は次のように構成されます。 IDL 仕様を含むファイルの走査を始める前は、現行ルートの名前はまず空("")になってお り、現行スコープの名前も空("")になっています。module キーワードが見つかると、文字 列 "::" および対応する識別子が現行ルートの名前に追加されます。そして module の終了を 検出すると、後続の "::" と識別子が現行ルートの名前から削除されます。interface、struct、 union または exception キーワードが検出されると、文字列 "::" および対応する識別子が現 行の有効範囲の名前に追加されます。そして interface、struct、union または exception の 終了が検出されると、後続の "::" と識別子が現行スコープの名前から削除されます。また、 演算宣言のパラメータが処理されると、名前のない新規の有効範囲が開始され、これにより パラメータ名が他の識別子を複製できるようになります。そしてパラメータ処理が完了する と、名前のない有効範囲は終了します。 IDL 定義のグローバル名は、現行ルート、現行スコープ、"::"、および定義のローカル名であ る <identifier> を連結したものです。 継承された名前 継承により、継承された識別子のシャドウ・コピーが作られます。たとえば継承により、導 出されたインタフェースに名前が取り入れられますが、これらの名前はもとの定義と意味的 に「同じ」であるとみなされます。同じオリジナルから作られた 2 つのシャドウ・コピーは (図 18-1 のひし形の場合に生じるように)、導出されたインタフェースに 1 つの名前しか作成 しないため、互いに競合しません。 継承により、継承された識別子に複数のグローバル IDL 名を作成します。次の例を見てみま しょう。 interface A { exception E { long L; }; void f() raises(E); }; interface B: A { void g() raises(E); }; 上の例では、例外はグローバル名 ::A::E および ::B::E から判断できます。 ネストされた名前の有効範囲のために、仕様があいまいになることがあります。たとえば、 次のようにします。 interface A { typedef string<128> string_t; }; 18-42 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 名前と有効範囲 interface B { typedef string<256> string_t; }; interface C: A, B { attribute string_t Title; /* AMBIGUOUS!!! */ }; あいまいな宣言を行うとコンパイル・エラーが発生します。 ネストされた型 IDL の文法では、struct や union を他の struct、union または exception 宣言の中で定義で きます。Oracle ORB の IDL コンパイラは、ネストされた型にぶつかると次の「書換え」規 則を適用します。 struct、union または exception 内で定義された型は、一番内側に含まれてい る interface または module の有効範囲に定義されているかのように扱われま す。interface または module の有効範囲が含まれていない場合、型は file ス コープで定義されます。ネストされた宣言は、中に含まれた型宣言より前に指 定されているかのように取り扱われます。 書換え規則を適用すると、宣言は次のようになります。 struct outer { struct inner { struct innermost { long num; } infield; } outfield; }; is equivalent to: struct innermost { long num; }; struct inner { innermost infield; }; struct outer { inner outfield; IDL の構文とセマンティック 18-43 標準例外 }; これが再帰型の場合にどのような意味を持つか注意してください。 struct foo { struct bar { sequence<foo> chain; } f1; }; 書き換え規則が適用されると、次のようになります。 struct bar { sequence<foo> chain; }; struct foo { bar f1; }; 結果として <bar> 宣言は無効となります。これは、<bar> の宣言時に <foo> が取り入れら れていないためです。このため、ネストされた型での再帰は禁止されます。 標準例外 この項では、ORB に定義されている標準例外について説明します。これらの例外識別子は、 インタフェース仕様に関係なく、演算実行の結果として返される可能性があります。標準例 外は raises 式にリストされない場合があります。 標準例外処理を複雑にしないためには、一連の標準例外は扱いやすい数にとどめる必要があ ります。この制約により、同様の例外を多数列挙するかわりに、同等の例外クラスを定義す ることが必要となります。たとえば、演算では、動的メモリーの割当てができないために、 様々な時点で実行できなくなる可能性があります。メモリー割当ての失敗により例外が発生 する様々なパターン(マーシャル中、アンマーシャル、クライアント内で、オブジェクトの インプリメンテーションで、ネットワーク・パケットの割り当て中など)にあわせていくつ かの異なる例外を列挙するかわりに、動的メモリー割当ての失敗に対応する例外が 1 つだけ 定義されます。各標準例外には、例外のサブ項目を指定するマイナー・コードが含まれてい ます。マイナー・コードへの値の割当ては、各 ORB インプリメンテーションが行います。 また、各標準例外には、次の値のいずれかを取る completion_status コードが含まれていま す。 ■ COMPLETED_YES ― オブジェクトのインプリメンテーションは、例外状況が発生す る前に処理を完了している 18-44 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 標準例外 ■ COMPLETED_NO ― オブジェクトのインプリメンテーションは、例外状況が発生する 前に一度も開始していない ■ COMPLETED_MAYBE ― インプリメンテーションの完了状況は不明 標準例外を次に定義します。クライアントには、このリストにはないシステム例外を処理で きるように準備しておくことが必要です。これは、将来この仕様に標準例外の定義が追加さ れる可能性があること、および ORB インプリメンテーションが非標準システム例外を発行 する可能性があるためです。 #define ex_body {unsigned long minor; completion_status completed;} enum completion_status {COMPLETED_YES, COMPLETED_NO, COMPLETED_MAYBE}; enum exception_type {NO_EXCEPTION, USER_EXCEPTION, SYSTEM_EXCEPTION}; exception UNKNOWN ex_body; // the unknown exception exception BAD_PARAM ex_body; // an invalid parameter was passed exception NO_MEMORY ex_body; // dynamic memory allocation failure exception IMP_LIMIT ex_body; // violated implementation limit exception COMM_FAILURE ex_body; // communication failure exception INV_OBJREF ex_body; // invalid object reference exception NO_PERMISSION ex_body; // no permission for attempted op. exception INTERNAL ex_body; // ORB internal error exception MARSHAL ex_body; // error marshalling param/result exception INITIALIZE ex_body; // ORB initialization failure exception NO_IMPLEMENT ex_body; // operation implementation unavailable exception BAD_TYPECODE ex_body; // bad typecode exception BAD_OPERATION ex_body; // invalid operation exception NO_RESOURCES ex_body; // insufficient resources for req. exception NO_RESPONSE ex_body; // response to req. not yet available exception PERSIST_STORE ex_body; // persistent storage failure exception BAD_INV_ORDER ex_body; // routine invocations out of order exception TRANSIENT ex_body; // transient failure - reissue request exception FREE_MEM ex_body; // cannot free memory exception INV_IDENT ex_body; // invalid identifier syntax exception INV_FLAG ex_body; // invalid flag was specified exception INTF_REPOS ex_body; // error accessing interface repository exception BAD_CONTEXT ex_body; // error processing context object exception OBJ_ADAPTER ex_body; // failure detected by object adapter exception DATA_CONVERSION ex_body; // data conversion error exception OBJECT_NOT_EXIST ex_body; // non-existent object; delete reference exception TRANSACTION_REQUIRED ex_body; // transaction required exception TRANSACTION_ROLLEDBACK ex_body; // transaction rolled back exception INVALID_TRANSACTION ex_body; // invalid transaction Object Non-Existence 例外の OBJECT_NOT_EXIST は、削除されたオブジェクトを実行しよ うとすると発行されます。これは、効力のある「ハードな」フォールト・レポートです。こ の例外を受け取ると、このオブジェクト・リファレンスのすべてのコピーを削除し、適切な 他の「最終的な回復」スタイルの処理を行うことが可能です(そのようにすることをお薦め します) 。 IDL の構文とセマンティック 18-45 標準例外 ブリッジはこの例外をクライアントに転送し、同時に保持しているレコード(リファレンス の変換に使用したプロキシ・オブジェクトなど)を破棄します。その後、クライアントは、 クライアントの任意のデータ構造をどれでもパージできます。 TRANSACTION_REQUIRED 例外は、リクエストのトランザクション・コンテキストが NULL で、アクティブなトランザクションが必要であることを示します。 TRANSACTION_ROLLEDBACK 例外は、リクエストに対応するトランザクションがすでに ロールバックされたか、あるいはロールバック対象として設定済みであることを示します。 このため、リクエストされた処理が実行できなかったか、あるいはトランザクションのかわ りにさらに処理を行っても結果が期待できないため実行しなかったことを示します。 INVALID_TRANSACTION 例外は、リクエストのトランザクション・コンテキストが無効 であることを示します。たとえば、リソースを登録しようとしたときにエラーが発生する と、無効なコンテキストが発生することがあります。 18-46 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 19 IDL から Java への言語マッピング この章には、ORB のリファレンスが含まれています。このリファレンスは次の内容で構成さ れています。 ■ IDL/Java 言語マッピングの使用 ■ Java クライアントの CORBA 擬似オブジェクト API IDL/Java 言語マッピングの使用 この項では、oasoidlc ツールで CORBA IDL ファイルを Java にマップする方法を説明しま す。IDL の構文については、OMG の CORBA 2.2 仕様書の第 3 章を参照してください。 ORB はすべての IDL 型をサポートしています。また、Oracle Application Server の ORB で はいくつかの拡張が定義されています。これは第 17 章「Java から CORBA オブジェクトへ のアクセス」で説明されており、19-39 ページの「ORB」にリストされています。 注意 : この項の情報は、OMG の CORBA 2.2 仕様書の第 24 章 「Mapping of OMG IDL to Java」からの抜粋です。OMG の仕様書とこの マニュアルの間でコードおよびマッピングの説明が類似している部分につ いては、そのコードおよび説明の著作権は Object Management Group に 帰属します。 oasoidlc コンパイラは、ユーザー定義の IDL ファイルから Java コードを生成します。この コンパイラは、この付録で説明されているように Java コードを生成します。oasoidlc コンパ イラの出力は、OMG IDL/Java 言語マッピング仕様に準拠しています。 IDL から Java への言語マッピング 19-1 IDL/Java 言語マッピングの使用 この付録では次の内容を説明します。 ■ IDL から Java へのマッピングの概要 ■ データ型マッピング 名前 列挙(enum)型 例外 予約語 構造体 IDL の Any 型 モジュール 共用体(union) 配列 基本データ型 Sequence Helper クラス Holder クラス インタフェース内でネスト された型 定数 インタフェース IDL から Java へのマッピングの概要 次の表に、IDL から Java へのマッピングの概要を示します。これらの各項目の詳細は、付 録の残りの部分で説明されています。 表 19-1 一般的な構成体 IDL Java モジュール パッケージ ユーザー例外 org.omg.CORBA.UserException を拡張する Java クラス システム例外 org.omg.CORBA.SystemException in パラメータ 標準 Java パラメータ out および inout パラメータ Java Holder クラス typecasting または narrow Java Helper クラス 属性 属性と同じ名前を持つ Java オーバーロード・アクセサおよび修飾 子メソッド 表 19-2 基本データ型 IDL Java const public static final field boolean、TRUE、FALSE boolean、true、false char、wchar char octet byte 19-2 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 表 19-2 基本データ型(続き) 基本データ型(続き) IDL Java string、wstring java.lang.String short、unsigned short short long、unsigned long int long long、unsigned long long long float float double double 表 19-3 構成体型 IDL Java interface interface sequence array array array struct フィールドの変数やコンストラクタも含め、struct 型と同じ名前 を持つ Java クラス enum enum 型と同じ名前を持つ Java クラス union union 型と同じ名前で、フィールドの get および set メソッドを持 つ Java クラス typedef Java には typedef はなし any org.omg.CORBA.Any 表 19-4 サーバー側マッピング IDL Java CORBA サーバー・ インプリメンテーション インプリメンテーション・クラスは、IDL が生成した <interface>ImplBase クラスを拡張します。 非 CORBA サーバー・ インプリメンテーション IDL コンパイラにより生成された、_tie_<interface> クラスを使用 します。 IDL から Java への言語マッピング 19-3 IDL/Java 言語マッピングの使用 名前 一般的に IDL の名前と識別子は、変更されずに Java の名前と識別子にマップされます。 マップされた Java コード内で名前が競合する場合は、マップされた名前の前にアンダース コア(_)を付けることにより、名前の競合が解決されます。 また、Java 言語の性質上、1 つの IDL 構成体が複数の(別の名前の)Java 構成体にマップさ れる場合があります。名前の追加は、説明用の接尾辞を付けることにより作成します。たと えば、IDL インタフェース foo は、Java インタフェース foo にマップされ、追加の Java ク ラスである fooHelper と fooHolder にマップされます。 こうした、追加の名前が他のマップされた IDL 名と競合するような特別な場合は、マップさ れた他の IDL 名に前述の解決規則が適用されます(つまり、必要な追加の名前を付けて、使 用する方が優先されます) 。 予約語 マッピングでは、独自の目的のためにいくつかの名前が確保されています。次のとおりで す。 ■ Java クラスの <type>Helper。<type> は IDL のユーザー定義型の名前です。 ■ Java クラスの <type>Holder。<type> は IDL 定義型の名前です(typedef 別名のような例 外が一部あります) 。 ■ Java クラスの <basicJavaType>Holder。<basicJavaType> は、IDL 基本データ型のうちの 1 つが使用する Java の基本データ型の 1 つです。 ■ ネストされる有効範囲の Java パッケージ名 <interface>Package。<interface> は IDL イン タフェースの名前です。 ■ Java 言語のキーワード。 abstract default if private throw boolean do implements protected throws break double import public transient byte else instanceof return try case extends int short void catch final interface static volatile char finally long super while class float native switch const for new synchronized continue goto package this 19-4 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 モジュール IDL モジュールは Java パッケージにマップされています。各 Java パッケージの名前は、そ れに対応する IDL モジュールの名前です。IDL モジュール内の型宣言は、生成されたパッ ケージ内の Java クラスやインタフェース宣言にマップされています。モジュールに含まれ ていない IDL 宣言は、Java のグローバルな有効範囲にマップされています。 IDL module finance { interface cash { ... }; }; Java package finance; public interface cash { ... } 基本データ型 次の表に、IDL の基本データ型の Java へのマッピングをまとめます。ミスマッチが生じる 場合もあるため、注意してください。ミスマッチが発生すると、標準の CORBA 例外が発生 する可能性があります。ミスマッチの可能性は、表の「説明」の列に説明があります。 表 19-5 IDL から Java への基本データ型のマッピング IDL データ型 Java データ型 説明 boolean boolean IDL のブール定数 TRUE と FALSE は、それぞれ Java のリテラル true と false にマップされま す。 char char IDL の文字は、キャラクタ・セットのエレメント を表す 8 ビット長です。Java の文字は、Unicode 文字を示す符号なしの 16 ビット長です。型の安全 性を確保するために、Java の CORBA ランタイム は、メソッドの実行中にパラメータのマーシャル が行われる際に、IDL から Java へのすべての char マッピングの範囲の有効性を確保します。 キャラクタ・セットによって定義された範囲外に char が存在する場合、 CORBA::DATA_CONVERSION 例外が発生します。 IDL から Java への言語マッピング 19-5 IDL/Java 言語マッピングの使用 表 19-5 IDL から Java への基本データ型のマッピング(続き) への基本データ型のマッピング(続き) IDL データ型 Java データ型 説明 wchar char char マッピングに関する前述の説明はここにも 該当します。 octet byte IDL の 8 ビット octet 型が、Java の byte 型に マップされます。 string java.lang.String IDL の string 型(境界ありおよび境界なし)は、 java.lang.String にマップされます。文字列 中の文字の範囲と境界のチェックは、マーシャル 時に行われます。文字の範囲違反があった場合、 CORBA::DATA_CONVERSION 例外が発生します。 境界違反の場合、 CORBA::MARSHAL 例外が発生 します。 wstring java.lang.String IDL の wstring 型(境界ありおよび境界なし) は、java.lang.String にマップされます。文 字列の境界のチェックは、マーシャル時に行われ ます。境界違反の場合、 CORBA::MARSHAL 例外 が発生します。 short short 定義どおりです。 unsigned short short 定義どおりです。 long int 定義どおりです。 unsigned long int 定義どおりです。 long long long 定義どおりです。 unsigned long long long 定義どおりです。 float float 定義どおりです。 double double 定義どおりです。 注意 : Java では、符号なしのデータ型はサポートされていません。した がって、符号なしの IDL データ型の大きな値が、確実に負の整数として正 しく処理されるようにする必要があります。 19-6 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 Holder クラス out および inout パラメータ受渡しモードをサポートするために、Holder クラスが提供され ています。これらは、org.omg.CORBA のすべての IDL の基本データ型に使用可能で、すべ ての名前付きユーザー定義型(typedef を除く)に対して生成されます。 Holder クラス名は、マップされた Java の名前に "Holder" を付けて作成されます。たとえ ば、ユーザー定義型の user_type は、user_typeHolder という Java の Holder クラスを 持っています。IDL の基本データ型では、Java の Holder クラス名の最初の文字が大文字に なる点に注意してください。つまり char は、Java に CharHolder という Holder クラスを 持っています。 次のリストでは、IDL の基本データ型の Holder クラスを示しています。これらのクラスは、 org.omg.CORBA パッケージに存在します。 Java package org.omg.CORBA; final public class ShortHolder { public short value; public ShortHolder() {} public ShortHolder(short initial) { value = initial; } } final public class IntHolder { public int value; public IntHolder() {} public IntHolder(int initial) { value = initial; } } final public class LongHolder { public long value; public LongHolder() {} public LongHolder(long initial) { value = initial; } } final public class ByteHolder { public byte value; public ByteHolder() {} public ByteHolder(byte initial) { value = initial; IDL から Java への言語マッピング 19-7 IDL/Java 言語マッピングの使用 } } final public class FloatHolder { public float value; public FloatHolder() {} public FloatHolder(float initial) { value = initial; } } final public class DoubleHolder { public double value; public DoubleHolder() {} public DoubleHolder(double initial) { value = initial; } } final public class CharHolder { public char value; public CharHolder() {} public CharHolder(char initial) { value = initial; } } final public class BooleanHolder { public boolean value; public BooleanHolder() {} public BooleanHolder(boolean initial) { value = initial; } } final public class StringHolder { public java.lang.String value; public StringHolder() {} public StringHolder(java.lang.String initial) { value = initial; } } final public class ObjectHolder { public org.omg.CORBA.Object value; public ObjectHolder() {} 19-8 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 public ObjectHolder(org.omg.CORBA.Object initial) { value = initial; } } final public class AnyHolder { public Any value; public AnyHolder() {} public AnyHolder(Any initial) { value = initial; } } final public class TypeCodeHolder { public TypeCode value; public typeCodeHolder() {} public TypeCodeHolder(TypeCode initial) { value = initial; } } final public class PrincipalHolder { public Principal value; public PrincipalHolder() {} public PrincipalHolder(Principal initial) { value = initial; } } 次に、ユーザー定義型 user_type の Holder クラスを示します。 Java final public class user_typeHolder implements org.omg.CORBA.portable.Streamable { public public public public public public } user_type value; user_typeHolder() {} user_typeHolder(user_type initial) {} void _read(org.omg.CORBA.portable.InputStream i) {...} void _write(org.omg.CORBA.portable.OutputStream o) {...} org.omg.CORBA.TypeCode _type() {...} IDL から Java への言語マッピング 19-9 IDL/Java 言語マッピングの使用 Helper クラス Holder クラスに加えて、各 IDL ユーザー定義型は Java の Helper クラスにマップされます。 Helper クラスの名前は type_nameHelper です(生成された Java のデータ型の名前には "Helper" が追加されます) 。いくつかの static メソッドが生成されます。これには、リポジ トリ ID と型コードを取得し、ストリームに型の読込みと書込みを行い、Any 型の挿入およ び抽出操作を行うためのメソッドが含まれます。 次に、ユーザー定義型 user_type の Java の Helper クラスを示します。 Java public class user_typeHelper { public static void insert(org.omg.CORBA.Any a, user_type t) {...} public static user_type extract(Any a) {...} public static org.omg.CORBA.TypeCode type() {...} public static String id() {...} public static user_type read(org.omg.CORBA.portable.InputStream istream) {...} public static void write(org.omg.CORBA.portable.OutputStream ostream, user_type value) {...} // only for interface helpers public static user_name narrow(org.omg.CORBA.Object obj); } マップされた IDL インタフェースの Helper クラスは、前述のような narrow() メソッドも 持っている点に注意してください。 Boolean IDL のブール定数の TRUE と FALSE は、対応する Java のブール・リテラルの true と false にマップされます。 文字型 IDL の文字は、キャラクタ・セットの要素を表す 8 ビット長ですが、Java の文字は、 Unicode 文字を示す符号なしの 16 ビット長です。型の安全性を確保するために Java の CORBA ランタイムは、メソッド実行中にパラメータのマーシャルが行われる際、IDL 文字 からマップされたすべての Java 文字の範囲の有効性を確保します。キャラクタ・セットに よって定義された範囲外に char が存在する場合、CORBA::DATA_CONVERSION 例外が発 生します。 IDL の wchar は、Java の基本データ型の char にマップされます。 Octet 8 ビット長の IDL の octet 型は、Java の byte 型にマップされます。 19-10 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 文字列型 IDL の string は java.lang.String にマップされます。これには、境界ありおよび境界なしの 文字列が含まれます。文字列中の文字の範囲と境界のチェックは、マーシャル時に行われま す。 文字範囲の違反があると、CORBA::DATA_CONVERSION 例外が発生します。境界違反の場 合、CORBA::MARSHAL 例外が発生します。 IDL の wstring は java.lang.String にマップされます。これには、境界ありおよび境界なしの 長文字列が含まれます。文字列の境界チェックは、マーシャル時に行われます。境界違反の 場合、CORBA::MARSHAL 例外が発生します。 整数型 整数型は次の表に示すようにマップされます。 IDL データ型 Java データ型 short short unsigned short short long int unsigned long int long long long unsigned long long long 例外 浮動小数点型 IDL の float および double は、Java 言語の float および double データ型にマップされます。 定数 定数は、IDL インタフェース内で定義された場合と、IDL インタフェース外で定義された場 合では、異なる方法でマップされます。 ■ IDL インタフェース内で宣言された定数は、対応する Java インタフェースで public static final フィールドにマップされます。 IDL から Java への言語マッピング 19-11 IDL/Java 言語マッピングの使用 IDL module finance { inteface cash { const double amount = 100.00 ... } } Java package finance; public interface cash { public static final double amount = (double) (100.00); } ■ IDL インタフェース外で宣言された定数は、public interface に定数と同じ名前で マップされます。この public interface には、定数の値を割り当てられた、value と呼ばれる public static field が含まれます。 IDL module finance { const double amount = 100.00 ... } Java package finance; public interface amount { public static final double value = (double) (100.00); } 列挙(enum 列挙(enum)型 enum)型 IDL の列挙型は Java の final class にマップされます。この final class はその列挙 型と同じ名前を持ち、次の内容を宣言します。 ■ value メソッド ■ 1 つのラベルにつき 2 つの static データ・メンバー ■ 整数変換メソッド ■ private コンストラクタ final class に加えて、IDL の列挙型の Holder クラスも生成されます。このクラスの名 前は、マップされた Java のクラス名に Holder を付けたものです。 19-12 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 IDL enum AccountData {a, b, c,}; Java public final class AccountData { public static final int _a = 0; public static final AccountData a = new AccountData(_a); public static final int _b = 1; public static final AccountData b = new AccountData(_b); public static final int _c = 2; public static final AccountData c = new AccountData(_c); // value methods public int value() {....} // integer conversion method to get enum with specified value public static AccountData from_int(int value) {...}; // constructor private AccountData(int) {...}; }; // holder class public class AccountDataHolder implements org.omg.CORBA.portable.Streamable { public AccountData value; public AccountDataHolder() {} public AccountDataHolder( AccountData initial) {...} public void _read(org.omg.CORBA.portable.InputStream i) {...} public void _write(org.omg.CORBA.portable.OutputStream o) {...} public org.omg.CORBA.TypeCode _type() {...} } 前述の例のように、マップされた各 IDL の enum ラベルの 2 つの static データ・メンバーの うちの 1 つは、先頭にアンダースコアが付いています。これらのメンバーは、switch 文に使 用します。 このメソッドは整数値を返します。値は、0 から始まって順番に割り当てられます。value というラベルがあっても、Java の value() メソッドとは競合しません。 IDL の列挙型に対する Java のクラスには、from_int() という追加のメソッドがあります。 このメソッドは、指定した値を使った enum 型を返します。 IDL から Java への言語マッピング 19-13 IDL/Java 言語マッピングの使用 構造体 IDL の構造体型は、同じ名前を持つ final class にマップされます。IDL メンバー内の フィールドは、インスタンス変数にマップされます。すべての値に対しコンストラクタが生 成され、後で指定するフィールドには NULL コンストラクタが生成されます。 各 IDL の構造体型の Holder クラスも、マップされた Java クラスの名前に Holder を付け た名前で生成されます。 IDL struct StructType { long field1; string field2; }; Java final public class StructType { // instance variables public int field1; public String field2; // constructors public StructType() {} public StructType(int field1, String field2) {...} } // holder class final public class StructTypeHolder implements org.omg.CORBA.portable.Streamable { public StructType value; public StructTypeHolder() {} public StructTypeHolder(StructType initial) {...} public void _read(org.omg.CORBA.portable.InputStream i) {...} public void _write(org.omg.CORBA.portable.OutputStream o) {...} public org.omg.CORBA.TypeCode _type() {...} } 19-14 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 共用体(union 共用体(union) union) IDL の共用体は、次のものを持つ同名の Java の final クラスにマップされます。 ■ デフォルトのコンストラクタ ■ discriminator() という名前の、ディスクリミネータ用のアクセサ方式 ■ 各ブランチ用のアクセサ方式 次に、共用体 UType が Java に変換される方法を示します。 // IDL union UType switch (EnumType) { case first: long win; case second: short place; case third: case fourth: octet show; default: boolean other; }; // generated Java final public class UType { // constructor public UType() {....} // discriminator accessor public <switch-type> discriminator() {....} // win public int win() {....} public void win(int value) {....} // place public short place() {....} public void place(short value) {....} // show public byte show() {....} public void show(byte value) {....} public void show(int discriminator, byte value){....} // other public boolean other() {....} public void other(boolean value) {....} } final public class UTypeHolder implements IDL から Java への言語マッピング 19-15 IDL/Java 言語マッピングの使用 org.omg.CORBA.portable.Streamable { public UType value; public UTypeHolder() {} public UTypeHolder(UType initial) {...} public void _read(org.omg.CORBA.portable.InputStream i) {...} public void _write(org.omg.CORBA.portable.OutputStream o) {...} public org.omg.CORBA.TypeCode _type() {...} } Sequence IDL の sequence 型は、同じ名前を持つ Java の配列型にマップされます。sequence 型が必要 な場合には、sequence エレメントのマップ済みの型の配列が使用されます。bounded sequence がパラメータとして IDL 操作にマーシャルされている場合、bounded sequence 上 で境界チェックが行われます。必要に応じて IDL CORBA::MARSHAL が実行されます。 sequence 型には Holder クラスも生成されます。このクラスの名前は、sequence のマップ後 の Java クラス名に Holder を付けたものです。 IDL typedef sequence< long > UnboundedData; typedef sequence< long, 42 > BoundedData; Java final public class UnboundedDataHolder implements org.omg.CORBA.portable.Streamable { public int[] value; public UnboundedDataHolder() {}; public UnboundedDataHolder(int[] initial) {...}; public void _read(org.omg.CORBA.portable.InputStream i) {...} public void _write(org.omg.CORBA.portable.OutputStream o) {...} public org.omg.CORBA.TypeCode _type() {...} } final public class BoundedDataHolder implements org.omg.CORBA.portable.Streamable { public int[] value; public BoundedDataHolder() {}; public BoundedDataHolder(int[] initial) {...}; public void _read(org.omg.CORBA.portable.InputStream i) {...} public void _write(org.omg.CORBA.portable.OutputStream o) {...} public org.omg.CORBA.TypeCode _type() {...} } 19-16 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 配列 IDL の配列型は、IDL の bounded sequence と同様にマップされます。配列型が必要な場合 には、マップされた配列エレメントの配列が使用されます。Java では、マップされた配列に 対して Java の演算子を利用することができます。 IDL 演算に配列が引数としてマーシャルされている場合、配列の境界がチェックされます。 境界違反の場合、CORBA::MARSHAL 例外が発生します。 配列の境界を IDL 定数で区切ることにより、Java でその配列の長さを使用できるようにな ります。これは、定数のルールに従ってマップされます。 配列型には Holder クラスも生成されます。このクラスの名前は、配列のマップ後の Java ク ラス名に Holder を付けたものです。 IDL const long ArrayBound = 42; typedef long larray[ArrayBound]; Java final public class larrayHolder implements org.omg.CORBA.portable.Streamable { public int[] value; public larrayHolder() {} public larrayHolder(int[] initial) {...} public void _read(org.omg.CORBA.portable.InputStream i) {...} public void _write(org.omg.CORBA.portable.OutputStream o) {...} public org.omg.CORBA.TypeCode _type() {...} } インタフェース IDL の interface 型は、同じ名前の Java の public interface にマップされます。この public interface は、 (マップされた)基本 org.omg.CORBA.Object インタフェース を拡張します。これには、マップされた演算シグネチャも含まれます。このインタフェース に対するオブジェクト・リファレンス上で、メソッドを実行できます。特殊な "nil" オブ ジェクト・リファレンスはありません。オブジェクト・リファレンスが使用可能なところで はどこでも、Java の null が自由に受け渡されます。 属性は、Java の accessor と modifier メソッドのペアにマップされます。これらのメソッド は IDL 属性と同じ名前を持ち、オーバーロードされます。IDL の読込み専用属性に対する modifier メソッドはありません。 "Helper" Java クラスも生成され、Helper という接尾辞が付いた IDL の interface 型と同じ 名前を持ちます。この Helper クラスには、org.omg.CORBA.Object を特定の型のオブ ジェクト・リファレンスに限定する、static の narrow メソッドが含まれます。narrow が失 敗すると、IDL 例外の CORBA::BAD_PARAM が発生します。 IDL から Java への言語マッピング 19-17 IDL/Java 言語マッピングの使用 IDL の interface 型の Holder クラスも生成されます。その名前は、interface のマップ後の Java クラス名に Holder を付けたものです。 注意 : IDL で表現されるインタフェースの継承は、Java のインタフェー ス階層に、直接反映されます。 IDL module Example { interface Face { long method (in long arg) raises (e); attribute long assignable; readonly attribute long nonassignable; } } Java package Example; public interface Face extends org.omg.CORBA.Object { int method(int arg) throws Example.e; int assignable(); void assignable(int i); int nonassignable(); } public class FaceHelper { // standard helper methods public static void insert(org.omg.CORBA.Any a, Face t) {...} public static Face extract (Any a) {...} public static org.omg.CORBA.TypeCode type() {...} public static String id() {...} public static Face read(org.omg.CORBA.portable.InputStream istream) {...} public static void write(org.omg.CORBA.portable.OutputStream ostream, Face value) {...} // interface specific narrow method public static Face narrow(org.omg.CORBA.Object obj) {...} } // holder class final public class FaceHolder implements org.omg.CORBA.portable.Streamable { public Face value; 19-18 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 public public public public public FaceHolder() {} FaceHolder(Face initial) {...} void _read(org.omg.CORBA.portable.InputStream i) {...} void _write(org.omg.CORBA.portable.OutputStream o) {...} org.omg.CORBA.TypeCode _type() {...} } パラメータの受渡しモード 値によるコール方式をインプリメントするパラメータの IDL は、通常の Java の実パラメー タにマップされます。IDL 演算の結果は、対応する Java メソッドの結果として返されます。 結果によるコールおよび値 / 結果によるコール方式をインプリメントする IDL の out および inout パラメータは、Java のパラメータ受渡しメカニズムに直接マップすることはできませ ん。このマッピングにより、すべての IDL 基本データ型とユーザー定義型に対し、追加の Holder クラスを定義します。これらの型は、Java にこれらのパラメータ・モードをインプ リメントするために使用します。クライアントは、各 IDL の out および inout パラメータに 受け渡される(値によって) 、適切な Java の Holder クラスのインスタンスを提供します。 Holder インスタンスのコンテンツ(インスタンス自体ではなく)は実行によって変更され、 実行がリターンした後で、クライアントは変更された(可能性のある)コンテンツを使用し ます。 IDL module Example { interface Modes { long operation(in long inArg, out long outArg, inout long inoutArg); }; }; Java package Example; public interface Modes { int operation(int inArg, IntHolder outArg, IntHolder inoutArg); } 前述のサンプル・コードでは、結果は通常の結果として返され、in パラメータのみが通常の 値として返されます。しかし、out および inout パラメータについては、適切なホルダーを 作成する必要があります。次に、その一般的な使用例を示します。 // user Java code // select a target object IDL から Java への言語マッピング 19-19 IDL/Java 言語マッピングの使用 Example.Modes target = ...; // get the in actual value int inArg = 57; // prepare to receive out IntHolder outHolder = new IntHolder(); // set up the in side of the inout IntHolder inoutHolder = new IntHolder(131); // make the invocation int result =target.operation(inArg, outHolder, inoutHolder); // use the value of the outHolder ... outHolder.value ... // use the value of the inoutHolder ... inoutHolder.value ... 実行前に、実パラメータになる Holder インスタンスに inout パラメータの入力値を設定す る必要があります。値から新しいホルダーを作成するか、あるいは適切な型の既存のホル ダーの値を割り当てることによって、inout ホルダーに値を入力できます 。実行後、クライ アントは outHolder.value を使用して out パラメータの値にアクセスし、inoutHolder.value を使用して inout パラメータの出力値にアクセスします。IDL 演算で返される結果は、実行 結果として使用可能です。 例外 IDL の例外は、例外のフィールドとコンストラクタ(struct 型と同様)のインスタンス変 数を持つ Java クラスにマップされます。IDL の例外は、ユーザー定義の例外またはシステ ム例外です。 システム例外は、java.lang.RuntimeException から間接的に継承された未チェックの 例外です。ユーザー定義の例外は、java.lang.Exception から間接的に継承された チェック済みの例外です。次の図に、2 つの例外タイプの継承関係を示します。 19-20 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 図 19-1 ユーザー定義の例外とシステム例外の関係 java.lang.Exception org.omg.CORBA.UserException userException1 java.lang.RuntimeException org.omg.CORBA.SystemException ユーザー定義の例外 ユーザー定義の例外は、org.omg.CORBA.UserException を拡張する Java の final class にマップされます。対応する Helper および Holder クラスが生成されます。 IDL module Example { exception exc1 {string reason;}; }; Java package Example; final public class exc1 extends org.omg.CORBA.UserException { // instance public String reason; // default constructor public exc1() {...} // constructor public exc1(String r) {...} } // helper class public class exc1Helper { public static void insert(org.omg.CORBA.Any a, exc1 t) {...} public static exc1 extract(Any, a) {...} public static org.omg.CORBA.TypeCode type() {...} public static String id() {...} public static exc1 read(org.omg.CORBA.portable.InputStream istream) {..} IDL から Java への言語マッピング 19-21 IDL/Java 言語マッピングの使用 public static void write(org.omg.CORBA.portable.OutputStream ostream, exc1 value) {...} } // holder class final public class exc1Holder implements org.omg.CORBA.portable.Streamable { public exc1 value; public exc1Holder() {} public exc1Holder(exc1 initial) {...} public void _read(org.omg.CORBA.portable.InputStream i) {...} public void _write(org.omg.CORBA.portable.OutputStream o) {...} public org.omg.CORBA.TypeCode _type() {...} } システム例外 標準の IDL システム例外は、org.omg.CORBA.SystemException を拡張する Java の final class にマップされます。IDL の主要な例外およびマイナーな例外のコードへのア クセスは、この final class によって提供されます。 org.omg.CORBA.SystemException には public コンストラクタはなく、それを拡張する クラスのインスタンスのみが生成されます。 次の表に、Java クラスに対する IDL 標準システム例外のマッピングを示します。 表 19-6 Java クラスにマップされる IDL の標準システム例外 IDL 例外 Java クラス名 CORBA::UNKOWN org.omg.CORBA.UNKNOWN CORBA::BAD_PARAM org.omg.CORBA.BAD_PARAM CORBA::NO_MEMORY org.omg.CORBA.NO_MEMORY CORBA::IMP_LIMIT org.omg.CORBA.IMP_LIMIT CORBA::COMM_FAILURE org.omg.CORBA.COMM_FAILURE CORBA::INV_OBJREF org.omg.CORBA.INV_OBJEF CORBA::NO_PERMISSION org.omg.CORBA.NO_PERMISSION CORBA::INTERNAL org.omg.CORBA.INTERNAL CORBA::MARSHAL org.omg.CORBA.MARSHAL CORBA::INITIALIZE org.omg.CORBA.INITIALIZE CORBA::NO_IMPLEMENT org.omg.CORBA.NO_IMPLEMENT CORBA::BAD_TYPECODE org.omg.CORBA.BAD_TYPECODE CORBA::BAD_OPERATION org.omg.CORBA.BAD_OPERATION 19-22 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 表 19-6 Java クラスにマップされる IDL の標準システム例外(続き) の標準システム例外(続き) IDL 例外 Java クラス名 CORBA::NO_RESOURCES org.omg.CORBA.NO_RESOURCES CORBA::NO_RESPONSE org.omg.CORBA.NO_RESPONSE CORBA::PERSIST_STORE org.omg.CORBA.PERSIST_STORE CORBA::BAD_INV_ORDER org.omg.CORBA.BAD_INV_ORDER CORBA::TRANSIENT org.omg.CORBA.TRANSIENT CORBA::FREE_MEM org.omg.CORBA.FREE_MEM CORBA::INV_IDENT org.omg.CORBA.INV_IDENT CORBA::INV_FLAG org.omg.CORBA.INV_FLAG CORBA::INTF_REPOS prg.omg.CORBA.INTF_REPOS CORBA::BAD_CONTEXT org.omg.CORBA.BAD_CONTEXT CORBA::OBJ_ADAPTER org.omg.CORBA.OBJ_ADAPTER CORBA::DATA_CONVERSION org.omg.CORBA.DATA_CONVERSION CORBA::OBJECT_NOT_EXIST org.omg.CORBA.OBJECT_NOT_EXIST CORBA::TRANSACTIONREQUIRED org.omg.CORBA.TRANSACTIONREQUIRED CORBA::TRANSACTIONROLLEDBACK org.omg.CORBA.TRANSACTIONROLLEDBACK CORBA::INVALIDTRANSACTION org.omg.CORBA.INVALIDTRANSACTION IDL の Any 型 IDL-to-Java コンパイラは、事前定義型のインスタンスの挿入および取出しを行うメソッド を含んだ Java クラス org.omg.CORBA.Any に、Any 型をマップします。各基本 IDL 型に 対して insert メソッドと extract メソッドが定義され、一方、基本型以外の IDL 型の一般的 な streamable に対して、ペアが定義されます。これらのメソッドは、スタブおよびスケルト ンが使用する高速インタフェースを提供します。これらのメソッドは Holder クラスを使用 する点に注意してください。また、指定された値を insert 処理で設定し、必要に応じて Any 型をリセットします。 IDL から Java への言語マッピング 19-23 IDL/Java 言語マッピングの使用 IDL module mod_a { interface int_a{ Any bogus(in any para_a); ... ... }; }; Java package org.omg.CORBA; abstract public class Any { abstract public boolean equal(org.omg.CORBA.Any para_a); abstract public org.omg.CORBA.Any extract_any() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_any(org.omg.CORBA.Any para_a); } プリミティブおよび非プリミティブな型に対する Java のリスト package org.omg.CORBA; abstract public class Any { abstract public boolean equal(org.omg.CORBA.Any a); // type code accessors abstract public org.omg.CORBA.TypeCode type(); abstract public void type(org.omg.CORBA.TypeCode t); // read and write values to/from streams // throw excep when typecode inconsistent with value abstract public void read_value( org.omg.CORBA.portable.InputStream is, org.omg.CORBA.TypeCode t) throws org.omg.CORBA.MARSHAL; abstract public void write_value(org.omg.CORBA.portable.OutputStream os); abstract public org.omg.CORBA.portable.OutputStream create_output_stream(); abstract public org.omg.CORBA.portable.InputStream create_input_stream(); // insert and extract each primitive type abstract public short extract_short() throws org.omg.CORBA.BAD_OPERATION; 19-24 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 abstract public void insert_short(short s); abstract public int extract_long() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_long(int i); abstract public long extract_longlong() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_longlong(long l); abstract public short extract_ushort() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_ushort(short s); abstract public int extract_ulong() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_ulong(int i); abstract public long extract_ulonglong() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_ulonglong(long l); abstract public float extract_float() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_float(float f); abstract public double extract_double() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_double(double d); abstract public boolean extract_boolean() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_boolean(boolean b); abstract public throws abstract public throws char extract_char() org.omg.CORBA.BAD_OPERATION; void insert_char(char c) org.omg.CORBA.DATA_CONVERSION; abstract public char extract_wchar() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_wchar(char c); abstract public byte extract_octet() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_octet(byte b); IDL から Java への言語マッピング 19-25 IDL/Java 言語マッピングの使用 abstract public org.omg.CORBA.Any extract_any() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_any(org.omg.CORBA.Any a); abstract public org.omg.CORBA.Object extract_Object() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_Object( org.omg.CORBA.Object o); // throw excep when typecode inconsistent with value abstract public void insert_Object( org.omg.CORBA.Object o, org.omg.CORBA.TypeCode t) throws org.omg.CORBA.MARSHAL; abstract public throws abstract public throws String extract_string() org.omg.CORBA.BAD_OPERATION; void insert_string(String s) org.omg.CORBA.DATA_CONVERSION, org.omg.CORBA.MAR-SHAL; abstract public throws abstract public throws String extract_wstring() org.omg.CORBA.BAD_OPERATION; void insert_wstring(String s) org.omg.CORBA.MARSHAL; // insert and extract typecode abstract public org.omg.CORBA.TypeCode extract_TypeCode() throws org.omg.CORBA.BAD_OPERATION; abstract public voidinsert_TypeCode( org.omg.CORBA.TypeCode t); // insert and extract Principal abstract public org.omg.CORBA.Principal extract_Principal() throws org.omg.CORBA.BAD_OPERATION; abstract public void insert_Principal( org.omg.CORBA.Principal p); // insert non-primitive IDL types abstract public void insert_Streamable( org.omg.CORBA.portable. Streamable s); } インタフェース内でネストされた型 interface 内で宣言された IDL 型は、マップ後のクラス宣言が入っている Java の特別な "scope" パッケージにマップされます。これは、IDL では interface で型宣言が可能であるの に対して、Java ではインタフェース内でクラスのネストができないためです。 19-26 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド IDL/Java 言語マッピングの使用 IDL module Example { interface Foo { exception e1 {}; }; }; Java package Example.FooPackage; final public class e1 extends org.omg.CORBA.UserException { ... } Typedef Java には typedef 構成体は存在しません。 単純な IDL 型 単純な Java 型にマップされた IDL 型は、Java ではサブクラスに分類されないことがありま す。このため、単純型に対する型宣言である typedef は、typedef 型が出現するたびにオリ ジナル(マップされた型)にマップされます。この規則が適用される IDL 型は、19-5 ページ の「基本データ型」に説明されています。 すべての typedef に対して Helper クラスが生成されます。 複合 IDL 型 配列やシーケンス以外に対する typedef は、単純な IDL 型またはユーザー定義の IDL 型 (typedef 以外の)が出現するまで、元の型にアンワインドされます。Holder クラスは、 シーケンスおよび配列の typedef に対してのみ生成されます。 // IDL struct EmpName { string firstName; string lastName; }; typedef EmpName EmpRec; // generated Java // regular struct mapping for EmpName // regular helper class mapping for EmpRec final public class EmpName { ... } public class EmpRecHelper { ... } IDL から Java への言語マッピング 19-27 Java クライアントの CORBA 擬似オブジェクト API Java クライアントの CORBA 擬似オブジェクト API Oracle Application Server は、CORBA の擬似オブジェクトへの Java マッピングを提供して います。それぞれの IDL 擬似オブジェクトごとに、Java の言語要素または擬似インタ フェースを使用してそのオブジェクトを表現します。擬似インタフェースの場合、他のクラ スまたはインタフェースから拡張や継承を行わない Java の public abstract class に マップされます。さらに、擬似インタフェースでは、Helper または Holder クラスは生成さ れず、インタフェース・リポジトリに存在しません。 注意 : この章の情報は、OMG の CORBA 2.2 仕様書の第 24 章 「Mapping of OMG IDL to Java」からの抜粋です。OMG の仕様書とこの マニュアルの間でコードおよびマッピングの説明が類似している部分につ いては、そのコードおよび説明の著作権は Object Management Group に 帰属します。 内容 この章では、次の CORBA 擬似オブジェクト・インタフェースの Java バインディングにつ いて説明します。 Environment Context TCKind 例外 ContextList TypeCode 例外リスト Request ORB 名前と値のペア ServerRequest Object (CORBA::Object) NV リスト 注意 : Oracle ORB では、ORB インタフェースにいくつかの拡張が追加 されています。これについては、19-28 ページの「Java クライアントの CORBA 擬似オブジェクト API」に説明されています。 この章に記載されている擬似オブジェクトはすべて、次のモジュール階層内で宣言されま す。 module org { module omg { module CORBA { ... } } } 19-28 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 例外 前述の宣言は、この章のすべての IDL リストに含まれています。したがって、マップ後の Java パッケージは org.omg.CORBA です。 Environment Environment 擬似オブジェクトは、リクエスト操作の間に例外情報にアクセスするために使 用されます。 Java package org.omg.CORBA; public abstract class Environment { void exception(java.lang.Exception except); java.lang.Exception exception(); void clear(); } 例外 Java への CORBA 擬似オブジェクト IDL マッピングは、Bounds、BadKind および InvalidName という、3 つの例外を使用します。これらは、通常のユーザー例外としてマッ プされ、そのための Holder および Helper クラスは生成されません。 例外は、使用するスコープ内で次のように定義されます。 例外 スコープ Bounds パッケージ - TypeCodePackage 擬似オブジェクト - NVList、ExceptionList、ContextList BadKind パッケージ - TypeCodePackage InvalidName パッケージ - ORBPackage 擬似オブジェクト - ORB Java package org.omg.CORBA; final public class Bounds extends org.omg.CORBA.UserException { public Bounds() {...} } package org.omg.CORBA.TypeCodePackage; IDL から Java への言語マッピング 19-29 例外リスト final public class Bounds extends org.omg.CORBA.UserException { public Bounds() {...} } final public class BadKind extends org.omg.CORBA.UserException { public BadKind() {...} } package org.omg.CORBA.ORBPackage; final public class InvalidName extends org.omg.CORBA.UserException { public InvalidName() {...} } 例外リスト 例外リスト(ExceptionList)は、IDL 操作によって発生する例外を記述するために、 CORBA の Dynamic Invocation Interface (DII) で使用されます。 IDL pseudo interface ExceptionList { readonly attribute unsigned long count; void add(in TypeCode exc); TypeCode item (in unsigned long index) raises (CORBA::Bounds); void remove (in unsigned long index) raises (CORBA::Bounds); }; Java package org.omg.CORBA; public abstract class ExceptionList { public abstract int count(); public abstract void add(TypeCode exc); public abstract TypeCode item(int index) throws org.omg.CORBA.Bounds; abstract void remove(int index) throws org.omg.CORBA.Bounds; } 19-30 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド public 名前と値のペア 名前と値のペア 名前と値のペアまたは NamedValue は、引数と戻り値を記述するために DII で使用されま す。名前と値のペアは、プロパティと値のペアをコンテキスト・ルーチンで渡すために使用 することもできます。 IDL typedef unsigned long Flags; typedef string Identifier; const Flags ARG_IN=1; const Flags ARG_OUT=2; const Flags ARG_INOUT=3; const Flags CTX_RESTRICT_SCOPE=15; pseudo interface NamedValue { readonly attribute Identifier name; readonly attribute any value; readonly attribute Flags flags; }; Java package org.omg.CORBA; public interface ARG_IN { public static final int value = } public interface ARG_OUT { public static final int value = } public interface ARG_INOUT { public static final int value = } public interface CTX_RESTRICT_SCOPE public static final int value = } public abstract class NamedValue { public abstract String name(); public abstract Any value(); public abstract int flags(); } 1; 2; 3; { 15; IDL から Java への言語マッピング 19-31 NV リスト NV リスト NVList は、引数を記述するために DII で使用されます。コンテキスト・ルーチンでは、コ ンテキストの値を記述するために使用されます。 IDL pseudo interface NVList { readonly attribute unsigned long count; NamedValue add(in Flags flags); NamedValue add_item(in Identifier item_name, in Flags flags); NamedValue add_value(in Identifier item_name, in any val, in Flags flags); NamedValue item(in unsigned long index) raises (CORBA::Bounds); void remove(in unsigned long index) raises (CORBA::Bounds); }; Java package org.omg.CORBA; public abstract class NVList { public abstract int count(); public abstract NamedValue add(int flags); public abstract NamedValue add_item(String item_name, int flags); public abstract NamedValue add_value(String item_name, Any val, int flags); public abstract NamedValue item(int index) throws org.omg.CORBA.Bounds; public abstract void remove(int index) throws org.omg.CORBA.Bounds; } Context Context 擬似オブジェクトは、DII でコンテキストを指定するために使用されます。このコ ンテキストにはコンテキスト文字列が含まれます。これは、リクエストの実行で送信される 前に解決される必要があります。 IDL pseudo interface Context { readonly attribute Identifier context_name; readonly attribute Context parent; Context create_child(in Identifier child_ctx_name); void set_one_value(in Identifier propname, in any propvalue); void set_values(in NVList values); void delete_values(in Identifier propname); NVList get_values(in Identifier start_scope, in Flags op_flags, in Identifier pattern); }; 19-32 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Request Java package org.omg.CORBA; public abstract class Context { public abstract String context_name(); public abstract Context parent(); public abstract Context create_child(String child_ctx_name); public abstract void set_one_value(String propname, Any propvalue); public abstract void set_values(NVList values); public abstract void delete_values(String propname); public abstract NVList get_values(String start_scpe, int op_flags, String pattern); } ContextList ContextList 擬似オブジェクトを使用して、コンテキスト文字列に項目を追加および削除で きます。 IDL pseudo interface ContextList { readonly attribute unsigned long count; void add(in string ctx); string item(in unsigned long index) raises (CORBA::Bounds); void remove(in unsigned long index) raises (CORBA::Bounds); }; Java package org.omg.CORBA; public abstract class ContextList { public abstract int count(); public abstract void add(String ctx); public abstract String item(int index) throws org.omg.CORBA.Bounds; public abstract void remove(int index) throws org.omg.CORBA.Bounds; } Request Request 擬似インタフェースは、Java の abstract クラスにマップします。クライアントから のリクエスト実行を行うメソッドが含まれます。 IDL pseudo interface Request { readonly attribute Object target; IDL から Java への言語マッピング 19-33 Request readonly attribute Identifier operation; readonly attribute NVList arguments; readonly attribute NamedValue result; readonly attribute Environment env; readonly attribute ExceptionList exceptions; readonly attribute ContextList contexts; attribute Context ctx; any add_in_arg(); any add_named_in_arg(in string name); any add_inout_arg(); any add_named_inout_arg(in string name); any add_out_arg(); any add_named_out_arg(in string name); void set_return_type(in TypeCode tc); any return_value(); void invoke(); void send_oneway(); void send_deferred(); void get_response(); boolean poll_response(); }; Java package org.omg.CORBA; public abstract class Request { public abstract Object target(); public abstract String operation(); public abstract NVList arguments(); public abstract NamedValue result(); public abstract Environment env(); public abstract ExceptionList exceptions(); public abstract ContextList contexts(); public abstract Context ctx(); public abstract void ctx(Context c); public abstract Any add_in_arg(); public abstract Any add_named_in_arg(String name); public abstract Any add_inout_arg(); public abstract Any add_named_inout_arg(String name); public abstract Any add_out_arg(); public abstract Any add_named_out_arg(String name); public abstract void set_return_type(TypeCode tc); public abstract Any return_value(); public abstract void invoke(); public abstract void send_oneway(); public abstract void send_deferred(); public abstract void get_response(); 19-34 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド TCKind public abstract boolean poll_response(); } ServerRequest IDL pseudo interface ServerRequest { Identifier op_name(); Context ctx(); void params(in NVList parms); void result(in Any res); void except(in Any ex); }; Java package org.omg.CORBA; public abstract class ServerRequest { public abstract String op_name(); public abstract Context ctx(); public abstract void params(NVList parms); public abstract void result(Any a); public abstract void except(Any a); } TCKind 列挙型の IDL TCKind 型は、次のように、Java の TCKind クラスにマップされます。 IDL enum TCKind { tk_null, tk_void, tk_short, tk_long, tk_ushort, tk_ulong, tk_float, tk_double, tk_boolean, tk_char, tk_octet, tk_any, tk_TypeCode, tk_Principal, tk_objref, tk_struct, tk_union, tk_enum, tk_string, tk_sequence, tk_array, tk_alias, tk_except, tk_longlong, tk_ulonglong, tk_longdouble, tk_wchar, tk_wstring, tk_fixed }; Java package org.omg.CORBA; public final class TCKind { public static final int _tk_null = 0; IDL から Java への言語マッピング 19-35 TCKind public static final TCKind tk_null = new TCKind(_tk_null); public static final int _tk_void = 1; TCKind tk_void = new TCKind(_tk_void); public static final int _tk_short = 2; TCKind tk_short = new TCKind(_tk_short); public static final int _tk_long = 3; TCKind tk_long = new TCKind(_tk_long); public static final int _tk_ushort = 4; TCKind tk_ushort = new TCKind(_tk_ushort); public static final int _tk_ulong = 5; TCKind tk_ulong = new TCKind(_tk_ulong); public static final int _tk_float = 6; TCKind tk_float = new TCKind(_tk_float); public static final int _tk_double = 7; TCKind tk_double = new TCKind(_tk_double); public static final int _tk_boolean = 8; TCKind tk_boolean = new TCKind(_tk_boolean); public static final int _tk_char = 9; TCKind tk_char = new TCKind(_tk_char); public static final int _tk_octet = 10; TCKind tk_octet = new TCKind(_tk_octet); public static final int _tk_any = 11; TCKind tk_any = new TCKind(_tk_any); public static final int _tk_TypeCode = 12; TCKind tk_TypeCode = new TCKind(_tk_TypeCode); public static final int _tk_Principal = 13; TCKind tk_Principal = new TCKind(_tk_Principal); public static final int _tk_objref = 14; TCKind tk_objref = new TCKind(_tk_objref); public static final int _tk_stuct = 15; TCKind tk_stuct = new TCKind(_tk_stuct); public static final int _tk_union = 16; TCKind tk_union = new TCKind(_tk_union); public static final int _tk_enum = 17; TCKind tk_enum = new TCKind(_tk_enum); public static final int _tk_string = 18; TCKind tk_string = new TCKind(_tk_string); public static final int _tk_sequence = 19; TCKind tk_sequence = new TCKind(_tk_sequence); public static final int _tk_array = 20; TCKind tk_array = new TCKind(_tk_array); public static final int _tk_alias = 21; TCKind tk_alias = new TCKind(_tk_alias); public static final int _tk_except = 22; TCKind tk_except = new TCKind(_tk_except); public static final int _tk_longlong = 23; 19-36 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド TypeCode TCKind tk_longlong = new TCKind(_tk_longlong); public static final int _tk_ulonglong = 24; TCKind tk_ulonglong = new TCKind(_tk_ulonglong); public static final int _tk_longdouble = 25; TCKind tk_longdouble = new TCKind(_tk_longdouble); public static final int _tk_wchar = 26; TCKind tk_wchar = new TCKind(_tk_wchar); public static final int _tk_wstring = 27; TCKind tk_wstring = new TCKind(_tk_wstring); public static final int _tk_fixed = 28; TCKind tk_fixed = new TCKind(_tk_fixed); public int value() {...} public static TCKind from_int(int value) {...} private TCKind(int value) {...} } TypeCode TypeCode は、複数の型にマップされます。 IDL pseudo interface TypeCode { exception Bounds {}; exception BadKind {}; // for all TypeCode kinds boolean equal(in TypeCode tc); TCKind kind(); // for objref, struct, union, enum, alias, and except RepositoryID id() raises (BadKind); RepositoryId name() raises (BadKind); // for struct, union, enum, and except unsigned long member_count() raises (BadKind); Identifier member_name(in unsigned long index) raises (BadKind, Bounds); // for struct, union, and except TypeCode member_type(in unsigned long index) raises (BadKind, Bounds); // for union any member_label(in unsigned long index) raises (BadKind, Bounds); TypeCode discriminator_type() raises (BadKind); long default_index() raises (BadKind); IDL から Java への言語マッピング 19-37 TypeCode // for string, sequence, and array unsigned long length() raises (BadKind); TypeCode content_type() raises (BadKind); } Java package org.omg.CORBA; public abstract class TypeCode { // for all TypeCode kinds public abstract boolean equal(TypeCode tc); public abstract TCKind kind(); // for objref, struct, union, enum, alias, and except public abstract String id() throws TypeCodePackage.BadKind; public abstract String name() throws TypeCodePackage.BadKind; // for struct, union, enum, and except public abstract int member_count() throws TypeCodePackage.BadKind; public abstract String member_name(int index) throws TypeCodePackage.BadKind; // for struct, union, and except public abstract TypeCode member_type(int index) throws TypeCodePackage.BadKind, TypeCodePackage.Bounds; // for union public abstract Any member_label(int index) throws TypeCodePackage.BadKind, TypeCodePackage.Bounds; public abstract TypeCode discriminator_type() throws TypeCodePackage.BadKind; public abstract int default_index() throws TypeCodePackage.BadKind; // for string, sequence, and array public abstract int length() throws TypeCodePackage.BadKind; public abstract TypeCode content_type() throws TypeCodePackage.BadKind; } 19-38 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB ORB ORB インタフェースには、CORBA オブジェクトを作成、登録、取得およびリストするため のメソッドが含まれています。次の ORB インタフェースのサブセットには、Java マッピン グが用意されています。Oracle ORB ではこのインタフェースにいくつかの拡張が追加され ます。これらは、19-42 ページの「ORB インタフェース・メソッドの説明」の他のメソッド の説明に含まれています。Oracle ORB の拡張に含まれるのは次のメソッドです。bind、run、 stop、shutdown、list_initial_services_remote および resolve_initial_references_remote。ま た、他のパラメータを使用できるように connect メソッドが拡張されました。 注意 : DII と DSI はこのリリースではサポートされていません。 ■ IDL ■ Java ■ ORB インタフェース・メソッドの説明 IDL pseudo interface ORB { exception InvalidName {}; typedef string ObjectId; typedef sequence<ObjectId> ObjectIdList; ObjectIdList list_initial_services(); Object resolve_initial_references(in ObjectId object_name) raises(InvalidName); string object_to_string(in Object obj); Object string_to_object(in string str); NVList create_list(in long count); NVList create_operation_list(in OperationDef oper); NamedValue create_named_value(in String name, in Any value, in Flags flags); ExceptionList create_exception_list(); ContextList create_context_list(); Context get_default_context(); Environment create_environment(); void send_multiple_requests_oneway(in RequestSeq req); void send_multiple_requests_deferred(in RequestSeq req); boolean poll_next_response(); Request get_next_response(); IDL から Java への言語マッピング 19-39 ORB // typecode creation TypeCode create_struct_tc (in RepositoryId id, in Identifier name, in StructMemberSeq members); TypeCode create_union_tc (in in in in RepositoryId id, Identifier name, TypeCode discriminator_type, UnionMemberSeq members); TypeCode create_enum_tc (in RepositoryId id, in Identifier name, in EnumMemberSeq members); TypeCode create_alias_tc (in RepositoryId id, in Identifier name, in TypeCode original_type); TypeCode create_exception_tc (in RepositoryId id, in Identifier name, in StructMemberSeq members); TypeCode create_interface_tc (in RepositoryId id, in Identifier name); TypeCode create_string_tc (in unsigned long bound); TypeCode create_wstring_tc (in unsigned long bound); TypeCode create_sequence_tc (in unsigned long bound, in TypeCode element_type); TypeCode create_recursive_sequence_tc(in unsigned long bound, in unsigned long offset); TypeCode create_array_tc (in unsigned long length, in TypeCode element_type); Current get_current(); // Additional operations for Java mapping TypeCode get_primitive_tc(in TCKind tcKind); Any create_any(); OutputStream create_output_stream(); void connect(Object obj); void disconnect(Object obj); 19-40 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB // // // // // // // // // // } additional methods for ORB initialization go here, but only appear in the mapped Java public static ORB init(Strings[] args, Properties props); public static ORB init(Applet app, Properties props); public static ORB init(); abstract protected void set_parameters(String[] args, java.util.Properties props); abstract protected void set_parameters(java.applet.Applet app, java.util.Properties props); Java package org.omg.CORBA; public abstract class ORB { public abstract String[] list_initial_services(); public abstract org.omg.CORBA.Object resolve_initial_references( String object_name) throws org.omg.CORBA.ORBPackage.InvalidName; public abstract String object_to_string(org.omg.CORBA.Object obj); public abstract org.omg.CORBA.Object string_to_object(String str); public abstract NVList create_list(int count); public abstract NVList create_operation_list(OperationDef oper); public abstract NamedValue create_named_value(String name, Any value, int flags); public public public public abstract abstract abstract abstract ExceptionList create_exception_list(); ContextList create_context_list(); Context get_default_context(); Environment create_environment(); public public public public abstract abstract abstract abstract void send_multiple_requests_oneway(Request[] req); void sent_multiple_requests_deferred(Request[] req); boolean poll_next_response(); Request get_next_response(); // typecode creation public abstract TypeCode create_struct_tc(String id, String name, StructMember[] members); public abstract TypeCode create_union_tc(String id, String name, TypeCode discriminator_type, UnionMember[] members); public abstract TypeCode create_enum_tc(String id, String name, EnumMember[] members); IDL から Java への言語マッピング 19-41 ORB public abstract TypeCode create_alias_tc(String id, String name, TypeCode original_type); public abstract TypeCode create_exception_tc(String id, String name, StructMember[] members); public abstract TypeCode create_interface_tc(String id, String name); public abstract TypeCode create_string_tc(int bound); public abstract TypeCode create_wstring_tc(int bound); public abstract TypeCode create_sequence_tc(int bound, TypeCode element_type); public abstract TypeCode create_recursive_sequence_tc(int bound, int offset); public abstract TypeCode create_array_tc(int length, TypeCode element_type); public abstract Current get_current(); // additional methods for IDL/Java mapping public abstract TypeCode get_primitive_tc(TCKind tcKind); public abstract Any create_any(); public abstract org.omg.CORBA.portable.OutputStream create_output_stream(); public abstract void connect(org.omg.CORBA.Object obj); public abstract void disconnect(org.omg.CORBA.Object obj); // additional static methods for ORB initialization public static ORB init(Strings[] args, Properties props); public static ORB init(Applet app, Properties props); public static ORB init(); abstract protected void set_parameters(String[] args, java.util.Properties props); abstract protected void set_parameters(java.applet.Applet app, java.util.Properties props); } 表 19-7 ORB インタフェース・メソッドの説明 メソッド 説明 ページ bind(String) bind メソッドは、指定されたインタフェース のオブジェクト・インスタンス(インプリメ ンテーション)のリファレンスを返します。 19-55 ページ bind(String, String) bind メソッドは、指定されたインタフェース のオブジェクト・インスタンス(インプリメ ンテーション)のリファレンスを返します。 19-56 ページ bind (String, String, String, int) bind メソッドは、指定されたインタフェース のオブジェクト・インスタンス(インプリメ ンテーション)のリファレンスを返します。 19-57 ページ connect(Object) ORB にオブジェクトのインプリメンテーショ ンを登録します。 19-47 ページ 19-42 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB 表 19-7 ORB インタフェース・メソッドの説明(続き) インタフェース・メソッドの説明(続き) メソッド 説明 ページ connect(Object, implname) ORB にオブジェクトのインプリメンテーショ ンを登録します。 19-48 ページ connect(Object, flag) ORB にオブジェクトのインプリメンテーショ ンを登録します。 19-48 ページ connect(Object, flag, implname) ORB にオブジェクトのインプリメンテーショ ンを登録します。 19-48 ページ create_alias_tc(String, String, TypeCode) リポジトリの識別子、構造体名および基本型 コードを使用して、別名型コードを作成しま す。 19-50 ページ create_any() CORBA::Any 基本データ型を作成します。 19-53 ページ create_array_tc(int, TypeCode) 最初の索引値と、残りの索引値と型を記述す るネストされた型コードを使用して、配列型 コードを作成します。 19-53 ページ create_enum_tc(String, String, String[]) リポジトリの識別子、enum 名および enum メンバーを使用して、列挙型コードを作成し ます。 19-50 ページ create_exception_tc(String, String, StructMember[]) リポジトリの識別子、例外名および例外メン 19-51 ページ バーを使用して、例外型コードを作成します。 create_interface_tc(String, String) リポジトリの識別子とインタフェース名を使 19-51 ページ 用して、オブジェクト型コードを作成します。 create_output_stream() IIOP 出力ストリームを作成します。 create_recursive_sequence_tc(int, int) エレメント数、型コードのバイトのオフセッ 19-52 ページ トおよび論理的ネスト・オフセットを使用し て、再帰的シーケンス型コードを作成します。 create_sequence_tc(int, TypeCode) シーケンス要素の数と型を使用して、シーケ ンス型コードを作成します。 19-52 ページ create_string_tc(int) 文字列の長さの範囲を使用して文字列型コー ドを作成します。 19-51 ページ create_struct_tc(String, String, StructMember[]) リポジトリの識別子、構造体名および構造体 メンバーを使用して、構造体型コードを作成 します。 19-49 ページ create_union_tc(String, String, TypeCode) UnionMember[]) リポジトリの識別子、共用体名、共用体ディ スクリミネータおよびすべての共用体メン バーを使用して、共用体型コードを作成しま す。 19-49 ページ 19-54 ページ IDL から Java への言語マッピング 19-43 ORB 表 19-7 ORB インタフェース・メソッドの説明(続き) インタフェース・メソッドの説明(続き) メソッド 説明 ページ create_wstring_tc(int) 文字列の長さの範囲を使用して、長文字列型 コードを作成します。 19-52 ページ disconnect(Object) disconnect メソッドは、オブジェクト・イン スタンスを非アクティブにし、登録を解除し ます。 19-49 ページ get_primitive_tc(TCKind) 基本型の種類表記を使用して、基本データ型 コードを作成します。 19-53 ページ init() init メソッドは、プロセスの ORB ランタイム を初期化し、アクティブな ORB オブジェク ト・リファレンスを取得するために使用しま す。 19-54 ページ init(Applet, Properties) init メソッドは、プロセスの ORB ランタイム を初期化し、アクティブな ORB オブジェク ト・リファレンスを取得するために使用しま す。 19-54 ページ init(String[], Properties) init メソッドは、プロセスの ORB ランタイム を初期化し、アクティブな ORB オブジェク ト・リファレンスを取得するために使用しま す。 19-55 ページ list_initial_services() list_initial_services メソッドを使用して、使用 19-45 ページ 可能なリファレンスのリストを取得できます。 そして resolve_initial_references がコールさ れ、以前取得したリストから必要なリファレ ンスを取得します。 list_initial_services_remote(String[]) list_initial_services_remote を使用して、リ モート・サイトから使用可能なリファレンス のリストを取得できます。 19-46 ページ object_to_string(Object) オブジェクト・リファレンスを文字列に変換 し、オブジェクト・リファレンスを永続的な 記憶域に書き出せるようにします。 19-47 ページ resolve_initial_references(String) resolve_initial_references メソッドを使用し て、ネーム・サービスの初期オブジェクト・ リファレンスを取得できます。 19-45 ページ resolve_initial_references_remote(String, String[]) resolve_initial_references_remote メソッドを 使用して、リモート・サイトからネーム・ サービスの初期オブジェクト・リファレンス を取得できます。 19-46 ページ 19-44 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB 表 19-7 ORB インタフェース・メソッドの説明(続き) インタフェース・メソッドの説明(続き) メソッド 説明 ページ run() run メソッドにより、登録されたインプリメ ンテーションは、すべて受信したリクエスト を処理できるようになります。 19-58 ページ shutdown() shutdown メソッドは、この処理の ORB ラン タイムを終了します。 19-58 ページ stop() stop メソッドは、ORB ランタイムのリクエス 19-58 ページ ト処理を停止します。 string_to_object(String) 文字列をオブジェクト・リファレンスに変換 します。 19-47 ページ list_initial_services public abstract String[] list_initial_services() list_initial_services メソッドを使用して、使用可能なリファレンスのリストを取得できます。 そして resolve_initial_references がコールされ、以前取得したリストから必要なリファレン スを取得します。list_initial_services メソッドは、使用可能な初期リファレンスをすべてリ ストします。初期リファレンスは、初期ブートストラップ・サービスへのオブジェクト・リ ファレンスを取得するためのものです。現在 resolve_initial_references から取得できるのは、 ネーム・サービスの初期オブジェクト・リファレンスのみです。ネーム・サービスのオブ ジェクト・リファレンスの型は CORBA::NamingContext です。 戻り値 初期リファレンス名の出力リスト。 ■ resolve_initial_references public abstract Object resolve_initial_references(String object_name) throws InvalidName resolve_initial_references メソッドを使用して、ネーム・サービスの初期オブジェクト・リ ファレンスを取得できます。 パラメータ modlist ― ネーム・サーバーの名前 : NameService ■ 戻り値 ネーム・サーバーの初期オブジェクト・リファレンス、あるいはサービスが使用できな ■ い場合には NULL オブジェクト・リファレンス。 IDL から Java への言語マッピング 19-45 ORB Throws: InvalidName object_name が無効な場合に返されます。 ■ list_initial_services_remote public abstract String[] list_initial_services_remote(String modlist[]) list_initial_services_remote を使用して、リモート・サイトから使用可能なリファレンスのリ ストを取得できます。resolve_initial_references_remote がコールされ、取得したリストから 必要なリファレンスを取得します。list_initial_services_remote メソッドは、使用可能な初期 リファレンスをすべてリストします。 初期リファレンスは、初期ブートストラップ・サービスへのオブジェクト・リファレンスを 取得するためのものです。現在、resolve_initial_references_remote から取得できるのは、 ネーム・サービスの初期オブジェクト・リファレンスのみです。ネーム・サービスのオブ ジェクト・リファレンスの型は CORBA::NamingContext です。 パラメータ modlist ― 次の形式の文字列で指定されたリモート・サイト : ■ "iiop://" 戻り値 初期リファレンス名の出力リスト。 ■ resolve_initial_references_remote public abstract Object resolve_initial_references_remote(String object_name, String modlist[]) throws InvalidName resolve_initial_references_remote メソッドを使用して、リモート・サイトからネーム・サー ビスの初期オブジェクト・リファレンスを取得できます。 パラメータ object_name ― ネーム・サーバーの名前 : NameService ■ ■ modlist ― 次の形式の文字列で指定されたリモート・サイト :"iiop://" 戻り値 ネーム・サーバーの初期オブジェクト・リファレンス、あるいはサービスが使用できな ■ い場合には NULL オブジェクト・リファレンス。 Throws: InvalidName object_name が無効な場合に返されます。 ■ 19-46 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB object_to_string public abstract String object_to_string(Object obj) オブジェクト・リファレンスを文字列に変換し、オブジェクト・リファレンスを永続的な記 憶域に書き出せるようにします。string_to_object メソッドは、その文字列を再びオブジェク ト・リファレンスに変換します。 パラメータ obj ― 文字列に変換するオブジェクト・リファレンス ■ 戻り値 指定されたオブジェクト・リファレンスの文字列。 ■ string_to_object public abstract Object string_to_object(String str) 文字列をオブジェクト・リファレンスに変換します。文字列は、object_to_string メソッドを 使用して作成する必要があります。 パラメータ str ― 文字列化されたオブジェクト・リファレンス。特に object_to_string メソッドを使 ■ 用して作成されたもの。 戻り値 文字列をオブジェクト・リファレンスに変換した結果。 ■ connect public abstract void connect(Object obj) ORB にオブジェクトのインプリメンテーションを登録します。一度登録されると、ORB は、 クライアントから要求されたときにオブジェクト・インスタンスを探すことができます。オ ブジェクトの状態は、デフォルトでは一時的に状態を保持するようになっています。 パラメータ obj ― インプリメンテーション用のオブジェクト・インスタンス ■ IDL から Java への言語マッピング 19-47 ORB connect public abstract void connect(Object obj, String implname) ORB にオブジェクトのインプリメンテーションを登録します。一度登録されると、ORB は、 クライアントから要求されたときにオブジェクト・インスタンスを探すことができます。 パラメータ obj ― インプリメンテーション用のオブジェクト・インスタンス ■ ■ implname ― インプリメンテーションの名前。この名前は、ORB::bind メソッドがこの オブジェクトの取出しを指定するために使用されます。 connect public abstract void connect(Object obj, int flag) ORB にオブジェクトのインプリメンテーションを登録します。一度登録されると、ORB は、 クライアントから要求されたときにオブジェクト・インスタンスを探すことができます。 パラメータ obj ― インプリメンテーション用のオブジェクト・インスタンス ■ ■ flag ― オブジェクトの状態を OBJECT_STATELESS または OBJECT_TRANSIENT で指定 connect public abstract void connect(Object obj, int flag, String implname) ORB にオブジェクトのインプリメンテーションを登録します。一度登録されると、ORB は、 クライアントから要求されたときにオブジェクト・インスタンスを探すことができます。 パラメータ obj ― インプリメンテーション用のオブジェクト・インスタンス ■ ■ flag ― オブジェクトの状態を OBJECT_STATELESS または OBJECT_TRANSIENT で指定 ■ implname ― インプリメンテーションの名前。この名前は、ORB::bind メソッドがこの オブジェクトの取出しを指定するために使用されます。 19-48 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB disconnect public abstract void disconnect(Object obj) disconnect メソッドは、オブジェクト・インスタンスを非アクティブにし、登録を解除しま す。このメソッドはオブジェクトを非アクティブにし、オブジェクト・リファレンスを解放 して、オブジェクトのインプリメンテーションの ORB への登録を解除します。 パラメータ obj ― インプリメンテーション用のオブジェクト・インスタンス ■ create_struct_tc public abstract TypeCode create_struct_tc(String id, String name, StructMember members[]) リポジトリの識別子、構造体名および構造体メンバーを使用して、構造体型コードを作成し ます。 パラメータ id ― リポジトリの識別子 ■ ■ name ― 構造体名 ■ members ― 各構造体メンバーの名前と型コードを含む、メンバーのシーケンス 戻り値 入力パラメータで記述されているとおりの構造体型コードを返します。 ■ create_union_tc public abstract Typecode create_union_tc(String id, String name, TypeCode discriminator_type, UnionMember members[]) リポジトリの識別子、共用体名、共用体ディスクリミネータおよびすべての共用体メンバー を使用して、共用体型コードを作成します。 パラメータ id ― リポジトリの識別子 ■ ■ name ― 共用体名 IDL から Java への言語マッピング 19-49 ORB ■ members ― 各共用体メンバーの名前、型コードおよびラベルを含む、メンバーのシー ケンス。デフォルトのラベルは、octet 型で 0(ゼロ)の値で指定してください。 戻り値 入力パラメータで記述されているとおりの共用体型コードを返します。 ■ create_enum_tc public abstract TypeCode create_enum_tc(String id, String name, String members[]) リポジトリの識別子、enum 名および enum メンバーを使用して、列挙型コードを作成しま す。 パラメータ id ― リポジトリの識別子 ■ ■ name ― 共用体名 ■ members ― メンバーのシーケンス 戻り値 入力パラメータで記述されているとおりの列挙型コードを返します。 ■ create_alias_tc public abstract TypeCode create_alias_tc(String id, String name, TypeCode original_type) リポジトリの識別子、構造体名および基本型コードを使用して、別名型コードを作成しま す。 パラメータ id ― リポジトリの識別子 ■ ■ name ― 別名の名前 ■ original_type ― 別名のベースとなる型コード 戻り値 入力パラメータで記述されているとおりの別名型コードを返します。 ■ 19-50 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB create_exception_tc public abstract TypeCode create_exception_tc(String id, String name, StructMember members[]) リポジトリの識別子、例外名および例外メンバーを使用して、例外型コードを作成します。 パラメータ id ― リポジトリの識別子 ■ ■ name ― 例外名 ■ members ― 各例外メンバーの名前と型コードを含む、メンバーのシーケンス。 戻り値 入力パラメータで記述されているとおりの例外型コードを返します。 ■ create_interface_tc public abstract TypeCode create_interface_tc(String id, String name) リポジトリの識別子とインタフェース名を使用して、オブジェクト型コードを作成します。 パラメータ id ― リポジトリの識別子 ■ ■ name ― インタフェース名 戻り値 入力パラメータで記述されているとおりのオブジェクト型コードを返します。 ■ create_string_tc public abstract TypeCode create_string_tc(int bound) 文字列の長さの範囲を使用して文字列型コードを作成します。 パラメータ bound ― 文字列の長さ。0(ゼロ)の場合、文字列には境界がありません。 ■ 戻り値 入力パラメータで記述されているとおりの文字列型コードを返します。 ■ IDL から Java への言語マッピング 19-51 ORB create_wstring_tc public abstract TypeCode create_wstring_tc(int bound) 文字列の長さの範囲を使用して、長文字列型コードを作成します。 パラメータ bound ― 文字列の長さ。0(ゼロ)の場合、文字列には境界がありません。 ■ 戻り値 入力パラメータで記述されているとおりの長文字列型コードを返します。 ■ create_sequence_tc public abstract TypeCode create_sequence_tc(int bound, TypeCode element_type) シーケンス要素の数と型を使用して、シーケンス型コードを作成します。 パラメータ bound ― シーケンスの要素数 ■ ■ element_type ― シーケンスの要素の型 戻り値 入力パラメータで記述されているとおりのシーケンス型コードを返します。 ■ create_recursive_sequence_tc public abstract TypeCode create_recursive_sequence_tc(int bound, int offset) エレメント数、型コードのバイトのオフセットおよび論理的ネスト・オフセットを使用し て、再帰的シーケンス型コードを作成します。 パラメータ bound ― シーケンスの要素数 ■ ■ offset ― 囲まれた型コードのオフセット(バイト) 戻り値 入力パラメータで記述されているとおりの再帰的シーケンス型コードを返します。 ■ 19-52 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB create_array_tc public abstract TypeCode create_array_tc(int length, TypeCode element_type) 最初の索引値と、残りの索引値と型を記述するネストされた型コードを使用して、配列型 コードを作成します。 パラメータ length ― 最初の索引値 ■ ■ element_type ― ネストされた最初の型コード 戻り値 入力パラメータで記述されているとおりの配列型コードを返します。 ■ get_primitive_tc public abstract TypeCode get_primitive_tc (TCKind tcKind) 基本型の種類表記を使用して、基本データ型コードを作成します。 パラメータ tcKind ― org.omg.CORBA.TCKind クラスに定義されている static 整数定数のうち 1 つを ■ 指定 戻り値 入力パラメータで記述されているとおりの基本データ型コードを返します。 ■ create_any public abstract Any create_any() CORBA::Any 基本データ型を作成します。CORBA::any データ型により、どのようなデータ 型でも定義できます。 戻り値 CORBA::Any データ型を返します。 ■ IDL から Java への言語マッピング 19-53 ORB create_output_stream public abstract OutputStream create_output_stream() IIOP 出力ストリームを作成します。 戻り値 ストリームから、IIOP バッファを構成しているバイトの配列を抽出できます。 ■ init public static synchronized ORB init(String args[], Properties props) init メソッドは、プロセスの ORB ランタイムを初期化し、アクティブな ORB オブジェク ト・リファレンスを取得するために使用します。そのプロセスで ORB ランタイムがすでに アクティブになっている場合、init メソッドは、アクティブな ORB オブジェクト・リファレ ンスを返します。init メソッドを使用して ORB オブジェクトを取り出すと、アプリケーショ ンがオブジェクトを保管する必要がありません。このため、アプリケーションから init メ ソッドを複数回実行できます。init メソッドを複数回実行しても、プロセスの複数の ORB ラ ンタイムは初期化されません。2 回目以降のコールでは、ORB のプロパティを変更できない 点に注意してください。ORB を初期化する場合にプロパティが一致しない場合、すでに ORB が初期化されている可能性があります。 パラメータ args ― CORBA 準拠の引数。このパラメータは使用されません。NULL String[] を指定 ■ してください。 ■ props ― init メソッドはいくつかのプロパティにより実行可能 ■ PROP_KEY_APP_NAME Application name ― アプリケーション全体の名前を指定 戻り値 ORB のオブジェクト・リファレンス ■ init public static synchronized ORB init(Applet app, Properties props) init メソッドは、プロセスの ORB ランタイムを初期化し、アクティブな ORB オブジェク ト・リファレンスを取得するために使用します。そのプロセスで ORB ランタイムがすでに アクティブになっている場合、init メソッドは、アクティブな ORB オブジェクト・リファレ ンスを返します。init メソッドを使用して ORB オブジェクトを取り出すと、アプリケーショ ンがオブジェクトを保管する必要がありません。このため、アプリケーションから init メ 19-54 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB ソッドを複数回実行できます。init メソッドを複数回実行しても、プロセスの複数の ORB ラ ンタイムは初期化されません。2 回目以降のコールでは、ORB のプロパティを変更できない 点に注意してください。ORB を初期化する場合にプロパティが一致しない場合、すでに ORB が初期化されている可能性があります。 パラメータ app ― Java アプレット ■ ■ props ― init メソッドはいくつかのプロパティにより実行可能 ■ PROP_KEY_APP_NAME Application name ― アプリケーション全体の名前を指定 戻り値 ORB のオブジェクト・リファレンス ■ init public static synchronized ORB init() init メソッドは、プロセスの ORB ランタイムを初期化し、アクティブな ORB オブジェク ト・リファレンスを取得するために使用します。そのプロセスで ORB ランタイムがすでに アクティブになっている場合、init メソッドは、アクティブな ORB オブジェクト・リファレ ンスを返します。init メソッドを使用して ORB オブジェクトを取り出すと、アプリケーショ ンがオブジェクトを保管する必要がありません。このため、アプリケーションから init メ ソッドを複数回実行できます。init メソッドを複数回実行しても、プロセスの複数の ORB ラ ンタイムは初期化されません。 戻り値 ORB のオブジェクト・リファレンス ■ bind public abstract Object bind(String intf) bind メソッドは、指定されたインタフェースのオブジェクト・インスタンス(インプリメン テーション)のリファレンスを返します。 取出し後、返されたオブジェクト・リファレンスに対する各メソッド実行は、すべて同じオ ブジェクトに対して行われます。このオブジェクトが非アクティブになると、クライアン ト・ランタイムは、ORB 経由でリクエストを転送し、別のアクティブなオブジェクトを探し ます。 IDL から Java への言語マッピング 19-55 ORB パラメータ intf ― ターゲット・インタフェースのインタフェース ID。IDL コンパイラがこの ID を ■ 生成します。この ID は、インタフェースの Helper::id メソッドを通じて取り出されま す。 戻り値 ターゲット・オブジェクトのオブジェクト・リファレンス。返されたオブジェクトは、 ■ インタフェースの Helper::narrow メソッドを使用して、インタフェースの型にキャスト する必要があります。 bind public abstract Object bind(String intf, String impl) bind メソッドは、指定されたインタフェースのオブジェクト・インスタンス(インプリメン テーション)のリファレンスを返します。このオブジェクトは、インタフェース ID とイン プリメンテーション ID の制約を満たします。 取出し後、返されたオブジェクト・リファレンスに対する各メソッド実行は、すべて同じオ ブジェクトに対して行われます。このオブジェクトが非アクティブになると、クライアン ト・ランタイムは、ORB 経由でリクエストを転送し、別のアクティブなオブジェクトを探し ます。 パラメータ intf ― ターゲット・インタフェースのインタフェース ID。IDL コンパイラがこの ID を ■ 生成します。この ID は、インタフェースの Helper::id メソッドを使用して取り出され ます。 ■ impl ― ユーザー定義のインプリメンテーション識別子(オプション)。この識別子は、 ORB::connect メソッドのサーバー・アプリケーションに定義されます。bind 内でイン プリメンテーションが指定されていない場合、ORB は候補のホストのリストから、指定 されたインタフェースのアクティブなインプリメンテーションを 1 つ選択し、クライア ントをそのインプリメンテーションにバインドします。 戻り値 ターゲット・オブジェクトのオブジェクト・リファレンス。返されたオブジェクトは、 ■ インタフェースの Helper::narrow メソッドを使用して、インタフェースの型にキャスト する必要があります。 19-56 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド ORB bind public abstract Object bind(String intf, String impl, String host, int pid) bind メソッドは、指定されたインタフェースのオブジェクト・インスタンス(インプリメン テーション)のリファレンスを返します。このオブジェクトは、インタフェース ID、イン プリメンテーション ID および host:pid の制約を満たします。インタフェース ID は必ず指 定してください。ただし、インプリメンテーション ID と host:pid は、非 NULL の場合のみ 使用されます。host:pid パラメータが非 NULL の場合、インプリメンテーション ID は必須 です。 取出し後、返されたオブジェクト・リファレンスに対する各メソッド実行は、すべて同じオ ブジェクトに対して行われます。このオブジェクトが非アクティブになると、クライアン ト・ランタイムは、ORB 経由でリクエストを転送し、別のアクティブなオブジェクトを探し ます。各リクエストでランダム・オブジェクトにアクセスする場合は、ロード・バランシン グのブールを指定します。 パラメータ intf ― ターゲット・インタフェースのインタフェース ID。IDL コンパイラがこの ID を ■ 生成します。この ID は、インタフェースの Helper::id メソッドを使用して取り出され ます。 ■ impl ― ユーザー定義のインプリメンテーション識別子(オプション)。この識別子は、 ORB::connect メソッドのサーバー・アプリケーションに定義されます。bind 内でイン プリメンテーションが指定されていない場合、ORB は候補のホストのリストから、指定 されたインタフェースのアクティブなインプリメンテーションを 1 つ選択し、クライア ントをそのインプリメンテーションにバインドします。 ■ host ― オブジェクト・インスタンスが置かれるホストの名前(オプション)。これを指 定する場合はインプリメンテーション名が必要です。 ■ pid ― 必要なオブジェクト・インスタンスのプロセス識別子を指定する ub4(オプショ ン) 。これを指定する場合はインプリメンテーション名が必要です。 戻り値 ターゲット・オブジェクトのオブジェクト・リファレンス。返されたオブジェクトは、 ■ インタフェースの Helper::narrow メソッドを使用して、インタフェースの型にキャスト する必要があります。 IDL から Java への言語マッピング 19-57 Object (CORBA::Object) run public abstract void run() run メソッドを使用すると、すべての登録済みインプリメンテーションが、着信リクエスト を受信できるようになります。このメソッドは、ORB ランタイムがインプリメンテーション の操作へのリクエストを処理している間、スレッドをブロックします。このプロセスは、 ORB::stop メソッドにより、クライアントが ORB ランタイムにリクエスト処理を停止するよ うリクエストするまでブロックされます。 stop public abstract void stop() stop メソッドは、ORB ランタイムのリクエスト処理を停止します。サーバー・アプリケー ション内の ORB::run メソッドのブロックを解除するには、stop を実行します。 shutdown public abstract void shutdown() shutdown メソッドは、この処理の ORB ランタイムを終了します。 Object (CORBA::Object) (CORBA::Object) Object インタフェースには、オブジェクトに関する情報を取り出したり、オブジェクトに関 連するアクションを実行するメソッドが含まれます。IDL の Object 擬似オブジェクトは、 org.omg.CORBA.Object クラスにマップされます。 ■ Java ■ オブジェクト・メソッドの説明 Java package org.omg.CORBA; public interface Object { boolean _is_a(String Identifier); boolean _is_equivalent(Object that); boolean _non_existent(); int _hash(int maximum); org.omg.CORBA.Object _duplicate(); void _release(); ImplementationDef _get_implementation(); InterfaceDef _get_interface(); Request _request(String s); 19-58 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Object (CORBA::Object) Request _create_request(Context ctx, String operation, NVList arg_list, NamedValue result); Request _create_request(Context ctx, String operation, NVList arg_list, NamedValue result, ExceptionList exclist, ContextList ctxlist); } 表 19-8 オブジェクト・メソッドの説明 メソッド 説明 セクション _duplicate() オブジェクト・リファレンスをコピーします。 19-61 ページ _get_implementation() オブジェクト・リファレンスのインプリメンテーション定義を 返します。 19-61 ページ _get_interface() 指定されたオブジェクトのインタフェース定義を返します。こ れの使用は推奨されていません。 19-62 ページ _hash(int) オブジェクト・リファレンスのハッシュ値を返します。 19-61 ページ _is_a(String) オブジェクトが別のオブジェクトに対して、"is a" という関係を 持っているかどうかを判断します。 19-59 ページ _is_equivalent(Object) 2 つのオブジェクト・リファレンスの値が同じか比較します。 19-60 ページ _non_existent() 参照されたオブジェクトが参照可能範囲にあるかどうかを判断 します。 19-60 ページ _release() オブジェクト・リファレンスに使用されたリソースを解放しま す。 19-61 ページ _is_a public boolean _is_a(String Identifier); _is_a メソッドは、あるオブジェクトと、オブジェクト・リファレンスおよび特定のインタ フェースとの間に、"is a" という関係があるかどうかを判断します。次のいずれかが真であ れば、"is a" という関係が存在します。 ■ ターゲットのオブジェクト・リファレンス that がこのオブジェクトのインタフェース型 である。 ■ ターゲットのオブジェクト・リファレンス that がターゲット・インタフェースから導出 されている。 この関係を判断するには、ネットワーク通信が必要な場合があります。ターゲット・オブ ジェクトがこのオブジェクトと同じインタフェース型ではなく、また現行プロセスでインプ リメントされていない場合、継承関係を判断するためにターゲット・オブジェクトのリモー ト・インプリメンテーションが問合せを受けることがあります。 IDL から Java への言語マッピング 19-59 Object (CORBA::Object) ネットワーク通信が必要な場合があるため、ORB は常にこの判断を下せるとは限りません。 パラメータ that ― コールを行っているオブジェクトは、that と "is a" という関係にあります。 戻り値 TRUE/FALSE _is_equivalent public boolean _is_equivalent(Object that); _is_equivalent メソッドは、2 つのオブジェクト・リファレンスの値が同じであるかを比較 します。この操作では、一致しているかどうかではなく値が同じかどうかがテストされま す。すなわち、2 つの別のオブジェクト・リファレンスが同一のオブジェクト・インスタン スを参照しているかどうかは、常に判断できるとは限りません。 戻り値 2 つのオブジェクト・リファレンスの値が同じ場合は TRUE、そうでなければ FALSE。戻り 値が TRUE の場合は、オブジェクト・リファレンスのインタフェース ID とインプリメン テーション ID の値が同じであることが保証されます。ただし、値が TRUE であっても、オ ブジェクト・リファレンスが同じオブジェクト・インスタンスを指しているという意味では ありません。また、FALSE 戻り値は、必ずしも 2 つのリファレンスが別のオブジェクトを指 していることを意味しません。 _non_existent public boolean _non_existent(); _non_existent メソッドは、参照されたオブジェクトが参照可能範囲にあるかどうかを判断 します。 戻り値 レスポンスが FALSE の場合、オブジェクトが存在し、参照可能範囲にあることを保証しま す。TRUE は、現在オブジェクトが参照可能範囲にないことを保証します。TRUE は、オブ ジェクトが存在するかどうかは保証しません。 19-60 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド Object (CORBA::Object) _hash public int _hash(int maximum); _hash メソッドは、0 から最大数の範囲のハッシュ値を整数に返します。これはオブジェク ト・リファレンスを表に格納するために使用できます。 パラメータ maximum ― このメソッドから返せる最大ハッシュ値 ■ 戻り値 オブジェクト・リファレンスのハッシュ値 _duplicate public org.omg.CORBA.Object _duplicate(); _duplicate メソッドは、オブジェクト・リファレンスをコピーします。 戻り値 このオブジェクト・リファレンスの複製オブジェクト・リファレンス _release public void _release(); _release メソッドは、オブジェクト・リファレンスに使用されたリソースを解放します。 _get_implementation ImplementationDef _get_implementation(); オブジェクト・リファレンスが指定されると、_get_implementation メソッドはそのインプ リメンテーション定義を返します。この操作は、オブジェクトがアクティブ化されているプ ロセス内でのみ有効です。 戻り値 オブジェクトのインプリメンテーション定義。 IDL から Java への言語マッピング 19-61 Object (CORBA::Object) _get_interface InterfaceDef _get_interface(); _get_interface メソッドは、指定されたオブジェクトのインタフェース定義を返します。こ のメソッドは CORBA 2.0 仕様書では推奨されていません。 19-62 Oracle Application Server EJB、ECO/Java および CORBA アプリケーション開発者ガイド 索引 記号 B _client.jar,4-15,5-15,12-11,13-15 _duplicate メソッド,19-61 _get_implementation メソッド,19-61 _get_interface メソッド,19-62 _hash メソッド,19-61 _is_a メソッド,19-59 _is_equivalent メソッド,19-60 _non_existent メソッド,19-60 _release メソッド,17-15,19-61 _server.jar,4-15,12-11 BAD_CONTEXT 例外,18-45 BAD_INV_ORDER 例外,18-45 BAD_OPERATION 例外,18-45 BAD_PARAM 例外,18-45 BAD_TYPECODE 例外,18-45 Bean アクティブ化,3-8 インタフェース リモート・アクセス,3-2 環境,3-9 サーバー側,2-1 削除,3-4,3-8 作成,3-1 状態を保持しない,3-13,3-14,3-15 状態を保持する,3-13,3-14 セッション,2-4 作成,3-6 例,3-10 同一性のテスト,3-4 ネーミング規則,3-3 パッシブ化,3-7 プール,3-13 リモート・アクセス,3-12 begin メソッド,6-16 ECO/Java,14-12,14-19,16-17 EJB,6-14,6-16,6-21 bind メソッド,5-14,13-15,17-14 構文,19-55 boolean,19-10 数字 10 進数 , IDL の,18-4 A AccessControlEntries クラス,4-6 addCertChain,9-17,16-31 addToEnvironment メソッド,5-14,13-14 addTrustedCert,9-14,16-28 any データ型 IDL の構文,18-30 appletinstance プロパティ,5-6,13-6 APPLET タグ 要件,5-16,13-17 APPLICATION.ENV セクション,12-2 APPLICATION セクション,12-2 authenticationString ECO.APP パラメータ,12-6 C classid 属性,5-17,13-18 索引 -1 className プロパティ,12-5 CLASSPATH,4-19,12-15 close メソッド,5-2,13-2 キャッシュ・クリーンアップ,13-27 キャッシュのクリーンアップ,5-18 COMM_FAILURE 例外,18-45 commit メソッド ECO/Java,14-12,14-19,16-17 EJB,6-14,6-16,6-21 composeName メソッド,5-14,13-14 connect メソッド,17-12,17-16,19-47 Context クラス,5-5,5-6,5-10,13-5,13-6,13-10 ControlDescriptor クラス,4-6,4-11,6-2,6-5,6-11, 6-18,6-23 CORBA,5-2,11-3,11-17,13-2,13-19 API,1-7 Enterprise CORBA Objects for Java ECO/Java を参照 インフラストラクチャ,1-7 オブジェクト,2-1,13-23 スタブの生成,11-18 CORBA::Object 擬似オブジェクト,19-28 CosNaming サービス,2-3,10-3 create_alias_tc メソッド,19-50 create_any メソッド,19-53 create_array_tc メソッド,19-53 create_enum_tc メソッド,19-50 create_exception_tc メソッド,19-51 CreateException 例外,3-10,11-10 create_interface_tc メソッド,19-51 create_output_stream メソッド,19-54 create_recursive_sequence_tc メソッド,19-52 create_sequence_tc メソッド,19-52 create_string_tc メソッド,19-51 create_struct_tc メソッド,19-49 createSubContext メソッド,5-14,13-15 create_union_tc メソッド,19-49 create_wstring_tc メソッド,19-52 create メソッド ECOHome インタフェース,11-2,11-5,11-13, 11-15,11-17,13-21 EJBHome インタフェース,3-2,3-5,3-13,3-14, 3-16 D DAD 索引 -2 トランザクションの ECO/Java,14-13,14-2,14-4,14-9 EJB,4-6,6-2,6-4,6-8,6-15 DATA_CONVERSION 例外,18-45 DeploymentDescriptor クラス,4-5,4-10,5-4 destroySubContext メソッド,5-14,13-15 disconnect メソッド,17-13,19-49 double,19-11 DriverManager クラス getConnection メソッド,6-3,6-5,14-3,14-5 E eco2ejb ユーティリティ,4-2,4-13 ecoActivate メソッド,11-7,11-8,11-11,16-14 ecoapi.jar,12-9,13-15 ECO.APP,4-3,12-2,12-9,13-23 EJB 配置記述子への移行,7-13 ECOBean インタフェース,16-4 ECOContext インタフェース,11-9,16-5 ecoCreate メソッド,11-2,11-5,11-10,11-15 ECOHome インタフェース,11-2,11-3,11-5 ECO/Java,1-6 CORBA との関係,10-1 EJB 仕様との関係,10-1 EJB への移行,7-12 ECO.APP,7-13 oracle.oas.eco パッケージ,7-12 クライアント,7-13 EJB への変換,11-21 JAR ファイル,13-15 JAR ファイルのインストール,12-9 JAR ファイルの作成,12-9 アーキテクチャ,10-5 アプリケーション・インスタンス,10-3 アプリケーションの再インストール,12-17 アプリケーションの変更,12-17 インスタンス生成,13-13 オブジェクト・セクション,12-4,12-13 オブジェクトに対するメソッドの実行,13-13 オブジェクトの作成,11-1,11-2 オブジェクトの破棄,13-13 オブジェクト名,13-3 ガイドライン,11-21 概要,10-1 環境変数,12-14 機能,10-2 クライアント,10-6,13-1 クライアントに必要なファイル,13-15 コンテナ,10-2,10-3 コンポーネント・モデル,10-1 サーバー,10-2 ∼ 10-3 パラメータ,12-13 設定,12-12 タイムアウト,12-16 デバッグ,12-20 トランザクション型オブジェクト,14-1 JTS ドライバ,14-3 宣言,14-4 プログラムによる,14-11 トランザクション・プロパティ,12-16 トランスポート・プロトコル,10-5 配布,10-3,12-11 配布情報ファイル,12-1 ∼ 12-3 パフォーマンス,12-14,12-16,12-18 パラメータ,12-14 プロパティ アプリケーション,12-3 オブジェクト,12-3 ユーザー作成オブジェクト,10-2 優先順位,12-14 リモート・インタフェース・オブジェクト,11-3 ロール,10-2 ロギング,12-15,12-20 ECO/Java から EJB への移行 ECO.APP,7-13 oracle.oas.eco パッケージ,7-12 クライアント,7-13 ホーム・インタフェース,7-12 リモート・インタフェース,7-12 ECOMetaData インタフェース,16-9 ECOObject インタフェース,11-2,11-3,11-4 ecoPassivate メソッド,11-7,11-11,16-13 ecoRemove メソッド,11-8,11-11,11-15,16-13 EJB,1-4,1-6,3-1 Bean の作成,3-1 Bean パラメータ,4-17 CORBA との関係,2-1 JAR ファイル,4-13,5-15 JAR ファイルの作成,4-13 アーキテクチャ,2-5 アプリケーション・インスタンス,2-3 アプリケーション名,4-6 アプレット・クライアント,5-16,13-17 移行,7-13,7-14 インスタンス生成,5-13 インスタンス・パラメータ,4-17 オブジェクトに対するメソッドの実行,5-13 オブジェクトの破棄,5-13 オブジェクト名,5-3 オブジェクト・レベルのパラメータ,4-17 概要,2-1 環境変数,4-18 機能,2-2 クライアント,2-6,5-1 クライアントに必要なファイル,5-15 クライアント・ビュー,2-4 コンテナ,2-1,2-2,2-3 コンポーネント・モデル,2-1,2-3 サーバー,2-1,2-2,2-3 サーバー・レベルのパラメータ,4-16 再インストール,4-21 設定,4-16 タイムアウト,4-20 デバッグ,4-24 トランザクション,4-20,6-1 DAD,4-6 JTS ドライバ,6-3 使用可能,4-6 宣言,6-4 プログラムによる,6-13 認証文字列,4-20 配置記述子,4-1 配布,4-15,4-21 パフォーマンス,4-18,4-24 パラメータ,4-18 変更,4-21 マニフェスト・ファイル,4-12 ユーザー作成の Bean,2-2 リモート・インタフェース,3-3 ロール,2-2 ロギング,4-19,4-24 ejbActivate メソッド,3-7,3-8,3-11 ejbapi.jar,4-13,5-15 EJBContext インタフェース,3-9 ejbCreate メソッド,3-2,3-5,3-10,3-14 EJBHome インタフェース,3-1,3-3,3-5 EJB Jar ファイル,3-2 EJBMetaData インタフェース,3-5 EJBObject インタフェース,3-1,3-3 ejbPassivate メソッド,3-7,3-11 索引 -3 ejbRemove メソッド,3-8,3-11,3-14 EMBED タグ,5-16,13-17 Enterprise CORBA Objects for Java ECO/Java を参照 Enterprise Java Beans EJB を参照 enum IDL の構文,18-33 Environment オブジェクト アクセス,5-14,13-14 exportObject メソッド,16-24 F FREE_MEM 例外,18-45 G Gatekeeper,5-17,13-18 getAuthenticationString メソッド,9-9 getCallerIdentity メソッド,16-5 getCertChainCert,9-18,16-32 getCertChainCount,9-19,16-33 getConnection メソッド,6-3,6-5,6-9,14-3,14-5, 14-9 getECOHome メソッド,11-4,11-9,16-9 getECOObject メソッド,16-11,16-15 getEJBHome メソッド,3-4,3-9 getEnvironment メソッド,3-9,5-14,11-9,12-8, 13-14,16-5 getHandle メソッド,3-4,11-4 getHomeInterfaceClass メソッド,16-9 getHome メソッド,16-6 getMaxInstances メソッド,9-10 getMinInstances メソッド,9-10 getNameParser メソッド,5-14,13-14 getOtherApplications メソッド,9-6 getPrimaryKeyClass メソッド,16-10 getPrimaryKey メソッド,3-4,11-4 get_primitive_tc メソッド,19-53 getPrivateKey,9-17,16-30 getPvtKeyPassword,9-17,16-31 getRemoteInterfaceClass メソッド,16-10 getRollbackOnly メソッド,3-9,11-9,16-6 getSeverity メソッド,9-4,16-21 getStatus メソッド,16-18 getTrustedCert,9-15,16-29 索引 -4 getTrustedCertCount,9-16,16-30 getTxDads メソッド,9-6 getTxEnabled メソッド,9-7 getUserTransaction メソッド,3-9,6-16,11-9,16-7 H Handle インタフェース,16-11 Helper クラス,17-6,17-7 id メソッド,17-14 narrow メソッド,17-6,17-14 HeuristicRollbackException 例外,16-26 HeuristicMixedException 例外,16-25 Holder クラス,17-6,17-7 homeInterface プロパティ,12-5 HTTP,5-2,13-2 I IDL,11-17,12-7 C++ との共通点,18-2 JAR 要件,12-9 インタフェース 構文,18-18 識別子,17-10 定義,17-5 演算の宣言,18-37 キーワード,18-7 句読点,18-8 言語マッピング,17-5,17-7 コンパイル,13-16,17-6,17-7,19-1 識別子,18-7 字句規則,18-3,18-10 仕様構文,18-17 スケルトン,17-3 使用方法,17-10 生成,17-6,17-7 役割,17-4 スタブ,17-3 生成,17-6,17-7 役割,17-4 定義されている,17-3,18-2 データ型,18-27 トークン,18-6,18-8 プリコンパイラ・オプション,18-11 プリプロセス,18-10 文法,18-12 マスター・ファイル,11-18 モジュール宣言,18-18 例外の宣言,18-36 idleTimeOut プロパティ,12-3,12-5 idlFiles プロパティ,12-4 idlInterfaces プロパティ,12-4 IDL コンパイラ,13-17 IDL ファイルのコンパイル,17-7 id メソッド,17-14 IIOP,2-5,5-2,10-5,13-2 Java RMI/IIOP,2-4 マッピング,2-4,10-4 IMP_LIMIT 例外,18-45 IMR,17-14 INITIAL_CONTEXT_FACTORY プロパティ,5-5, 5-6,5-7,13-5,13-6,13-7,13-24 InitialContext,13-6 ECO/Java,13-5,13-7,13-24 EJB,5-5,5-6,5-7 INITIALIZE 例外,18-45 init メソッド,17-10,17-11,17-14,19-54 INTERNAL 例外,18-45 Internet Inter-ORB Protocol IIOP を参照 INTF_REPOS 例外,18-45 INV_FLAG 例外,18-45 INV_IDENT 例外,18-45 INV_OBJREF 例外,18-45 INVALID_TRANSACTION 例外,18-45 isCallerInRole メソッド,16-7 isIdentical メソッド,3-4,11-4 isSession メソッド,16-10 isTxEnabled メソッド,9-7 J JAR _client,5-15,13-15 ecoapi.jar,13-15 EJB,3-2 ejbapi.jar,5-15 oasoorb.jar,5-15 vbjorb.jar,13-16 アプレット・クライアントのファイル,5-16,13-17 インストール,12-9 クライアントからのダウンロード,8-8 作成,4-13,12-9 ファイルの場所,4-14 jar ユーティリティ,4-14,12-11 Java IDL マッピング,19-1 Java RMI/IIOP,10-4 JAVA_COMPILER,12-19 JAVA_HOME,4-19,12-15 javac コンパイラ,4-13,12-10 javax.ejb.SessionSynchronization インタフェース,2-4 Java 仮想マシン JVM を参照 Java トランザクション・サービス JTS を参照 Java ネーミングおよびディレクトリ・インタフェース JNDI を参照 jco2ejb ユーティリティ,7-9 JCO.APP,14-5,14-14 移行 JCORBA から ECO/Java へ,15-3 JCORBA から EJB へ,7-7,15-7 トランザクション・パラメータ,14-2 例,14-3 JCORBA ECO/Java との違い,1-8 ECO/Java への移行,15-1 JCO.APP,15-3 LifeCycle インタフェース,15-2,15-9 ObjectManager,15-3 インプリメンテーション・クラス,15-2 クライアント,15-9 ホーム・インタフェース,15-2 リモート・インタフェース,15-2 EJB への移行,7-1 jco2ejb ユーティリティ,7-9 JCO.APP,7-7,15-7 LifeCycle インタフェース,7-11 MANIFEST.MF,7-9 ObjectManager クラス,7-3 インプリメンテーション,7-3 クライアント,7-11 初期化処理,7-3 セッション・コンテキスト,7-3 ホーム・インタフェース,7-2 リモート・インタフェース,7-2 例外,7-3 JDBC JTS を認識する,6-2,14-2 JTS、関連,14-9 索引 -5 URL の仕様,6-3,14-3 データベース・アクセス,6-2,6-8,6-15,14-2, 14-3 ドライバ,6-3 トランザクション,6-13,14-12,14-13 JDK 1.2, 移行,7-14 JIT コンパイラ,12-18 Just-In-Time コンパイラを参照 JNDI,5-3,13-3 close メソッド,5-2,13-2 ECO/Java,13-3 EJB,5-3 SSL,5-4,13-4 オブジェクト・リファレンス,5-3,11-19 からのアクセス,11-10 ∼からのアクセス,3-10 クライアント,2-4,5-2,10-4,13-2 コンテキスト,5-7,5-15,13-7,13-15 サポートされていない機能,5-14,13-15 サポートしている機能,5-14,13-14 名前,5-4,5-7,5-11,13-4,13-7,13-11 形式,5-8,13-8 名前領域,2-2 複合名,4-15,12-11 JServlet カートリッジ JIT コンパイラ,12-18 JIT のインストール,12-19 パフォーマンスの改善,12-20 JTS,6-2,6-13,14-2,14-11 Just-In-Time コンパイラ,4-22,12-18 インストール,4-23,12-19 パフォーマンスの改善,4-24,12-20 JVM,2-4,10-4 ガーベッジ・コレクト,5-13,13-13 L LD_LIBRARY_PATH,4-19,12-15 LifeCycle インタフェース 移行 JCORBA から ECO/Java へ,15-2,15-9 JCORBA から EJB へ,7-11 listBindings メソッド,5-14,13-14 list_initial_services_remote メソッド,19-46 list_initial_services メソッド,19-45 list メソッド,5-14,13-14 LiveHTML カートリッジ 索引 -6 Perl クライアントの CORBA 擬似オブジェクト API,19-1 Logger,12-15,12-20 ECO/Java,11-10 EJB,3-10,4-19,4-24 レベル,1-7 Logger クラス,9-3,12-20,16-20 ECO/Java,11-10,16-20 EJB,3-10,4-24,9-3 lookup メソッド,5-9,13-9 ECO/Java,13-4,13-7,13-9,13-10,13-11, 13-14,13-25 SSL,13-4 EJB,5-4,5-7,5-9,5-10,5-11,5-14 SSL,5-4 M MANIFEST.MF,4-3,4-12,7-9 MARSHAL 例外,18-45 maxInstances プロパティ,12-3 META-INF ディレクトリ,4-12 minInstances プロパティ,12-3 N narrow メソッド,5-12,13-12,16-23,17-6,17-14 NO_EXCEPTION 例外,18-45 NO_IMPLEMENT 例外,18-45 NO_MEMORY 例外,18-45 NO_PERMISSION 例外,18-45 NO_RESOURCES 例外,18-45 NO_RESPONSE 例外,18-45 NoPermissionException 例外,5-14,13-15 NT 制約,12-9 O OASApplicationDescriptor クラス,4-5,6-2,6-11, 6-18,6-23,9-5 setTxDads メソッド,6-3 setTxEnabled メソッド,6-3 インタフェース,5-4 コンストラクタ,9-5 OASClientInterfaces.idl,5-15,13-16 oasdeploy,8-1 インストール,8-8 オプション,8-4 概要,8-1 構文,8-2 再配布,4-21,12-12,12-17 引数,8-4 例,8-2 oasoidlc コンパイラ,11-18,13-17,17-6,17-18,19-1 oasoorb.jar ファイル,5-15 oasostat コマンド,17-16 OASSessionDescriptor クラス,4-6 OBJ_ADAPTER 例外,18-45 OBJECT_NOT_EXIST 例外,18-45 ObjectManager クラス 移行 JCORBA から ECO/Java へ,15-3 JCORBA から EJB へ,7-3 OBJECT_STATELESS,17-12 object_to_string メソッド,19-47 OBJECT_TRANSIENT,17-12 Object インタフェース _duplicate メソッド,19-61 _get_implementation メソッド,19-61 _get_interface メソッド,19-62 _hash メソッド,19-61 _is_a メソッド,19-59 _is_equivalent メソッド,19-60 _non_existent メソッド,19-60 _release メソッド,17-15,19-61 OBJECT タグ,5-16,13-18 OCI,6-4,14-4 octet,19-10 Operations クラス,17-18 OracleSSLCredential,9-14,16-28 OracleSSLCredential クラス ECO/Java,16-28 EJB,9-14 ORB,5-2,5-13,13-2,13-13 アクティブな ORB オブジェクトの取り出し,17-10 インプリメンテーションの登録,17-11 オブジェクト・リファレンスの取得,17-14 シャットダウン,17-15 終了,17-11,17-14 初期化,17-10,17-11,17-14 対応,7-14,15-10 リクエスト処理の停止,17-10,17-13 リクエストの処理,17-13 ORBClass パラメータ,5-17,13-18 ORBdisableLocator パラメータ,5-17,13-18 ORBSingletonClass パラメータ,5-17,13-18 ORB インタフェース,17-10 bind メソッド,17-14,19-55 connect メソッド,17-12,17-16,17-19,19-47 create_alias_tc メソッド,19-50 create_any メソッド,19-53 create_array_tc メソッド,19-53 create_enum_tc メソッド,19-50 create_exception_tc メソッド,19-51 create_interface_tc メソッド,19-51 create_output_stream メソッド,19-54 create_recursive_sequence_tc メソッド,19-52 create_sequence_tc メソッド,19-52 create_string_tc メソッド,19-51 create_struct_tc メソッド,19-49 create_union_tc メソッド,19-49 create_wstring_tc メソッド,19-52 disconnect メソッド,17-13,19-49 get_primitive_tc メソッド,19-53 init メソッド,17-11,17-14,19-54 list_initial_services_remote メソッド,19-46 list_initial_services メソッド,19-45 object_to_string メソッド,19-47 resolve_initial_references_remote メソッド,19-46 resolve_initial_references メソッド,19-45 run メソッド,17-13,19-58 shutdown メソッド,17-11,17-15,19-58 stop メソッド,17-10,17-13,19-58 string_to_object メソッド,19-47 org.omg.CORBA.ORBClass パラメータ,5-17,13-18 org.omg.CORBA.ORBSingletonClass パラメータ, 5-17,13-18 P PATH,4-19,12-15 perlidlc コンパイラ,13-16 PERSIST_STORE 例外,18-45 pl2java ユーティリティ,2-6,10-6 PL/SQL, Java で起動,2-6,10-6 PortableRemoteObject クラス,5-12,13-12,16-23 PROP_KEY_APP_NAME プロパティ,19-54 索引 -7 R raises 式,18-38 rebind メソッド,5-14,13-15 remoteInterface プロパティ,12-5 removeCertChainCert,9-18,16-32 removeFromEnvironment メソッド,5-14,13-14 removeTrustedCert,9-15,16-29 remove メソッド ECOHome インタフェース,11-4,11-14,11-15, 11-17,13-2,13-13 EJBHome インタフェース,3-4,3-14,3-16,5-2, 5-13 rename メソッド,5-14,13-15 resolve_initial_references_remote メソッド,19-46 resolve_initial_references メソッド,19-45 RMI,1-4,3-3,3-17,5-2,10-4,13-3 インタフェース,3-3 RM プロキシ,2-3,10-3 rollback メソッド,16-18 runFinalizersOnExit メソッド,17-11 run メソッド,17-13,19-58 S SECURITY_CREDENTIALS プロパティ,5-14,13-14 SECURITY_PRINCIPAL プロパティ,5-14,13-14 SECURITY_PROTOCOL プロパティ,5-14,13-14 sequence IDL の構文,18-33 SessionBean インタフェース,16-12 ECO/Java,11-2,11-7,11-10 EJB,3-2,3-7,3-10 SessionContext インタフェース,3-9,11-9,16-15 SessionContext クラス getEnvironment メソッド,12-8 SessionDescriptor インタフェース,3-16 SessionDescriptor クラス,4-2,4-5,4-6,4-10,6-11, 6-18,6-23 setAccessControlEntries メソッド,4-7 setAuthenticationString メソッド,4-6,9-11 setBeanHomeName メソッド,4-6,4-7,5-4 setControlDescriptors メソッド,4-7,6-12 索引 -8 setEnterpriseBeanClassName メソッド,4-7 setEnvironmentProperties メソッド,4-7 setHomeInterfaceClassName メソッド,4-7 setHomeInterfaceName メソッド,5-4 setMaxInstances メソッド,4-6,9-12 setMethod メソッド,4-7 setMinInstances メソッド,4-6,9-13 setOtherApplications メソッド,4-6,9-8 setPrivateKey,9-16,16-30 setReentrant メソッド,4-7 setRemoteInterfaceClassName メソッド,4-7 setRollbackOnly メソッド,3-9,11-9,16-8,16-19 setSessionContext メソッド,3-8,3-10,11-8,11-10, 16-12 setSessionTimeout メソッド,4-7 setSeverity メソッド,9-3,16-21 setStateManagementType メソッド,3-16,4-7,6-23 setTransactionAttribute メソッド,4-7,6-5,6-7, 6-12,6-18,6-23 setTransactionTimeout メソッド,16-19 setTxDads メソッド,4-6,6-3,6-11,6-18,6-23,9-8 setTxEnabled メソッド,4-6,6-3,6-11,6-18,6-23, 9-9 shutdown メソッド,17-11,17-15,19-58 SSL,5-4,13-4 STATEFUL_SESSION プロパティ,3-16,6-23 STATELESS_SESSION,3-16 stateless プロパティ,12-5 stop メソッド,17-10,17-13,19-58 string_to_object メソッド,19-47 SYSTEM_EXCEPTION 例外,18-45 T THREADS_FLAG,4-19,12-15 TRANSACTION_REQUIRED 例外,18-45 TRANSACTION_ROLLEDBACK 例外,18-45 transactionalDads プロパティ,12-4,14-2 TransactionMode ディレクティブ,14-7 transactionMode プロパティ,12-5,14-2 TransactionRolledbackException 例外,16-27 TRANSIENT 例外,18-45 TX_BEAN_MANAGED_EXT 属性,14-2,14-3 TX_BEAN_MANAGED 属性,6-3,6-6,6-7,6-20, 14-2,14-3,14-6,14-7,14-17 TX_MANDATORY 属性,6-6,6-7,14-6,14-7 TX_NOT_SUPPORTED 属性,6-6,6-7,14-3,14-6, 14-7 TX_REQUIRED 属性,6-4,6-6,6-7,6-8,14-4, 14-6,14-7,14-8 TX_REQUIRES_NEW 属性,6-6,6-7,6-19,14-6, 14-7,14-17 TX_SUPPORTS 属性,6-6,6-7,14-6,14-7 typedef IDL の構文,18-27 Java マッピング,19-27 U unbind メソッド,5-14,13-15 unexportObject メソッド,16-24 UNKNOWN 例外,18-45 USER_EXCEPTION 例外,18-45 UserException クラス,11-6 UserTransaction クラス,6-14,14-13 インタフェース,16-16 usesApplications プロパティ,12-3 V vbjorb.jar ファイル,13-16 Visigenic Gatekeeper,5-17,13-18 W Windows NT 制約,4-13 Y yoj.jar,4-13,12-9 あ アクティブ化,3-8,11-8 値による受け渡し,3-17 アプリケーション インスタンス,2-3,10-3 パラメータ,4-17 登録の解除,8-7 名前の指定,5-4 配布 , 構文,8-2 アプレット 要件,5-16 アルファベット文字、IDL の,18-3 い 移行 EJB,7-13,7-14 JCORBA から ECO/Java へ,15-1 LifeCycle インタフェース,15-2,15-9 インプリメンテーション・クラス,15-2 クライアント,15-9 JCORBA から EJB へ,7-1 LifeCycle インタフェース,7-11 JDK 1.2,7-14 オプション,1-9 インスタンス 最小の設定,4-6 最大数,4-6 インストール oasdeploy,8-8 インタフェース IDL の構文,18-18 継承,18-19,18-21 作成,17-4 識別子,17-10,17-14,17-16 処理のインプリメント,17-10 宣言,18-20 定義されている,17-5 ホーム ECO/Java,10-4,13-2 EJB,2-4,5-2,5-4 JCORBA から ECO/Java への移行,15-2 作成,3-1,3-5,11-2,11-5 取出し,3-4,3-15,5-3,11-4,11-15,13-3 要件,3-3,11-3 例,3-6,11-5 リモート ECO/Java,10-4,13-2,13-19 EJB,2-4,5-2 JCORBA から ECO/Java への移行,15-2 JCORBA から EJB への移行,7-2 インスタンス生成,5-13,13-13 作成,3-1,3-3,11-2,11-3 使用,3-15,11-15 要件,3-3,11-3 例,3-4,11-4 インプリメンテーション ORB への登録,17-11 索引 -9 識別子,17-14,17-16 処理の作成,17-10 定義されている,17-10 え 演算 IDL 宣言,18-37 エンティティ・コンポーネント,2-4,10-4 お オブジェクト connect,17-12 CORBA,13-19 アクティブ化,11-8 アクティブの表示,17-16 値による受渡し 制約,3-3 インスタンス生成,5-13,13-13 インタフェース リモート・アクセス,11-2 エンティティ,10-4 環境,11-9 既存メソッドの実行,17-17 削除,11-4,11-8 作成,5-2,11-2,13-2,17-12 状態 名前と値のペア,11-17 状態を保持しない,11-14,11-16 状態を保持しないと宣言する,17-12 状態を保持する,11-13,11-14 状態を保持すると宣言する,17-12 シリアライズ,11-7 セッション,11-10 同一性のテスト,11-4 バインド,17-14 破棄,5-2,13-2 パッシブ化,11-7 非アクティブ化,17-13 プール,11-14 命名規則,11-3 リクエストの処理,17-13 リファレンス ECO/Java オブジェクト名,13-3 EJB オブジェクト名,5-3 JNDI の使用,5-3,13-3 索引 -10 アプレット・クライアント,5-16,13-17 オブジェクトに対するメソッドの実行,5-13, 13-13 オブジェクトの破棄,5-13,13-13 解放,17-15 作成,17-14 タイプキャストする,17-14 取出し,5-1,13-1 必要なファイル,5-15,13-15 リモート・アクセス,11-13 オブジェクト・レベルのパラメータ ECO/Java,12-13 EJB,4-17 か 開発 環境,2-6,10-6 フローチャート,2-7,10-7 型宣言,18-43 環境 取出し,3-9,11-9 変数,4-18,12-14 き キーワード , IDL の,18-7 既存コード CORBA オブジェクトからの実行,17-17 キャッシング クリーン・アップ,5-18,13-27 終了,5-18,13-28 デフォルト,5-18,13-27 共同ロケーション,5-17,13-26 業務ロジック,2-1 共用体 IDL の構文,18-31 Java マッピング,19-15 く 句読点文字 , IDL の,18-8 クライアント ECO/Java オブジェクトのビュー,10-4 ECO/Java から EJB への移行,7-13 EJB,2-6,5-1 JAR ファイルのダウンロード,8-8 Java 以外,5-1,13-1,13-16 ORB の使用,5-2,13-2 アプリケーションの実行,8-1,17-15 アプリケーションの配布,8-1 移行 JCORBA から ECO/Java へ,15-9 JCORBA から EJB へ,7-11 コールバック,13-19,13-20 作成,17-14 スタブ・ファイル,17-4 クライアント JAR ファイルのダウンロード,8-8 け 継承,18-21 こ 構造体型 IDL の構文,18-31 コールバック,13-20 オブジェクト・リファレンスの保存,13-21 作成,13-19 コメント , IDL の,18-7 コンテキスト 初期,5-3 ∼ 5-6,13-3 ∼ 13-6 セッション,3-9,11-9 中間,5-3,5-9,5-15,13-3,13-9,13-15 トランザクション,3-9,11-9 コンテナ,2-3,10-3 コンポーネント・モデル ECO/Java,10-1 EJB,2-1 さ サーバー Beans,2-1 ECO/Java,10-3 EJB,2-3 開始,17-15 既存コードの実行,17-17 作成,17-11 処理のインプリメント,17-10 スケルトン・ファイル,17-4 パラメータ ECO/Java,12-13 EJB,4-16 し 識別子 IDL の構文,18-7 インタフェース,17-14,17-16 インプリメンテーション,17-14,17-16 システム・インタフェース runFinalizersOnExit メソッド,17-11 主キー,3-3,11-3 状態を保持しない connect メソッド,17-12 セッション,3-14,11-14 説明,3-16,11-17 定義,3-13,3-14,3-15,3-16,11-14,11-16, 11-17 トランザクション,6-20,14-17 状態を保持する セッション,3-14,11-14 説明,3-15,11-15 定義,3-13,3-14,3-16,11-13,11-14,11-17, 17-12 トランザクション,6-20,14-17 書式記号 , IDL の,18-6 シリアライズ,4-1 ecoPassivate,11-7 ejbPassivate,3-7 配置記述子,5-4 す スケルトン,17-4,17-10 スタブ,11-18,17-4 せ 整数リテラル,18-8 セキュリティ アプリケーションの配布,8-8 モデル,2-4 セッション Bean Bean、セッションを参照 オブジェクト 作成,11-6 状態を保持する、状態を保持しない,11-14 索引 -11 例,11-10 コンテキスト,3-8,11-8 取出し,3-8,11-8 設定 ECO/Java アプリケーション,12-12 EJB アプリケーション,4-16 前方宣言 , IDL の,18-20 そ 属性 IDL の構文,18-39 in,17-5 inout,17-5 out,17-5 た タイムアウト,4-20,12-16 オブジェクト,12-17 タイ・メカニズム,17-17 つ 属性,6-5 取出しステータス,3-9,11-9 配置記述子の設定,6-4,14-4 パラメータ,14-2 プログラムによる,6-1,6-13,14-1,14-11 例,6-15,14-13 プロパティ,12-4 ロールバック,3-9,11-9 トランスポート・プロトコル,2-5,10-5 な 名前 JNDI,5-3,13-3 アプリケーションで指定する,5-4 解析,5-14,13-14 継承された,18-42 作成,5-14,13-14 参照,5-14,13-14 絶対,5-10,13-10 複数レベル,12-8 プロパティ,12-3 名前解析,5-14,13-14 ツール,2-6,10-6 に て 認証文字列,12-16 設定,4-6,4-20 定数 IDL における宣言,18-23 データ型 IDL の構文,18-28 ね と トークン , IDL の,18-8,18-6 トランザクション,4-20,6-1,14-1,14-2 begin,6-14,6-21,14-12,14-19 コミット,3-9,6-14,6-21,11-9,14-12,14-19 コンテキスト,3-9,6-7,11-9,14-7 取出し,6-16 使用可能,4-6 状態,6-20,14-17 スレッド,6-19,14-16 設定,12-16 宣言,6-1,6-4,14-1,14-4 例,6-8,14-8 索引 -12 ネーム・サービス 初期化,5-5,13-5 リスト,5-14,13-14 ネストされた型,18-43 は バージョン プリコンパイラ,18-11 配置記述子,3-2,4-1,5-4,11-2 Bean レベル,4-6 eco2ej の使用,4-2 OASSessionDescriptor,4-6 アプリケーション・レベル,4-5 作成,4-2 説明,4-1 トランザクション,6-4,14-4 例,4-8 配布 JAR ファイル,8-3 oasdeploy ユーティリティ,8-2 アプリケーション,4-15,8-1,8-7 アプリケーションの削除,8-3 新規ノード,8-7 セキュリティ,8-8 配布されたアプリケーションの削除,8-7 プライマリ・ノード,8-6 リモート・ノード,8-3,8-6 例,8-2,8-6 配布されたアプリケーションの登録の解除,8-7 配布情報ファイル,12-1 ECO.APP,13-23 JAR ファイルの作成,4-13,12-9 値,12-8 アプリケーション・セクション,12-2,12-3 オブジェクト・セクション,12-4 作成,12-2 取出し,12-8 名前,12-2 プロパティ オブジェクト,12-3 例,12-7 配列 IDL の構文,18-35 パッシブ化,3-7,11-7 パフォーマンス,4-18,4-24,12-14,12-16,12-18 JNDI 機能,5-17,13-26 パラメータ,4-18,12-14 パラメータの inout 方向属性,17-5,18-38 パラメータの in 方向属性,17-5,18-38 パラメータの out 方向属性,17-5,18-38 ハンドル 取出し,3-4,11-4 ホーム・インタフェースの取出し,3-5,11-5 ふ 複合名,4-15,12-11 複数継承,18-21 複数レベルの名前,12-8 浮動小数点 IDL の構文,18-9 Java マッピング,19-11 プライマリ・ノード ∼に配布,8-6 プラグマ・プリコンパイラ・オプション,18-11 プリコンパイラ・オプション,18-11 プリプロセッサ・トークン , IDL の,18-8 へ 変換単位,18-11 ほ ホーム・インタフェース,7-12 「インタフェース」および「ホーム」を参照 ま マスター IDL ファイル,11-18 マニフェスト・ファイル,3-2,4-1,4-12 め メタデータ,3-5,11-5 も 文字 Java マッピング,19-10 記号,18-5 リテラル,18-8 モジュール IDL の構文,18-18 文字列 IDL の構文,18-34 Java マッピング,19-11 リテラル,18-9 ゆ 有効範囲付きの名前,18-40 優先順位,12-14 り リテラル , IDL の,18-8 リモート・インタフェース,7-12 「インタフェース」および「リモート」を参照 索引 -13 リモート・ノード アプリケーションの実行,8-1 ∼に配布,8-6 リモート・メソッド実行 RMI を参照 れ 例外,3-6,11-6 BAD_CONTEXT,18-45 BAD_INV_ORDER,18-45 BAD_OPERATION,18-45 BAD_PARAM,18-45 BAD_TYPECODE,18-45 COMM_FAILURE,18-45 DATA_CONVERSION,18-45 FREE_MEM,18-45 IDL 宣言,18-36 IMP_LIMIT,18-45 INITIALIZE,18-45 INTERNAL,18-45 INTF_REPOS,18-45 INV_FLAG,18-45 INV_IDENT,18-45 INV_OBJREF,18-45 INVALID_TRANSACTION,18-45 MARSHAL,18-45 NO_EXCEPTION,18-45 NO_IMPLEMENT,18-45 NO_MEMORY,18-45 NO_PERMISSION,18-45 NO_RESOURCES,18-45 NO_RESPONSE,18-45 OBJ_ADAPTER,18-45 OBJECT_NOT_EXIST,18-45 PERSIST_STORE,18-45 SYSTEM_EXCEPTION,18-45 TRANSACTION_REQUIRED,18-45 TRANSACTION_ROLLEDBACK,18-45 TRANSIENT,18-45 UNKNOWN,18-45 USER_EXCEPTION,18-45 非 CORBA,13-17 例外クラスの作成,3-6,11-6 索引 -14
© Copyright 2024 ExpyDoc