調査 #107
未完了JacORBを使ったCORBAサーバー・クライアントプログラムをNetBeansで作る
50%
説明
調査目的:
- JacORBを使ったCORBAクライアント・サーバーのプログラムをNetBeansで作る方法を確立する
NetBeansのAntプロジェクトでIDLのコンパイルを含めて構築方法を確立する
調査結果:
完了条件:
- 構築手順をWikiページJava corba counterに記述する。
調査環境:
OS | Windows 10 1909 64bit |
---|---|
Java | Java SE Development Kit 8u241 64bit |
NetBeans IDE | 8.2 |
ファイル
高橋 徹 さんがほぼ5年前に更新
- 説明 を更新 (差分)
- ステータス を 新規 から 進行中 に変更
- 進捗率 を 0 から 50 に変更
- JacORB 3.9 のバイナリをダウンロードし、
C:\Program Files\Java\
の下に展開(jacorb-3.9) - NetBeans IDEの[ツール]メニュー > [ライブラリ]で、「Antライブラリ・マネージャ」画面を開き、[新規ライブラリ]で[JacORB 3.9]の名前を指定、クラスパスに次を追加
C:\Program Files\Java\jacorb-3.9\lib\jacorb-3.9.jar
C:\Program Files\Java\jacorb-3.9\lib\idl.jar
idl.jar
は、IDLコンパイルの実行に使用する
- IDLコンパイルするAntタスクとして、idldepend を使用
- idldepend-1-3-0.jar を、C:\Program Files\NetBeans 8.2\extide\ant\lib の下にコピー
- IDLだけを入れたNetBeansプロジェクトを作成
- [ファイル]メニュー > [新規プロジェクト] > [Java] > [Javaクラス・ライブラリ]を選択し[次>]ボタン
- プロジェクト名を[CounterIdl]として作成
- srcの下に Counter.idl を作成 表示
- build.xmlの修正 表示
- IDLコンパイルは、Javaソースのコンパイル前に実施するので、-pre-compileターゲットをオーバーライドして定義を記載
- IDLコンパイルで生成するソースコードは、NetBeansプロジェクトの慣習に従い、build\generated-sourcesの下になるようidlcheckのtargetdirに指定
- Counter.idlがコンパイル後buildディレクトリにコピーされるのを抑止するためproject.propertiesを修正
- build.classes.excludes=**/*.java,**/*.form + build.classes.excludes=**/*.java,**/*.form,**/*.idl
高橋 徹 さんがほぼ5年前に更新
JacORBにはIDLコンパイル用のAntタスクが添付されていた。(プログラミングガイドの25.1節 idl)
idldependではなく、JacORBのタスクを使用してみる。
- build.xml 表示
D:\work\counter\CounterIdl\build.xml:74: taskdef class org.jacorb.idl.JacIDL cannot be found using the classloader AntClassLoader[]
試行錯誤結果、次のように記述すればOK
- build.xml 表示
taskdefのclasspathで指定しているプロパティ(libs.JacORB_3.9.classpath)は、nbproject/build-impl.xmlの-init-user
ターゲットで読み込むプロパティファイルに定義されています。そのため、project直下にtaskdefを定義すると、まだターゲットが実行される前にtaskdefのclasspathが評価され、未定義のためクラスが見つからないという事象が発生します。
i2jpackageは、IDLのmodule定義(名前空間)をJavaのパッケージに置き換えるパターンを定義します。コロン(:)の左が置き換え前のIDL module名で右が置き換え後のjavaパッケージ名です。左側を空にすると、moduleを定義していないIDLをjavaでパッケージを付けることができます。
続いて、idlファイルがビルド出力ディレクトリにコピーされないよう次の修正をします。- project.properties
- build.classes.excludes=**/*.java,**/*.form + build.classes.excludes=**/*.java,**/*.form,**/*.idl
プロジェクトをビルドすると、次のようにIDLコンパイルされたソースファイル、クラスファイル、JARファイルが生成されます。
CounterIdl +-- build | +-- classes | | +-- com/torutk/counter/idl | | +-- Counter.class, CounterHelper.class, CounterHolder.class, CounterOperations.class, | | CounterPOA.class, CounterPOATie.class, _CounterStub.class | +-- generated-sources | +-- com/torutk/counter/idl | +-- Counter.java, CounterHelper.java, CounterHolder.java, CounterOperations.java, | CounterPOA.java, CounterPOATie.java, _CounterStub.java +-- dist | +-- CounterIdl.jar +-- src +-- Counter.idl
高橋 徹 さんがほぼ5年前に更新
- ファイル JacORB_NameManager-1.png JacORB_NameManager-1.png を追加
- カテゴリ を Linux にセット
- 担当者 を削除 (
高橋 徹)
JacORBネーミングサービスの起動方法を調査¶
JacORB Programming Guide の「25.2節 NS」に記載あり。
コマンドラインで次のいずれかを実行するとある
$ ns <ファイル名> [タイムアウト]
$ jaco jacorb.Naming.NameServer <ファイル名> [タイムアウト]
ファイル名は、起動したネーミングサービスのIOR情報を書き込むファイル。
まず、1を試す。
D:\work\counter> "C:\Program Files\Java\jacorb-3.9\bin\ns" .\NS_Ref 'jaco' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 D:\work\counter>
ns.batの中を調べると
@echo off rem Starts the JacORB name server jaco org.jacorb.naming.NameServer %*
とjacoを呼び出すが、jacoコマンドのあるC:\Program Files\Java\jacorb-3.9\bin
はPATHを通していないのでこのエラーとなる。コマンド実行するコマンドプロンプトでPATHを通しておく。
D:\work\counter> PATH="C:\Program Files\Java\jacorb-3.9\bin";%PATH% D:\work\counter> ns .\NS_Ref WARNING Warning - unknown codeset (MS932) - defaulting to ISO-8859-1 WARNING Warning - unknown codeset (MS932) - defaulting to ISO-8859-1 INFO Initialising ORB with ID: INFO InterceptorManager started with 0 Server Interceptors, 0 Client Interceptors and 1 IOR Interceptors INFO NS up
一応起動できたように見えるが、ファイルが生成されていない。
試行錯誤とぐぐりまくって、
D:\work\counter> ns -Djacorb.naming.ior_filename=NS_Ref WARNING Warning - unknown codeset (MS932) - defaulting to ISO-8859-1 WARNING Warning - unknown codeset (MS932) - defaulting to ISO-8859-1 INFO Initialising ORB with ID: INFO InterceptorManager started with 0 Server Interceptors, 0 Client Interceptors and 1 IOR Interceptors INFO NS up
で起動したところ、D:\work\counter\NS_Refが生成された。中身はIOR。
絶対パス指定も可
D:\work\counter> ns -Djacorb.naming.ior_filename=D:/work/NS_Ref :
で起動したところ、D:\work\NS_Refが生成された。
JacORB Programming Guide の「6章 The JacORB Nmae Service」を読むと、
6.1 Running the Name Serverより
$ ns [-Djacorb.naming.ior_filename=ファイル名] [-DOAPort=ポート番号] [-Djacorb.naming.time_out=タイムアウト]
おい、25.2節とオプション指定が違っているぞ!
-DOAPort
は、JacORB 1.4で導入されたcorbaloc対応オプション。
今回は、corbalocでネーミングサービスに接続させたいので、nsは-DOAPortを指定することにする。
D:\work\counter> ns -DOAPort=3626
ネーミングサービスの管理ツール nmg を使って起動したネーミングサービスに接続
D:\work\counter> nmg -ORBInitRef NameService=corbaloc::localhost:3626/NameService
と表示されればOKです。
高橋 徹 さんがほぼ5年前に更新
CORBA Counterサーバーのプロジェクトを作成し、実行プログラムを実装¶
- [ファイル]メニュー > [新規プロジェクト] > [Java] > [Javaクラス・ライブラリ]を選択し[次>]ボタン
プロジェクト名を[CounterServer]として作成 - srcの下に パッケージ com.torutk.counterを作成し、中にMain.javaとSimpleCounter.javaの2つを作成
⇒ http://www.02.246.ne.jp/~torutk/javacorba/serverside.html - プロジェクトのプロパティを開き[ライブラリ]で、JacORB 3.9ライブラリとCounterIdlプロジェクトを追加
- プロジェクトのプロパティを開き[実行]で次を設定
- 引数: -ORBInitRef NameService=corbaloc::localhost:3626/NameService
- VMオプション:
-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB
-Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton
- 実行時に、JacORB 3.9ライブラリ設定不足でエラーが出るので、以下JARを追加設定
slf4j-api-1.7.14.jar
slf4j-jdk14-1.7.14.jar
実行¶
出力ウィンドウに次が表示されます。
run: INFO Initialising ORB with ID: INFO InterceptorManager started with 0 Server Interceptors, 0 Client Interceptors and 1 IOR Interceptors INFO oid: 00 01 24 48 4D 05 15 02 32 36 10 06 30 46 38 14 14 1B 48 4C ..$HM...26..0F8...HL1B .object is activated INFO Using server ID (1160238886) for transient POA INFO ClientConnectionManager: created new ClientGIOPConnection to 127.0.0.1:3626 (de0a01f) INFO Connected to 127.0.0.1:3626 from local port 51483 Waiting request from client
また、ネーミングサービスの管理ツール nmg に登録されたオブジェクトが確認できます。
備考)
仮想サーバー(Hyper-V)を稼働しているWindows 10マシンでは、ネットワークが複数作られており、ここでlocalhostを指定してネーミングサービスに接続すると、意図するネットワークとは別のネットワークで接続することがあります。
Programming Guide 3.2.7項 Listen Endpoints を参照すると制御ができると思われます。
高橋 徹 さんがほぼ5年前に更新
CORBA Counterクライアントのプロジェクトを作成し、プログラムを実装¶
- [ファイル]メニュー > [新規プロジェクト] > [Java] > [Javaアプリケーション]を選択し[次>]ボタン
プロジェクト名を[CounterClient]として作成 - srcの下に パッケージ com.torutk.counter.clientを作成し、中にMain.javaを作成
⇒ http://www.02.246.ne.jp/~torutk/javacorba/clientside.html - プロジェクトのプロパティを開き[ライブラリ]で、JacORB 3.9ライブラリとCounterIdlプロジェクトを追加
- プロジェクトのプロパティを開き[実行]で次を設定
引数: -ORBInitRef NameService=corbaloc::localhost:3626/NameService
VMオプション:
-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB
-Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton
実行¶
出力ウィンドウに次が表示
run: Server Counter = 0 Server Counter = 1 ビルド成功(合計時間: 1秒)
高橋 徹 さんがほぼ5年前に更新
例外処理のコーディングメモ
ORB#resolve_initial_references(String name)
→ org.omg.CORBA.ORBPackage.InvalidName 検査例外POAOperations#activate_object(Servant servant)
→ org.omg.PortableServer.POAPackage.ServantAlreadyActivate
→ org.omg.PortableServer.POAPackage.WrongPolicyPOAOperations#servant_to_reference(Servant servant)
→ org.omg.PortableServer.POAPackage.ServantNotActive
→ org.omg.PortableServer.POAPackage.WrongPolicyNamingContextOperations#rebind(NameComponent[] n, org.omg.CORBA.Object obj)
→ org.omg.CosNaming.NamingContextPackage.NotFound
→ org.omg.CosNaming.NamingContextPackage.CannotProceed
→ org.omg.CosNaming.NamingContextPackage.InvalidNamePOAManagerOperations#activate()
→ org.omg.PortableServer.POAManagerPackage.AdapterInactive
例外ツリー
java.lang.Exception org.omg.CORBA.UserException org.omg.CORBA.ORBPackage.InvalidName org.omg.CosNaming.NamingContextPackage.CannotProceed org.omg.CosNaming.NamingContextPackage.InvalidName org.omg.CosNaming.NamingContextPackage.NotFound org.omg.PortableServer.POAManagerPackage.AdapterInactive org.omg.PortableServer.POAPackage.ServantAlreadyActive org.omg.PortableServer.POAPackage.ServantNotActive org.omg.PortableServer.POAPackage.WrongPolicy
高橋 徹 さんがほぼ5年前に更新
- ファイル CounterIld_projectpain_generated-1.png CounterIld_projectpain_generated-1.png を追加
- ファイル CounterIld_projectpain_generated-2.png CounterIld_projectpain_generated-2.png を追加
気付き事項¶
NetBeansのプロジェクトペインで CounterIdlプロジェクトのソースパッケージの表示が変
ソースフォルダ名が[生成されたソース (com)]となっており、パッケージ名が[torutk.counter.idl]となっている。
IDLファイルから生成されるJavaソースファイルの出力先を、build/generated-sources ではなく、一段深いディレクトリのbuild/generated-sources/idl に修正してみた。
- build.xml
- <idlcompile srcdir="${src.dir}" destdir="${build.generated.sources.dir}"> + <idlcompile srcdir="${src.dir}" destdir="${build.generated.sources.dir}/idl">
すると、プロジェクトペインの表示は次のように具合がよくなった。
高橋 徹 さんがほぼ5年前に更新
複数NICのマシン上で使用するNICを特定してCORBA通信を行う方法¶
-ORBListenEndpointsを指定します。
ネーミングサービスの起動¶
D:\work> ns -ORBListenEndpoints iiop://192.168.1.108:3626
ORBListenEndpointsでポート番号を固定したので、-DOAPort=3626 を省略してみたが接続可でした。
ネーミングサービス管理画面の起動¶
D:\work> nmg -ORBInitRef NameService=corbaloc::192.168.1.108:3626/NameService
ネーミングサービスはlocalhostではなく明示的なIPアドレスで接続する必要があります。
サーバーの起動¶
D:\work\counter\CounterServer> java -Djava.endorsed.dirs="C:\Program Files\Java\jacorb-3.9\lib" ^ -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB ^ -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton ^ -jar dist\CounterServer.jar ^ -ORBInitRef NameService=corbaloc::192.168.1.108:3626/NameService ^ -ORBListenEndpoints iiop://192.168.1.108: