プロジェクト

全般

プロフィール

調査 #107

未完了

JacORBを使ったCORBAサーバー・クライアントプログラムをNetBeansで作る

高橋 徹 さんが約4年前に追加. 約4年前に更新.

ステータス:
進行中
優先度:
通常
担当者:
-
カテゴリ:
Linux
対象バージョン:
-
開始日:
2020/03/14
期日:
2020/03/15 (4年以上 遅れ)
進捗率:

50%

予定工数:

説明

調査目的:

  • JacORBを使ったCORBAクライアント・サーバーのプログラムをNetBeansで作る方法を確立する
    NetBeansのAntプロジェクトでIDLのコンパイルを含めて構築方法を確立する

調査結果:

完了条件:

調査環境:

OS Windows 10 1909 64bit
Java Java SE Development Kit 8u241 64bit
NetBeans IDE 8.2

ファイル

JacORB_NameManager-1.png (5.59 KB) JacORB_NameManager-1.png JacORBのネーミングサービス管理ツールを起動、空のネーミングサービスの中身を表示 高橋 徹, 2020/03/15 18:42
JacORB_NameManager-2.png (6.53 KB) JacORB_NameManager-2.png JacORBのネーミングサービス管理ツールにサーバーオブジェクトが登録 高橋 徹, 2020/03/15 21:54
CounterIld_projectpain_generated-1.png (4.78 KB) CounterIld_projectpain_generated-1.png パッケージが一段ずれている 高橋 徹, 2020/03/15 23:20
CounterIld_projectpain_generated-2.png (4.93 KB) CounterIld_projectpain_generated-2.png パッケージが適切 高橋 徹, 2020/03/15 23:20

高橋 徹 さんが約4年前に更新

  • 説明 を更新 (差分)
  • ステータス新規 から 進行中 に変更
  • 進捗率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
    

高橋 徹 さんが約4年前に更新

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

高橋 徹 さんが約4年前に更新

JacORBネーミングサービスの起動方法を調査

JacORB Programming Guide の「25.2節 NS」に記載あり。
コマンドラインで次のいずれかを実行するとある

  1. $ ns <ファイル名> [タイムアウト]
  2. $ 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

JacORB_NameManager-1.png

と表示されればOKです。

高橋 徹 さんが約4年前に更新

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 に登録されたオブジェクトが確認できます。

JacORB_NameManager-2.png

備考)
仮想サーバー(Hyper-V)を稼働しているWindows 10マシンでは、ネットワークが複数作られており、ここでlocalhostを指定してネーミングサービスに接続すると、意図するネットワークとは別のネットワークで接続することがあります。
Programming Guide 3.2.7項 Listen Endpoints を参照すると制御ができると思われます。

高橋 徹 さんが約4年前に更新

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秒)

高橋 徹 さんが約4年前に更新

例外処理のコーディングメモ

  • 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.WrongPolicy
  • POAOperations#servant_to_reference(Servant servant)
    → org.omg.PortableServer.POAPackage.ServantNotActive
    → org.omg.PortableServer.POAPackage.WrongPolicy
  • NamingContextOperations#rebind(NameComponent[] n, org.omg.CORBA.Object obj)
    → org.omg.CosNaming.NamingContextPackage.NotFound
    → org.omg.CosNaming.NamingContextPackage.CannotProceed
    → org.omg.CosNaming.NamingContextPackage.InvalidName
  • POAManagerOperations#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

高橋 徹 さんが約4年前に更新

気付き事項

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">
    

すると、プロジェクトペインの表示は次のように具合がよくなった。

パッケージが適切

高橋 徹 さんが約4年前に更新

複数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:

他の形式にエクスポート: Atom PDF