ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

11.4.3 1プロセス-複数インタフェースの場合

IDLコンパイラがヘッダファイルにインプリメンテーションおよびインタフェースのリポジトリIDを出力します。

// IDL
module mod1 {
    interface intf1 {
        ... 
    };
};
    module mod2 {
    interface intf2 {
        ... 
    };
};

// *.h
#define _IMPL_mod1_intf1        "IDL:mod1/intf1:1.0"
#define _INTF_mod1_intf1        "IDL:mod1/intf1:1.0"
#define _IMPL_mod2_intf2        "IDL:mod2/intf2:1.0"
#define _INTF_mod2_intf2        "IDL:mod2/intf2:1.0"

上記のIDLの例では、インプリメンテーションリポジトリIDが2つ出力されます。
2つのインタフェースを1プロセスで実装する場合は、そのプロセスを表すインプリメンテーションリポジトリIDを1つ決めます。“IDL:*/*:1.0”の形式でなくてもかまいません。
このプロセスを表すインプリメンテーションリポジトリIDを“IDL:multi-interfaces:1.0”とした場合の例を以下に示します。


(1) インプリメンテーションの登録/活性化

OD_impl_instコマンドを使用して上記プロセスを表すインプリメンテーションリポジトリIDで登録します。
複数のインタフェースを実装するため、-axオプションの定義ファイルを使用して、実装するすべてのインタフェースリポジトリIDを定義する必要があります。

OD_impl_inst -ax def
defファイルの内容
rep_id              = IDL:multi-interfaces:1.0
type                = ..
                    :
IDL:mod1/intf1:1.0  = 
IDL:mod2/intf2:1.0  = 
                    :

サーバプログラムでこのプロセスを表すインプリメンテーションリポジトリIDの活性化を行います。

impl = FJ_ImplementationRep_lookup_id (
               impl_rep,
               "IDL:multi-interfaces:1.0",
               &env );
CORBA_BOA_impl_is_ready(boa, impl, &env );

(2) ネーミングサービスへの登録

OD_or_admコマンドを使用して、上記インプリメンテーションの登録時に指定したリポジトリIDでネーミングサービスに登録するオブジェクトリファレンスを作成します。

OD_or_adm -a IDL:multi-interfaces:1.0 -c IDL:mod1/intf1:1.0 -n mod1::intf1
OD_or_adm -a IDL:multi-interfaces:1.0 -c IDL:mod2/intf2:1.0 -n mod2::intf2

または、サーバプログラムを使用して、上記のOD_or_admコマンドと同様の処理を行います。

impl = FJ_ImplementationRep_lookup_id (
      impl_rep, 
      "IDL:multi-interfaces:1.0", 
      &env ); 

intf1 = CORBA_Repository_lookup_id(
      intf_rep, 
      _INTF_mod1_intf1, 
      &env ); 
intf2 = CORBA_Repository_lookup_id(
      intf_rep, 
      _INTF_mod2_intf2, 
      &env ); 

/* mod1/intf1のオブジェクトの作成 */
obj1 = CORBA_BOA_create( boa, &id, intf1, impl, &env ); 

/* mod1/intf1のネーミングサービスへの登録 */
name1._length = name1._maximum = 1; 
name1._buffer = &name1_component; 
name_component1.id = "mod1::intf1";
name_component1.kind = "";

CosNaming_NamingContext_bind(
      cos_naming, 
      &name1, 
      obj1, 
      &env); 

/* mod2/intf2のオブジェクトの作成 */
obj2 = CORBA_BOA_create( boa, &id, intf2, impl, &env ); 

/* mod2/intf2のネーミングサービスへの登録 */
name2._length = name2._maximum = 1; 
name2._buffer = &name2_component; 
name_component2.id = "mod2::intf2";
name_component2.kind = "";

CosNaming_NamingContext_bind(
      cos_naming, 
      &name2, 
      obj2, 
      &env);

(3) クライアントからのアクセス

インタフェース mod1/intf1 へは、名前“mod1::intf1”でネーミングサービスから取り出したオブジェクトを使用します。インタフェース mod2/intf2 へは、名前“mod2::intf2”でネーミングサービスから取り出したオブジェクトを使用してリクエストを発行します。