11.1.6 CORBAを使用してのコールバック・オブジェクトの準備(C++共同クライアント/サーバーのみ)

CORBAを使用してOracle Tuxedo C++コールバック・オブジェクトを設定するには、クライアントは次の処理を行う必要があります:

  1. コールバック・オブジェクト・モデルに適したポリシーを備えるPOAとの間に接続を確立します。(これはデフォルトで利用可能なルートPOAになることも、新規POAの作成が必要となることもあります。)
  2. サーバント(インタフェースのC++実装クラスのインスタンス)を作成します。
  3. サーバントでコールバック・オブジェクトに対するリクエストを受け付ける準備ができていることをPOAに通知します。技術的には、これはクライアントがPOA内のオブジェクトをactivateすること、つまりサーバントとObjectIdをPOAのアクティブ・オブジェクト・マップに入れることを意味します。
  4. ネットワークからのリクエストの受付けを開始するように、POAに指示します。これはつまり、POA自身をアクティブ化するということです。
  5. コールバック・オブジェクトのオブジェクト参照を作成します。
  6. オブジェクト参照を割り当てます。これは通常、パラメータとしてコールバック・オブジェクト参照を使用して別のオブジェクトに対する呼出しを行うことによってなされます。この別のオブジェクトは後になってから、コールバック・オブジェクトの呼出し(コールバック呼出しの実行)を行います。

クライアントがすでにORBへのリファレンスを取得済であれば、このタスクの実行に必要なORBおよびPOAとの対話は4回です。次のコード・スニペットに示すモデルのようになります。このモデルでは、ルートPOAのみが必要とされます。

// Create a servant for the callback Object
Catcher_i* my_catcher_i = new Catcher_i();
// Get root POA reference and activate the POA
1 CORBA::Object_var oref =
           orb->resolve_initial_references("RootPOA");
2 PortableServer::POA_var root_poa =
           PortableServer::POA::_narrow(oref);
3 root_poa -> the_POAManager() -> activate();
4 PortableServer::objectId_var temp_Oid =
            root_poa ->activate_object ( my_catcher_i );
5 oref = root_poa->create_reference_with_id(
            temp_Oid, _tc_Catcher->id() );
6 Catcher_var my_catcher_ref = Catcher::_narrow( oref );

Persistent/UserIdモデルを使用するには、POA作成時に、いくつかの追加ステップが必要です。さらに、クライアント側でObjectIdを指定します。これには、さらに別のステップが必要です。次のコード・スニペットに示すモデルのようになります。

Catcher_i* my_catcher_i = new Catcher_i();
const char* oid_str = "783";
1 PortableServer::objectId_var oid =
            PortableServer::string_to_objectId(oid_str);
// Find root POA
2 CORBA::Object_var oref =
           orb->resolve_initial_references("RootPOA");
3 PortableServer::POA_var root_poa =
           PortableServer::POA::_narrow(oref);
// Create and activate a Persistent/UserId POA
4 CORBA::PolicyList policies(2);
5 policies.length(2);
6 policies[0] = root_poa->create_lifespan_policy(
           PortableServer::PERSISTENT);
7 policies[1] = root_poa->create_id_assignment_policy(
           PortableServer::USER_ID );
8 PortableServer::POA_var my_poa_ref =
           root_poa->create_POA(
"my_poa_ref", root_poa->the_POAManager(), policies);
9 root_poa->the_POAmanager()->activate();
// Create object reference for callback Object
10 oref = my_poa_ref -> create_reference_with_id(
                                         oid, _tc_Catcher->id());
11 Catcher_var my_catcher_ref = Catcher::_narrow( oref );
// activate object
12 my_poa_ref -> activate_object_with_id( oid, my_catcher_i );
// Make the call passing the callback ref
    foo -> register_callback ( my_catcher_ref );

ここに記載したインタフェースと操作はすべて、標準的なCORBAインタフェースおよび操作です。