このドキュメントは Java IDL テクノロジの使用に関する質問にお答えするためのものです。
servertool
を使用してサーバーを起動するとき、複数のクラスパスを追加できますか。tnameserv
、orbd
) を実行できない場合には、どうしたらよいでしょうか。2 番目に多い原因は、次のコード行の引用符と引用符の間に空白が追加されていることです。
NameComponent nc = new NameComponent("Hello", "");
引用符の間には空白を入れないでください。空白がなければ、この値は Null として渡されます。引用符の間に空白があると、空白文字が渡されます。
J2SE 1.4.x と J2SE 5.0 の間の互換性に関する情報は、「CORBA の互換性情報 - J2SE 5.0」を参照してください。
よく遭遇する Sun のマイナーコード例外には、次のようなものがあります。
COMM_FAILURE/201。vmcid: SUN minor code: 201 は、「CONNECT_FAILURE」を意味します。これは、java.net.SocketException
が原因で生じることがあり、通常は BindException
、ConnectException
、または NoRouteToHostException
のいずれかです。
次のような点を確認する必要があります。
ネームサービスは実行されているか。そうでない場合は、ドキュメント「ネームサービスの起動と停止」の説明に従って、ORBD ネームサービスを開始します。
ネームサービスに対して -ORBInitialHost
および -ORBInitialPort
の値が正しく設定されていますか。どのように設定するべきかわからない場合は、ドキュメント「ネームサービスの起動と停止」を参照してください。
クライアントアプリケーションとサーバーアプリケーションは、ネームサービスが実行されているポート番号 (必要な場合は、さらにマシン名) を認識しているか。これを行う方法については、「ネームサービスの起動と停止」を参照してください。
COMM_FAILURE/208。vmcid: SUN minor code: 208 は、「CONNECTION ABORT」を意味し、これは一般に、接続が切れたことを表します。
COMM_FAILURE/209。vmcid: SUN minor code: 209 は「CREATE_LISTENER_FAILED: Unable to create the listener thread on the specific port. Either the post is taken or there was an error creating the daemon thread
」を意味します。これは一般に、ネームサービスを実行しようとしたポートが別のプロセスによって使用中であることを示しています。Solaris 上で実行している場合には、このポートで別のプロセスが実行中かどうかを調べるために、端末プロンプトで次のコマンドを実行します。
netstat | grep port_number
OBJECT_NOT_EXIST/204。vmcid: SUN minor code: 204 は、「SERVANT_NOT_FOUND」を意味します。これがスローされる唯一の場所は、corba.INSSubcontract.getINSReference
です。
MARSHAL/217。vmcid: SUN minor code: 217 は、クライアントが GIOP 1.0 で wchar
か wstring
のいずれかを送信しようとしたことを意味し、これは仕様で許可されていません。
MARSHAL/202。vmcid: SUN minor code: 202 は、org.omg.CORBA.Object
から派生したオブジェクトを整列化しようとしているが、その特定のインスタンスが ORB に接続されていないことを意味します。POA を使用する場合は、まずオブジェクトを POA に登録する必要があります。オブジェクトを POA に登録する方法の詳細については、「Portable Object Adapter (POA)」または「Java™ IDL 入門:」チュートリアルを参照してください。
BAD_PARAM/201。vmcid: SUN minor code: 201 は、「NULL_PARAM」を意味します。この例外は、多くの場合、write_string
や write_octet_array
などの write
メソッドに Java null
が渡されたために発生します。Java メソッドの結果として Java null
を返すことはできません。
org.omg.CORBA.INTERNAL。vmcid: SUN minor code: 208 は Unable to determine local hostname using InetAddress.getLocalHost().getHostName()
を意味します。
ORB は、InetAddress.getLocalHost().getHostName()
を使用して、参照の検索やバインドのためにネームサービスへの参照を作成します。また、サーバー側で InetAddress.getLocalHost().getHostName()
を使用して、ドット区切り 10 進数とポートの組み合わせではなく、サーバーの名前とポートを含んだリモートオブジェクト参照 (つまり IOR) を作成します。
getHostName
の呼び出しを回避するために、次のようなプロパティーを設定できます (設定方法がわからない場合は、「ネームサービスの起動と停止」を参照)。
ORB がサーバーとして機能している場合は、com.sun.CORBA.ORBServerHost
にサーバーの DNS 名またはドット区切り 10 進数アドレスを設定します。
com.sun.CORBA.ORBInitialHost
に、ネームサーバーの DNS 名またはドット区切り 10 進数アドレスを設定します。
注: これらのプロパティーは独自のもので、削除または変更されることがあります。
servertool
を使用してサーバーを起動するとき、複数のクラスパスを追加できますか。servertool
を使用してサーバーを登録するときにクラスパスを指定しようとしたのですが、register
コマンドで構文エラーが起こります。使用したコマンド行の長さが制限を超えているように思われます。
servertool
でサーバーを登録するとき、非常に長いクラスパスを指定するにはどうしたらよいのでしょうか。
servertool
そのものは複数の JAR ファイルを受け付けるのですが、現在のところ、servertool
のコマンド行バッファーの長さに関してバグがあります。servertool
ラッパーのバグ (4482166) の詳細を参照してください。
回避策として、servertool
内からサーバーを起動する代わりに、ServerTool
クラスを呼び出してサーバーを起動することができます。たとえば、次のようにします。
${JAVA_HOME}/bin/java com.sun.corba.se.internal.Activation.ServerTool -ORBInitialPort ${ORB_INITIAL_PORT} -cmd register -server sample.MyServer -classpath jar1:jar2:jar3 -applicationName sample
servertool
クラスの名前は、将来のリリースで変更になる可能性があることに注意してください。
tnameserv
、orbd
) を実行できない場合には、どうしたらよいでしょうか。/etc/hosts
ファイルに次の行を組み込みます。
<Local Host IP Address> localhost <Local Host IP Address> <HostName>
ここで <Local Host IP Address> は、ネームサービス (tnameserv
、orbd
) を起動するホストの IP アドレスです。
「J2SE 5.0 での CORBA サポートの公式仕様」を参照してください。
public class MyApp { public static void main( String args[] ) { Properties properties = System.getProperties(); properties.put( "org.omg.CORBA.ORBClass", "<com.other_company.package.ORB>" ); try { ORB orb = ORB.init( args, properties); ...
使用する ORB 実装に固有のプロパティー設定については、ベンダーのドキュメントを参照してください。
この ORB については、J2EE の検証プロセスの一環としてテストを実施済みです。ただし、すべてのベンダーのスタンドアロン CORBA ORB との相互運用性についてテストを実施したわけではありません。
使用する他ベンダーのサービスで INS がサポートされている場合は、それを試してみてください。INS を利用し、ORB.object_to_string() メソッドを使用して、他ベンダーの ORB サーバー上の Interoperable Object References (「Java ID: Interoperable Naming Service (INS) の例」を参照) を文字列に変換します。その文字列をファイルに書き込みます。
C++ クライアントと Enterprise JavaBeans コンポーネントを使用したサンプルアプリケーションを含む開発者ガイドは、次の Web サイトに見つかります。Enterprise JavaBeans™ コンポーネントと CORBA クライアント: 開発者ガイド。
Sun ORB をほかのベンダーのネームサービスとともに使用するには
-ORBInitRef NameService=corbaloc:iiop:1.2@:/NameService
orb.resolve_initial_references("NameService") を実行すると、サードパーティー製のネームサービスに接続できるようになるはずです。接続できない場合は、次のトラブルシューティングに関するヒントを試してください。
C++ クライアントと Enterprise JavaBeans コンポーネントを使用したサンプルアプリケーションを含む開発者ガイドは、次の Web サイトに見つかります。Enterprise JavaBeans™ コンポーネントと CORBA クライアント: 開発者ガイド。
異なる言語で書かれた ORB 間での通信が可能なはずですが、Java ORB とほかのベンダーの ORB との相互運用性はまだテストされていません。
これは基本的な問題であり、Java プログラミング言語と CORBA を統合する 2 つの方式の違いを理解することが重要です。
Java IDL テクノロジは、CORBA インタフェース定義言語 (Interface Definition Language、IDL) で定義されたインタフェースに基づいて Java プログラミング言語でプログラムを記述したい CORBA プログラマ向けです。これは「通常どおりの」CORBA プログラミングで、C++ や COBOL のようなほかの言語とまったく同じ方法で Java をサポートしています。
Java RMI-IIOP (Remote Method Invocation over Internet Inter-ORB Protocol) テクノロジは、IIOP を背後のトランスポートとして使用して Java Remote Method Invocation (Java RMI) インタフェースでプログラムを作成したい、Java プログラマ向けです。RMI-IIOP はさまざまな言語で実装される CORBA オブジェクトとの相互運用性を提供しますが、リモートインタフェースをあらかじめ Java RMI インタフェースとして定義しておく必要があります。EJB のリモートオブジェクトモデルは Java RMI テクノロジベースなので、Enterprise JavaBeans™ (EJB™) テクノロジを使うプログラマには特に重要です。
最新バージョンの IDL-to-Java コンパイラを入手するには、最新バージョンの Java™ Platform, Standard Edition (Java SE) をダウンロードしてください。Java SE をインストールすると、idlj は bin ディレクトリに格納されます。
J2SE v1.3 の idltojava に関するその他のトラブルシューティング情報については、「Java IDL FAQ」を参照してください。