bea ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > Tuxedo > Tuxedo CORBA idltojava コンパイラ > Java IDL プログラミングの概念 |
Tuxedo CORBA idltojava コンパイラ
|
Java IDL プログラミングの概念
ここでは、以下の内容について説明します。
例外
CORBA には 2 種類の例外があります。OMG によって完全に指定されている標準的なシステム例外と、個々のアプリケーション・プログラマによって定義されるユーザ例外です。CORBA の例外は Java の例外オブジェクトとわずかに異なりますが、こうした相違は主に IDL と Java のマッピングで処理されます。
ここでは、次の内容について説明します。
CORBA の例外と Java の例外の相違
IDL で例外を指定するために、インターフェイス設計者は raises キーワードを使用します。これは、Java での throwsの指定と同様です。IDL で exception キーワードを使用すると、ユーザ定義の例外を作成することになります。標準的なシステム例外は、このような指定をする必要がありません (このような指定はできません)。
システム例外
CORBA では、一連の標準システム例外を定義しています。これらの例外は一般に ORB ライブラリによって生成され、以下のようなシステムのエラー状態を知らせます。
すべての IDL オペレーションは、呼び出されたときにシステム例外をスローできます。インターフェイス設計者がインターフェイス内のオペレーションでシステム例外をスローするよう指定しなくても、処理は自動で行われます。
これは、オペレーションのインプリメンテーションが単純であっても、別のプロセス (多くは別のマシン上のプロセス) であるクライアントからのオペレーション呼び出しによって、あらゆる種類のエラーが発生する可能性があるためです。
このため、CORBA Java クライアントは常に CORBA システム例外をキャッチできる必要があります。さらに、開発者は、キャッチする必要のあるシステム例外の通知を idltojava コンパイラに期待できません。これは、CORBA のシステム例外が java.lang.RuntimeException の下位クラスであるためです。
システム例外の構造
すべての CORBA システム例外は同じ構造です。
exception <SystemExceptionName> { // エラーの説明
unsigned long minor; // エラーの詳細
CompletionStatus completed; // 値は、yes、no、maybe のいずれか
}
システム例外は java.lang.RuntimeException のサブタイプで、org.omg.CORBA.SystemException の下位クラスです。
java.lang.Exception
|
+--java.lang.RuntimeException
|
+--org.omg.CORBA.SystemException
|
+--BAD_PARAM
|
+--//etc.
完了ステータス
すべての CORBA システム例外には、例外をスローしたオペレーションのステータスを示す完了ステータス・フィールドがあります。完了コードは、以下のとおりです。
オブジェクトのインプリメンテーションは、例外が起きる前に処理を完了しています。
オブジェクトのインプリメンテーションは、例外が起きる前に呼び出されていませんでした。
呼び出しのステータスは不明です。
ユーザ例外
CORBA ユーザ例外は java.lang.Exception クラスのサブタイプで、org.omg.CORBA.UserException の下位クラスです。
java.lang.Exception
|
+--org.omg.CORBA.UserException
|
+-- Stocks.BadSymbol
|
+--//etc.
IDL に指定されているユーザ定義例外が起きるたびに、結果として Java の例外クラスが生成されます。こうした例外は、すべてプログラマが定義し、インプリメントします。
マイナー・コードの意味
すべてのシステム例外には、例外発生の原因についての付加情報を CORBA ベンダが提供するための「minor」フィールドが用意されています。表 4-1 および表 4-2 に、Java IDL のシステム例外のマイナー・コードと、それらの意味を示します。
初期化
CORBA Java クライアントまたは CORBA Java 共同クライアント/サーバで CORBA オブジェクトを使用可能にするには、次の方法で自身を初期化する必要があります。
ORB オブジェクトの作成
CORBA Java クライアントまたは CORBA Java 共同クライアント/サーバが CORBA オブジェクトを作成または呼び出せるようになるには、最初に ORB オブジェクトを作成する必要があります。ORB オブジェクトを作成することで、クライアントまたは共同クライアント/サーバは ORB に自身の存在を知らせ、ORB オブジェクトで定義されている重要なオペレーションへのアクセスを取得します。
クライアントと共同クライアント/サーバでは、ORB のインスタンスを作成する方法がわずかに異なります。これは、ORB.init の呼び出しに渡される必要があるパラメータの配列が異なるためです。
アプリケーション用 ORB の作成
次のコードは、CORBA Java クライアントが ORB を作成する方法の一例です。
import org.omg.CORBA.ORB;
public static void main(String args[])
{
try{
ORB orb = ORB.init(args, null);
// コード続く
アプレット用 ORB の作成
Java アプレットでは、次のようにして ORB を作成します。
import org.omg.CORBA.ORB;
public void init() {
try {
ORB orb = ORB.init(this, null);
// コード続く
一部の Web ブラウザには、ORB が組み込まれています。このため、ブラウザの ORB が標準に完全に準拠していないと問題が生じます。そのような場合は、Java IDL ORB を確実に初期化するための特別なステップが必要になります。たとえば、Netscape Communicator 4.01 の ORB ではクラスが不足しているために、このブラウザで表示するアプレットの init() メソッドには、次に示すようなコードが必要です。
import java.util.Properties;
import org.omg.CORBA.*;
public class MyApplet extends java.applet.Applet {
public void init()
{
// Java IDL ORB のインスタンス化。このアプレットに渡して
// ORB がアプレットのプロパティを取得できるようにする
Properties p = new Properties();
p.put("org.omg.CORBA.ORBClass", "com.sun.CORBA.iiop.ORB");
p.put("org.omg.CORBA.ORBSingletonClass","com.sun.CORBA.idl.ORBSingleton");
System.setProperties(p);
ORB orb = ORB.init(args, p);
...
}
}
ORB.init() の引数
アプリケーションとアプレットの両方について、初期化メソッドの引数は次のとおりです。
アプリケーションの引数またはアプレットのパラメータへの ORB アクセスを提供します。
java.util.Properties のオブジェクトです。
init() オペレーションはこれらのパラメータをシステムのプロパティとともに使用して、ORB のコンフィギュレーションに必要な情報を取得します。ORB コンフィギュレーションのプロパティの検索は、以下の場所および順序で行われます。
いずれかのプロパティで最初に見つかった値が、init() オペレーションで使用される値です。上記の場所のいずれにもコンフィギュレーションのプロパティがない場合、init() オペレーションはインプリメンテーションに固有の値を推定します。ORB のインプリメンテーション間で移植性を最大にするために、アプレットおよびアプリケーションはオペレーションに影響するコンフィギュレーションのプロパティの値を明示的に指定する必要があります。自身が実行されている ORB による推定には依存しないようにしてください。
システムのプロパティ
BEA Tuxedo 製品は Sun Microsystems, Inc の Java 仮想マシンを使用しています。この仮想マシンは、コマンド行引数 -D を追加しています。ほかの Java 仮想マシンの中には、Sun の仮想マシンと同様のものもあれば、異なるものもあります。
現在、すべての ORB インプリメンテーションについて以下のコンフィギュレーション・プロパティが定義されています。
org.omg.CORBA.ORB インターフェイスをインプリメントする Java クラスの名前です。アプレットおよびアプリケーションは、特定の ORB インプリメンテーションが必要でなければ、このプロパティを提供しなくてもかまいません。Java IDL ORB 用の値は com.sun.CORBA.iiop.ORB です。
org.omg.CORBA.ORB インターフェイスをインプリメントする Java クラスの名前です。このオブジェクトは、orb.init() への引数なしの呼び出しによって返されます。主な用途は、安全な環境にある信頼性のないコード (署名のないアプレットなど) の間で共有できるタイプ・コードのインスタンスを作成することです。
アプレットのパラメータには、完全なプロパティ名を指定する必要があります。アプリケーションの規則はアプレットとは異なるので、コマンド行呼び出しでの言語固有の詳細項目がエクスポーズされることはありません。
初期オブジェクト・リファレンスの取得
CORBA オブジェクトを呼び出すには、アプレットまたはアプリケーションで CORBA オブジェクトへのリファレンスが必要です。CORBA オブジェクトへのリファレンスを取得する方法は、次の 3 つです。
文字列化されたオブジェクト・リファレンス
第一のテクニックである、文字列化されたリファレンスを実際のオブジェクト・リファレンスに変換する方法は、ORB のインプリメンテーションに依存しません。アプレットまたはアプリケーションがどの ORB 上で実行されていても、文字列化されたオブジェクト・リファレンスを変換することができます。ただし、アプレットまたはアプリケーションの開発者は、以下の点に留意してください。
ORB からのリファレンスの取得
初期 CORBA オブジェクトを取得するために文字列化されたリファレンスを使用しない場合は、ORB 自身を使用して初期オブジェクト・リファレンスを生成します。
Bootstrap オブジェクトは、新しく開始されたアプリケーションまたはアプレットにオブジェクト・リファレンスをブートストラップ処理するための resolve_initial_references() というオペレーションを定義します。このオペレーションは、認識されるいくつかのオブジェクトのうち 1 つの名前を指定する文字列引数を取ります。結果として 1 つの CORBA オブジェクトが返され、このオブジェクトはアプレットやアプリケーションが認識する型にナロー変換される必要があります。
Bootstrap オブジェクトを使用すると、オブジェクト・リファレンス (SecurityCurrent、TransactionCurrent、FactoryFinder、NotificationService、Tobj_SimpleEventsService、NameService、および InterfaceRepository) を取得できます。ここでは、FactoryFinder オブジェクトについて説明します。
FactoryFinder インターフェイスは、BEA Tuxedo ドメインへの唯一の入り口となるオブジェクト・リファレンスをクライアントに提供します。FactoryFinder オブジェクトは特定のファクトリ・オブジェクトの取得に使用されます。取得したファクトリ・オブジェクトで、必要なオブジェクトを作成することができます。
Bootstrap オブジェクトの使用の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』を参照してください。
FactoryFinder インターフェイス
FactoryFinder インターフェイスは、BEA Tuxedo ドメインへの唯一の入り口となるオブジェクト・リファレンスをクライアントに提供します。複数の FactoryFinder によって、可用性と信頼性が高まります。複数のドメインにわたるマッピングがサポートされています。
FactoryFinder のインターフェイスと NameManaer は、オブジェクトの登録、格納、および検索のためのメカニズムです。BEA Tuxedo 環境では、次のことができます。
FactoryFinder オブジェクトの使用の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』を参照してください。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |