Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第11章 CORBAアプリケーションの高度な使い方> 11.3 複数インタフェースの1プロセスへの実装

11.3.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) インプリメンテーションの登録/活性化

 コマンドを使って上記プロセスを表すインプリメンテーションリポジトリ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"でネーミングサービスから取り出したオブジェクトを用いてリクエストを発行します。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005