このドキュメントは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のマニュアル・ページ(Solaris、Linux、Mac OS XまたはWindows)の説明に従って、ORBDネーム・サービスを開始します。
ネーム・サービスに対して-ORBInitialHost
および-ORBInitialPort
の値が正しく設定されていますか。どのように設定するべきかわからない場合は、orbdのマニュアル・ページ(Solaris、Linux、Mac OS XまたはWindows)を参照してください。
クライアント・アプリケーションとサーバー・アプリケーションは、ネーム・サービスが実行されているポート番号(必要な場合は、さらにマシン名)を認識しているか。これを行う方法については、orbdのマニュアル・ページ(Solaris、Linux、Mac OS XまたはWindows)を参照してください。
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に登録する方法の詳細は、「ポータブル・オブジェクト・アダプタ(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
の呼出しを回避するために、次のようなプロパティを設定できます(設定方法がわからない場合は、orbdのマニュアル・ページ[Solaris、Linux、Mac OS XまたはWindows]を参照)。
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(tm)コンポーネントとCORBAクライアント: 開発者ガイド。
Sun ORBをほかのベンダーのネーム・サービスとともに使用するには
-ORBInitRef NameService=corbaloc:iiop:1.2@:/NameService
orb.resolve_initial_references("NameService")を実行すると、サード・パーティ製のネーム・サービスに接続できるようになるはずです。接続できない場合は、次のトラブルシューティングに関するヒントを試してください。
C++クライアントとEnterprise JavaBeansコンポーネントを使用したサンプル・アプリケーションを含む開発者ガイドは、次のWebサイトに見つかります。Enterprise JavaBeans(tm)コンポーネントと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(tm)(EJB(tm))テクノロジを使うプログラマには特に重要です。
最新バージョンのIDL-to-Javaコンパイラを入手するには、最新バージョンのJava(tm) Platform, Standard Edition (Java SE)をダウンロードしてください。Java SEをインストールすると、idljはbinディレクトリに格納されます。