12. Object Broker JavaTM/C++

WebOTX Object Broker JavaTM/C++-->に関する注意事項/制限事項について説明します。

12.1. 注意事項(Java)

12.1.1. 互換性に関する注意事項

  1. WebOTX Ver6.1 (Object Broker Java Ver8.1) において Java リモート呼び出し (EJB、JNDI など) のタイムアウト時間の既定値を次のように変更しました。

    サーバでの処理に 30 秒以上かかる場合、タイムアウト時間が設定されていなければ、30 秒を経過した時点で例外 (CORBA の場合 NO_RESPONSE 例外) が発生します。必要に応じて、タイムアウト時間の設定を変更してください。 設定方法は、 [ アプリケーション開発ガイド(CORBA) > 1. CORBA アプリケーション > 1.2. プログラミング・開発ガイド > 1.2.2. Object Broker ] を参照してください。

  2. WebOTX Ver6.1 (Object Broker Java Ver8.1) において、Object Broker Java の AddWstringWidthOctet プロパティの既定値を true から false に変更しました。そのため、システム内で WebOTX Ver5.3 (もしくはそれ以前のバージョン) と バージョン6以降が混在する場合に通信に失敗する場合があります。その場合には、AddWstringWidthOctet プロパティの値が同じになるように設定してください。


  3. WebOTX Ver6.1 (Object Broker Java Ver8.1) において、以下のプロパティの既定値を変更しました。

    変更内容については、 [ リファレンス集 運用管理・設定編 > 1. コンフィグレーション(設定一覧) > 1.10. Object Broker > 1.10.2. Object Broker JavaにおけるORBのプロパティ定義 ] を参照してください。

  4. WebOTX Ver6.2 (Object Broker Java Ver8.2) において、通信プロトコルの改良を行いました。そのため、システム内で WebOTX Ver6.1 と Ver6.2 が混在する場合に通信に失敗する場合があります。その場合には Ver6.2 側の VersionCompatible プロパティに 810 を指定してください。


  5. WebOTX Ver6.21 (Object Broker Java Ver8.21) において、SoKeepAlive プロパティの既定値を false から true に変更しました。デフォルトで SO_KEEPALIVE ソケットオプションが有効になります。


  6. WebOTX V8.3 (Object Broker Java V10.3) において、RMI-IIOPの通信で、Value(Javaクラスのインスタンス) のマーシャル・アンマーシャル時に使用する内部クラスをキャッシュするようにデフォルトの動作を変更しました。 ただし、コードベースによるダウンロード機能を利用する場合や、アプリケーション間で配備対象のクラス(スタブや 送受信対象のクラス)に重複がある場合、java.lang.ClassCastException等の障害が発生する可能性があります。 障害が発生する場合は、キャッシュを行わないように次の設定を見直してください(デフォルト値はtrueです)。
    また、コードベースによるダウンロード機能を利用する場合やアプリケーション間で配備対象のクラスに重複 がある場合、同様にjava.lang.ClassCastException等の障害が発生する可能性があります。障害が発生する 場合には、キャッシュを行わないように次の設定を見直してください(デフォルト値はfalseです)。


  7. WebOTX V8.3 (Object Broker Java V10.3) において、ドメイン起動時に、デフォルトでOadJの自動起動を 行わないように変更しました。スタンドアロンで動作するJavaのCORBAサーバを運用する場合には、自動起動を 行うように設定変更を行ってください。

    otxadmin> set server.objectbrokerservice.oadj.Startup=true

12.1.2. その他の注意事項

  1. Windows版ではサーバプロセスを終了させるメソッド呼び出しでエラーが 返ることがあります。このときサーバプロセスは正しく終了しています。 なお、サーバメソッド内でjava.lang.System.exitメソッド等により終了すると、 どのOSでも必ずエラーが返ります。exitで直接終了するとORBに制御が移らない ことから、応答メッセージを送れないためです。
     
  2. long double型は「IDL to Java Language Mapping:ptc/00-02-07」で 規定されていないので実装されていません。
     
  3. 名前サービスにおいて、kindに"_RR"を含む名前を登録してはいけません。 ラウンドロビン機能が使用します。
     
  4. インプリメンテーション名に"CacheNameService"を使用してはいけません。 WebOTX Object Brokerが使用します。
     
  5. Object Broker JavaTM は JNI を使用しています。Object Broker JavaTM は次の JNI ライブラリをロードします。
    Windows
    C:\Program Files\NEC\WebOTX\ObjectBroker\bin\ospijni.dll
    Windows(x64またはItanium)
    C:\Program Files\NEC\WebOTX\ObjectBroker\bin\ospijni64.dll
    HP-UX (PA-RISC)
    /opt/ObjectSpinner/lib/libospijni.sl
    その他の UNIX
    /opt/ObjectSpinner/lib/libospijni.so

    Object Broker JavaTM の実装クラス群を -Xbootclasspath オプションに指定して java コマンドを実行した場合、以下のいずれかの設定が必要です。

    1. sun.boot.library.path システムプロパティに、JNI ライブラリが格納されているディレクトリを追加する
      (sun.boot.library.path システムプロパティには、その JavaVM が必要とする JNI ライブラリのディレクトリをすべて指定する必要があります)
    2. JavaVM が必要とする JNI ライブラリを以下のディレクトリにコピーする (UNIX の場合はシンボリックリンクでも可)
      Windows
      <JDK>\jre\bin (JRE の場合は <JRE>\<VERSION>\bin)
      UNIX
      <JDK>/jre/lib/<HW> (JRE の場合は <JRE>/lib/<HW>)

      ※<JDK>は使用するJDKのインストールディレクトリ、<JRE>は使用するJREのインストールディレクトリ、<VERSION>は使用するJREのバージョンを表します。<HW>はハードウェアによってディレクトリ名が異なります。

  6. IDL valuetypeに対する、ローカルスタブ、および値をローカルに渡すときの コピーセマンティクスについては、コピー時の性能を考慮してデフォルトでは 対応していません。ローカルコピーが必要な場合は、IDLコンパイラの-lcopy オプションを指定してください。 -lcopyオプションが指定されると、IDLコンパイラでは以下の型のオペレーション のinおよびinout引数に関して、ローカルコピーセマンティクスを展開します。
      valuetype型
      valuetype型のtypedef、sequence、array
      valuetype型をメンバに含むstructおよびunion型
    また、any型については実際の型が不確定であるため、valuetype型の使用の 有無に関わらず一律ローカルコピーの対象になります。
      any型
      any型のtypedef、sequence、array
      any型をメンバに含むstructおよびunion型
    any型に関するローカルコピーが不要の場合は、anyをローカルコピーの対象外 とする-noanycopyオプションが用意されています。
     
  7. CSIv2 機能を使用する場合は原則として SSL を同時に使用することが必要です。SSL を使用せずに CSIv2 機能を使用するには、UseCSI プロパティに nossl と指定してください。この場合、セキュリティ関連のデータが暗号化されずに通信されます。


  8. システムの負荷が高い場合などに、OadJの起動に30秒以上かかった場合、アライブチェックモニタで以下のようなエラーが検出されることがあります。
    ERROR com.nec.webotx.enterprise.system.notification - OTX01200012:is not alive :(ドメイン名):category=monitor,type=alive-check-monitor,J2EEServer=server,name=WebOTXObjectBrokerOadJService-state
    統合運用管理ツール画面の「(ドメイン名)」-「アプリケーションサーバ」-「ObjectBrokerサービス」-「oadj」の「状態」タブで「監視間隔」属性を 60000(ミリ秒)程度に長くすることで、回避可能です。

12.2. 制限事項(Java)

12.2.1. RMI-IIOP のダイナミック・プロキシによる通信モード使用時の制限事項

  1. RMI-IIOP のダイナミック・プロキシによる通信モードを使用する場合は、javax.rmi.PortableRemoteObject.narrow()の戻り値で取得したオブジェクトを、さらにnarrowの引数に渡してオブジェクトの取得を行うことはできません。

12.2.2. その他の制限事項

  1. org.omg.DynamicAny.DynValueと、org.omg.DynamicAny.DynAnyの以下の オペレーションは実装していません。
      org.omg.DynamicAny.DynAny.insert_valuetype
      org.omg.DynamicAny.DynAny.get_valuetype
     
  2. パラメータレベルのフックは使用できません。 これは、IDLコンパイラ(i2j)が既定値で出力するスタブ/スケルトンを 性能に有利なStream-based形式で出力するためです。もし、パラメータ レベルのフックが必要な場合には、IDLコンパイラの-notstreamオプション を使用して、旧形式(DII/DSI-based)のスタブ/スケルトンを出力して ください。
     
  3. SINGLE_THREAD_MODEL(POAポリシー)の実装オブジェクトを、 PerClientThread(サーバ処理スレッドポリシー)で動作させる場合、 GIOP1.2のフラグメントメッセージを正常に受信できない場合があります。
     
  4. JDK 1.4でCORBAの実装が変更された結果、JDKとObject Broker JavaTMのCORBAの実装で、一部、不整合が生じています。その影響で、ServantLocatorを使用する特殊なアプリケーション(例:Object Broker JavaTMサンプルのPOA3、POA4、POA6、POA7、POA8、POA9、POA14 のようなアプリケーション)では、バージョン1.4以降のJDKで動作する場合に、Xbootclasspathオプションを指定してObject Broker JavaTMのライブラリを優先させる必要があります。
    Object Broker JavaTMでは、インタフェースの互換を保つため、org.omg.PortableServer.Servant関連クラスの修正を行っていません。
     
  5. JDK5.0を使用して、CORBAアプリケーションのコンパイルを行った場合、以下のような注意文が表示されます。
     注: Sample.java の操作は、未チェックまたは安全ではありません。
     注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
     

12.3. 注意事項(C++)

  1. ソケットの共有に関して: クライアントスレッドの数、サーバプロセス内のオブジェクトの数に関連なく、クライアントプロセスとサーバプロセスの間に1つのTCP/IPコネクションを作り共有することができます。この場合、並行して複数の呼び出しを行っているときに、そのうちのどれか1つの呼び出しがエラー(通信エラー、タイムアウト)を起こすと、他のすべての呼び出しも同様のエラーとなります。独立性を高めるためのソケットを一切共有しない設定も可能です。ただし、共有しない場合は毎回TCP/IPのコネクションを開設して利用後に閉じますので性能は若干低下します。


  2. ソケット共有時のエラーに関して: クライアントは終了せずに同一サーバに対して複数回の呼び出しを行なうとします。サーバプロセスがクライアントからの1つの呼び出し完了後、次の呼び出しまでの間にいったん終了すると、サーバの終了直後にクライアントが行ったオブジェクト呼び出しが通信エラーとなります。このとき、再度オブジェクト呼び出しを行うと正常に通信が行われます。なおコネクションの共有をしない場合はこのエラーは起こりません。


  3. イベントチャネルに関して: 接続断検出を行わない場合は、イベントチャネルの利用者が明示的にdisconnectを呼ばない限り接続が残っているものとして扱われます。


  4. instif, rmifコマンドを実行すると処理が終了するまで^Cを受け付けません。もし間違った情報を登録してしまったときは、いったんrmifで間違った情報を削除してinstifしなおしてください。


  5. rmifしてもInterfaceRepository.irfにstring, sequence, arrayの情報が残ります。これは、string, sequence, arrayには名前がないためです。


  6. instifが異常終了したときは不完全なインタフェース情報がインタフェースリポジトリに登録されてしまうことがあります。不完全なインタフェース情報が登録されてしまったときにはrmifコマンドでいったんインタフェース情報を抹消してから再登録してください。


  7. rmifはインタフェース情報を登録したときに用いた.ifファイルと厳密に一致しなくてもインタフェース情報を削除します。


  8. ListenBackLogの数値が不足していると、サーバプロセス(たとえば、名前サービス)は立ち上がっているにも関わらず、アクセスできないという現象が発生することがあります。目安としては、OSのソケットの上限の許す範囲で、最大同時アクセスユーザ数×2を設定してください。


  9. LocalStub経由では、POAManagerがholding状態であってもactive状態と同様、ただちにリクエストが処理されます。リクエストを貯えることはありません。


  10. ObjectSpinnerのバージョン4.1までとそれ以降では、インタフェースリポジトリに互換性がありません。バージョン4.1までのインタフェースリポジトリ用に作られたアプリケーションとそれ以降 のインタフェースリポジトリ、もしくはその逆の組み合わせでは通信ができません。また、インタフェース情報を記録しているファイル(InterfaceRepository.irf)にも互換性がありません。


  11. アプリケーションは、"-ORBInitRef"および"-ORBDefaultInitRef"をアプリケーション独自の意味を持つ引数として使用してはいけません。例えば、下記に示すアプリケーション"my_app"は正しく動作しません。ORBのライブラリは"-ORBInitRef"キーワードがあると、その直後にURLがあることを期待します。


  12. # my_app -my_option -ORBInitRef

  13. 名前サービスにおいて、kindに"_RR"を含む名前を登録してはいけません。ラウンドロビン機能が使用します。


  14. インプリメンテーション名に"CacheNameService"を使用してはいけません。Object Brokerが使用します。


  15. ObjectSpinnerのバージョン4.3までの名前サーバで作成したnamesv.ndfを読み込むことはできますが、その逆はできません。また、一度バージョン4.4以降の名前サーバに読み込まれたnamesv.ndfは、バージョン4.3までの名前サーバでは使えません。


  16. 以下のサーバとコードセットを使用して通信を行なうには、C++もしくはVBクライアント側で、SendCodeSetContextEverytimeの設定を"on"または"true"にする必要があります。



  17. 旧版のObjectSpinner(oad -v で内部リビジョンが1.13以下の場合)および、omg.org/を含むリポジトリIDに対応していない他社製品と通信する場合、および旧版開発キットで作成されたアプリケーションを使用する場合、次の設定を行ってください。

  18. 名前 omg.org/が取り除かれる箇所
    SysExcWithOMGORG off 例外
    NameServiceIdWithOMGORG off 名前サービスオブジェクト

  19. クライアント側のフック機能を使用する場合、IDLコンパイラのコンパイルオプションに-Xdiiが必要です。


  20. HP-UX 11.0上でaC++を使用すると、302、740、749のWarningが出力されます。このWarning出力を抑制する場合は、「+W302,740,749」を指定してください。


  21. Windows95/Windows98/WindowsMEはクライアントOSであるため、他のサーバOSに比べソケットリソースの上限が低くなっています。そのため、複数のサーバプロセスまたはクライアントプロセスを動作させると、NO_MEMORYエラーまたはENOBUFSエラーが発生する場合があります。


  22. IDLコンパイラのコンパイルオプションとして-I,-D,-Uを使用する場合には、オプションに続いてディレクトリまたはマクロを必ず指定してください。


  23. LINUX版でのFD_SETSIZEはシステムのデフォルトの値を使用します。RedHat7.1では1024となっています。


  24. LINUX版のコンパイルオプションに関して必ず-D_GNU_SOURCEを指定してコンパイルを行ってください。


  25. MesBufSizeのデフォルト値は8192ですが、Windows版では設定により4096になっています。MesBufSizeを増加させた場合にパフォーマンスが極端に落ちる場合には、設定SockBufSizeの値もあわせて増加させる必要があります。


  26. R5.1でCORBA::Anyに次のオペレータが追加されました。

    ・CORBA::Any::operator<<=(char*) // 文字列の挿入
    ・CORBA::Any::operator>>=(const char*&) const // 文字列の取り出し
    ・CORBA::Any::operator>>=(const CORBA::Any*&) const // Anyの取り出し

    R4.5以前で次のオペレータを使用していた場合、引数の型によっては、 前述のオペレータが呼ばれることがあり、その場合は動作が変わります。

    ・CORBA::Any::operator<<=(const char*) // 文字列の挿入
    ・CORBA::Any::operator>>=(char*&) const // 文字列の取り出し
    ・CORBA::Any::operator>>=(CORBA::Any&) const // Anyの取り出し

    詳細はリファレンスマニュアルの「クラスAny」を参照してください。


  27. R4.5以前とR5.1以降では、コードセットに関する設定の名前、内容、既定値が異なります。詳細は、運用マニュアルの「コードセットに関するオプション設定」を参照してください。


  28. aCCバージョンA.03.30以上のバージョンでインライン展開の不具合が確認されております。該当のaCCバージョンをご使用の場合は、コンパイルオプションに+d(インライン展開を行わない)を指定してください。
    下記のプログラムをコンパイル、実行した結果、"OK"と表示されない場合は、この問題に該当しています。この場合は、コンパイルオプションに+dを指定してください。
    #include <stdio.h>
    
    class A {
        public:
            A();
    };
    
    class B {
        public:
            B();
    };
    
    B::B()
    {
        A* a = new A;
    }
    
    static B __class_b;
    
    A::A()
    {
        printf("OK\n");
    }
    
    int main(int argc, char** argv)
    {
    //    B __class_b;
        return 0;
    }

  29. コネクション無効時のリトライを有効にした場合、コネクション無効を検出するタイミングによっては、同一の要求メッセージがサーバに送信されてしまうことがあります。


  30. 名前サーバが使用するポート番号の既定値は、CORBA標準仕様に合わせ2809となっています。Windowsでは、このポート番号が他のプロセスの一時ポートとして使用される場合があり、 この場合、ポートが開けず、名前サーバの起動に失敗することがあります。特定のポート番号が、他のプロセスの一時ポートとして使用されることを回避するためには、下記の設定が有効です。


  31. レジストリの HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters配下に以下の項目を追加します。

    名前 種類
    ReservedPorts REG_MULTI_SZ 一時ポート番号として使用されない範囲 (xxxx-yyyyの形式でポートの範囲を指定)

    例)2800番から2810番までを指定する場合
    2800-2810

    この設定変更後はマシンの再起動が必要です。

  32. Windows上でコンパイルを行う場合、orb.hより先にwindows.hをインクルードすることはできません。 orb.hより先にwindows.hをインクルードしてしまうと、ソケットAPIにWinSock1が設定され、Object Broker C++が使用するWinSock2の設定と競合してコンパイルエラーが発生します。 orb.hの中でwindows.hをインクルードしていますので、windows.hを参照するヘッダファイルはorb.hの後にインクルードするようにしてください。


  33. WebOTX V9.2 (Object Broker C++ V11.2) より、WebOTXドメインのObject Brokerサービスにおいて、oadプロセスの起動をデフォルトで抑止しました。
    これに伴い、Object Brokerコンフィグに、oadを使用するか否かの設定「UseOad(oadを使用)」(既定値:false)を追加しました。

    次のような場合には、oadを起動する設定に変更してください。

    WebOTXドメイン外での起動(Windowsのサービス、Unixの起動スクリプトによる起動)については、これまでと同様にoadプロセスをデフォルトで起動します。


12.4. 制限事項(C++)

  1. WebOTX Object Broker R6.1とObjectSpinner R5.Xおよびこれ以前の版を 利用するアプリケーションが相互に通信する環境では、次の制限があります。

    1. R5.12(およびそれ以前)のライブラリの制限
    R5.12(およびそれ以前)のライブラリを利用し、R6.10以降の名前サーバに対して、INS(インタオペラブル名前サーバ)へのオブジェクト呼び出しを行う場合、R6.10パッケージ付属のライブラリへの置換が必要です。

    2. R5.12(およびそれ以前)の名前サーバの制限
    R5.12(およびそれ以前)名前サーバはINS形式のオブジェクトキーを処理できません。INSによるオブジェクト呼び出しを行うときは、corbalocサーバ経由で名前サーバを呼び出す必要があります。その場合、INS URLのポート番号は、corbalocサーバのポート番号でなければなりません。

    3. R6.10の仕様変更
    R6.10のINS URLでは省略時のポート番号が以前と異なります。これは、OMGで仕様の明確化(省略時ポート番号の決定)が行われたためです。

    4. R6.10の仕様変更(上記1,2の制限解除)
    従来、INSによる呼び出しはcorbalocサーバと名前サーバの2段階処理でしたが、R6.10からは名前サーバが直接INSによる呼び出しを受けることができるようになりました。

    このため、運用形態としては以下をおすすめします。

    R6.10以降だけで構成されているシステムの場合:

    名前サーバ動作マシン:
    NameServicePort 2809
    CorbalocServerPort 変更不要
    CorbalocDefaultPort 2809
    corbalocサーバは起動しません。

    クライアントマシン:
    CorbalocDefaultPort 2809

    R6.10とR5.XあるいはR4.Xで構成されているシステムの場合:
    ただし、R5.X、R4.X側でcorbalocに関する設定変更を行っていないことが下記設定を使用できる条件です。

    R6.10名前サーバ動作マシン:
    NameServicePort 9827
    CorbalocServerPort 変更不要
    CorbalocDefaultPort 9827
    corbalocサーバは起動しません。

    R6.10クライアントマシン:
    CorbalocDefaultPort 9827

    R5.X、R4.X名前サーバ動作マシン:
    R6.10パッケージ付属の互換ライブラリをインストールします。
    設定変更は不要です。下記設定となっていることを確認してください。
    NameServicePort 変更不要
    CorbalocServerPort 9827(未設定時既定値)
    CorbalocDefaultPort 9827(未設定時既定値)
    corbalocサーバを起動します。

    R5.X、R4.Xクライアントマシン:
    R6.10パッケージ付属の互換ライブラリをインストールします。
    設定変更は不要です。下記設定となっていることを確認してください。
    CorbalocDefaultPort 9827(未設定時既定値)

  2. wchar, wstring型のconst宣言は、IDL定義に記述することはできません。


  3. IDL定義中のグローバルスコープにおいてインタフェースのtypedefを行った場合、typedefされた側の型を継承したオブジェクト(サーバント)の実装をすることはできません。


  4. 以下のIDL定義は、instifコマンドを用いてインタフェースの登録をすることができません。

    ・union型のcase文に、-1を利用する場合
    ・union型、struct型をネストして定義をする場合

  5. 多重化オブジェクトに含まれるIORに、コネクション制御ポリシーとして"ByReference"が指定されている場合は、コネクションラウンドロビン機能は利用できません。


  6. charの配列にマルチバイトの文字列を入れて通信を行なっても文字コード変換処理は行なわれません。文字コード変換の対象となる型はstring, wstring, wcharです。


  7. CORBAのCloseConnectionメッセージを正しく処理することができません。CloseConnectionメッセージを受信後も、サーバ側から切断されるTCP/IPのコネクションを使用し続けるため、リクエスト送信時に例外が発生します。 この問題を回避するためには、クライアント無通信監視タイマを指定することで、サーバ側からCloseConnectionメッセージが送信される前にクライアント側でTCP/IPのコネクションを切断するようにしてください。


  8. OSF_SJIS1(シフトJIS)とUTF8のコード変換機能では、Unicodeのサロゲートペアに該当する文字の変換を行うことはできません。wchar/wstringを使用してUnicodeで送受信してください。


  9. WebOTX V8.3 (Object Broker C++ V10.3)より、orbcustmのマニフェストから権限昇格(requireAdministrator)の指定を削除しています。
    WindowsのUAC(User Account Control)が有効な環境下で、orbcustmを用いて設定を更新する場合、管理者として実行する必要があります。


  10. WebOTX V8.4 (Object Broker C++ V10.4) より、LogLimitの既定値を0(上限無し)から10240(キロバイト)に変更しています。