この章では、CORBA共同クライアント/サーバーおよびC++ OracleWrapper Callbacks APIのプログラミング要件を説明します。
注: | Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBはTuxedo 8.1で非推奨になり、Tuxedo 9.xではサポートされなくなりました。 Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBのすべてのテキスト・リファレンスや関連するサンプル・コードは、以下の場合にのみ使用してください。 |
注: | サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートまたはドキュメントは提供していません。 |
プログラマは、Oracle TuxedoのCORBAクライアントと共同クライアント/サーバー(オブジェクト呼出しの受信と処理が可能なクライアント)のどちらかに合わせて、クライアントのmain()を記述します。main()
はOracle Tuxedo CORBA環境オブジェクトを使用して接続を確立し、セキュリティを設定し、トランザクションを開始します。
Oracle Tuxedoクライアントは、オブジェクトの操作を呼び出します。DIIの場合、クライアント・コードによってDII Requestオブジェクトが作成され、そのDII Requestの2つの操作のうち一方が呼び出されます。静的呼出しの場合は、クライアント・コードによって、通常の呼出しに似た呼出しが実行されます。これは結果的には、生成されたクライアント・スタブ内のコードを呼び出すことになります。加えて、クライアントのプログラマはOMGによって定義されるORBインタフェースと、Oracle Tuxedoソフトウェアと共に供給されるOracle Tuxedo CORBA環境オブジェクトを使用して、Oracle Tuxedo固有の機能を実行します。
Oracle Tuxedo共同クライアント/サーバー・アプリケーションでは、クライアント・コードはコールバックOracle Tuxedoオブジェクト用のサーバーとして動作できるように構成する必要があります。そのようなクライアントはTPフレームワークを使用しません。また、Oracle Tuxedoシステムの管理下には置かれません。これはプログラミングに影響を及ぼすほか、CORBA共同クライアント/サーバーにはOracle Tuxedo CORBAサーバーと同じようなスケーラビリティや信頼性がなく、またTPフレームワークで使用できるような状態管理機能やトランザクション機能もないということを意味します。これらの特性を必要とするユーザーは、Oracle Tuxedo CORBAのクライアントではなくサーバーに、オブジェクトを実装するようアプリケーションを構成する必要があります。
以下のセクションでは、Oracle Tuxedoクライアントにコールバックのサポートを追加するために使用するメカニズムを説明します。場合によっては、このメカニズムはTPフレームワークを使用するOracle Tuxedoサーバーのメカニズムと対比されます。
Oracle Tuxedoサーバーでは、buildobjserver
コマンドを使用して、C++サーバー用のメイン・プログラムを作成します。(Oracle Tuxedoのリリース8.0以降では、Javaサーバーはサポートされていません。)サーバーのメイン・プログラムは、サーバー機能におけるOracle TuxedoおよびCORBA関連の初期化を担当します。しかし、Serverオブジェクトの実装を行うので、サーバー・アプリケーションの初期化と停止の方法をカスタマイズする機会があります。サーバーのメイン・プログラムは、Serverオブジェクトに対し、適切な時点で自動的にメソッドを呼び出します。
対照的に、Oracle Tuxedo CORBA共同クライアント/サーバーでは、Oracle Tuxedo CORBAクライアントと同様に、ユーザーがメイン・プログラムを作成し、すべての初期化を担当します。メイン・プログラムの完全な制御権があり、都合の良いように初期化および停止のコードを指定することができるため、Serverオブジェクトを実装する必要はありません。
共同クライアント/サーバーのみで必要な初期化については、「サーバント」で説明します。
共同クライアント/サーバー用のサーバント(メソッド・コード)は、サーバー用のサーバントに非常に似ています。すべてのビジネス・ロジックが、同じように記述されます。違いは、TPフレームワークを使用しないことによって生じたものです。つまり主な相違点は、CORBA関数をTPフレームワーク経由で間接的に使用するのではなく、直接使用するということです。
Oracle Tuxedo CORBAサーバーでは、Server
インタフェースを使用して、ORBがオブジェクトに対するリクエストを受信したときに、TPフレームワークがそのオブジェクトのためのサーバントの作成をユーザーに求められるようにします。しかし、共同クライアント/サーバーでは、リクエストが届く前にサーバントを作成する役割をユーザー・プログラムが担います。したがって、Server
インタフェースは不要です。通常、プログラムはサーバントを作成してから、オブジェクトへのリファレンスを渡す前に、そのオブジェクトをアクティブ化します。これには、サーバントとObjectId
を使用します。ObjectId
はおそらく、システムで生成されています。そのようなオブジェクトは、コールバックの処理に使用されていると考えられます。したがって、サーバントは既に存在しており、オブジェクトは、そのオブジェクトに対するリクエストが届く前に、アクティブ化されます。
C++共同クライアント/サーバーの場合、ある特定の操作を実行するには、TP
インタフェースを呼び出すのではなく、TP
インタフェースの内部機能であるORBとPOAの呼出しをクライアント・サーバントから直接行います。また、ORBおよびPOAとの対話の多くは、すべてのアプリケーションで同じなので、使いやすくするため、クライアント・ライブラリにより、単一の操作を使用して同じことを行う便利なラッパー・オブジェクトを提供することもできます。便利なラッパー・オブジェクトの使い方については、「サポートされているコールバック・オブジェクト・モデル」および「OracleWrapper Callbacksを使用してのコールバック・オブジェクトの準備」を参照してください。
コールバックをサポートするクライアントでは、サーバーの場合と同様に、IDLコンパイラ(idl
)によって生成されたものと同じスケルトン・クラス名から継承した実装クラスを記述します。
interface Hospital{ … };
idl
コマンドによって生成されたスケルトンには、次のように、ユーザー記述クラスの継承元である「スケルトン」クラスPOA_Hospital
が包含されます。
class Hospital_i : public POA_Hospital { ... };
サーバーでは、スケルトン・クラスはTPフレームワーク・クラスTobj_ServantBase
から継承します。これがさらに、定義済のPortableServer::ServantBase
から継承しています。
共同クライアント/サーバーのコールバック・オブジェクトの実装における継承ツリーは、サーバーにおけるものとは異なります。スケルトン・クラスはTPフレームワーク・クラスTobj_ServantBase
からは継承しませんが、直接PortableServer::ServantBase
から継承します。この振る舞いは、idl
コマンドで-P
オプションを指定することによって行われます。
サーバントの継承ツリーにTobj_ServantBase
クラスがないということは、そのサーバントにactivate_object
メソッドとdeactivate_object
メソッドがないことを意味します。サーバーでは、これらのメソッドはTPフレームワークによって呼び出され、サーバントに対してあるメソッドを呼び出す前に、そのサーバントの状態を動的に初期化して保存します。コールバックをサポートするクライアントの場合は、明示的にサーバントを作成し、サーバントの状態を初期化するコードを記述する必要があります。
Oracle Tuxedo CORBAは、4種類のコールバック・オブジェクトをサポートしており、その中で一般的である3種類に対してはラッパーを提供しています。これらのオブジェクトは、POAポリシーにおける3つの組合せに対応しています。POAポリシーは、使用可能なオブジェクトの型と、オブジェクト参照の型の両方を制御します。
これらのオブジェクトについては、ORBとPOAによる扱われ方の詳細ではなく、主に動作特性との関連で説明します。これらの詳細は、直接的なORBおよびPOAの呼出し(CORBAサーバーに関して特別な知識が少し必要)を使用するか、またはORBおよびPOAの呼出しを隠ぺいするOracleWrapper Callbacksインタフェース(詳細については考慮しないユーザー向け)を使用して、以下のセクションで説明します。
ObjectId
はクライアント・アプリケーションによって割り当てられるのではなく、システムによって割り当てられる、一意の値です。この型のオブジェクトは、クライアントが終了するまでの間のみクライアントによって受信される呼出しに有用です。(対応するPOA LifeSpanPolicy値はTRANSIENT
で、IdAssignmentPolicyはSYSTEM_ID
です。) ObjectId
はクライアント・アプリケーションによって割り当てられるのではなく、システムによって割り当てられる、一意の値です。この型のオブジェクトおよびオブジェクト参照は、クライアントがある一定期間内で起動したり終了する場合に有用です。稼動中のクライアントは、その特定のオブジェクト参照に対するコールバック・オブジェクトを受信できます。PERSISTENT
およびSYSTEM_ID
です。)ObjectId
がクライアント・アプリケーションによって割り当てられなければならない点を除いては、Persistent/SystemIdと同じです。該当するObjectId
としては、たとえばクライアントに対してのみ意味を持つデータベース・キーなどが考えられます。(対応するPOAポリシーの値は、PERSISTENT
およびUSER_ID
です。)注: | Transient/UserId ポリシーの組合せは、特に重要なものであるとは見なされません。永続的なケースのどちらかに類似した方式で、ユーザーがPOAを使用して自給することは可能ですが、Oracle Tuxedoラッパーは、特にそのために有用なわけではありません。 |
注: | Oracle Tuxedo CORBAのネイティブ共同クライアント/サーバーでは、永続ポリシーはどちらもサポートされません。一時ポリシーのみがサポートされます。 |
Oracle Tuxedoサーバーがリモート共同クライアント/サーバー・オブジェクト、つまりOracle Tuxedoドメイン外部の共同クライアント/サーバー・オブジェクトを呼び出せるようにするには、アウトバウンドIIOPが有効になるようにサーバーを構成する必要があります。この機能は、IIOPサーバー・リスナー(ISL)コマンドで-O
(大文字のO)オプションを指定することによって有効化されます。-O
オプションを設定すると、IIOPリスナー・ハンドラ(ISH)に接続されていない共同クライアント/サーバー・オブジェクトに対するアウトバウンド呼出し(アウトバウンドIIOP)が有効になります。
ISLコマンド・オプションの設定は、サーバーのUBBCONFIG
ファイルのSERVERS
セクションで行います。アウトバウンドIIOPのサポートには、少量の予備リソースが必要なので、デフォルトではアウトバウンドIIOPは無効になっています。詳細は、『Oracle Tuxedoアプリケーションの設定』の「ISLコマンドを使用してアウトバウンドIIOPを構成する」およびBEA Tuxedoコマンド・リファレンスの「ISL(1)」
を参照してください。
CORBAを使用してOracle Tuxedo C++コールバック・オブジェクトを設定するには、クライアントは次の処理を行う必要があります。
activate
すること、つまりサーバントとObjectId
をPOAのアクティブ・オブジェクト・マップに入れることを意味します。クライアントがすでにORBへのリファレンスを取得済であれば、このタスクの実行に必要なORBおよびPOAとの対話は4回です。リスト11-1に示すモデルのようになります。このモデルでは、ルート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
を指定します。これには、さらに別の手順が必要です。リスト11-2に示すモデルのようになります。
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インタフェースおよび操作です。
C++の共同クライアント/サーバーのどちらかを記述するには、OracleWrapper Callbacks APIを使用します。
コールバック・オブジェクトに必要なコードは、コールバックをサポートするどのクライアントについてもほぼ同一であるため、共同クライアント/サーバー用のライブラリで提供されているOracleWrapperを使用すると便利なことがあります。
リスト11-3に示すように、OracleWrapperはIDLで記述されます。
// File: BEAWrapper
#ifndef _BEA_WRAPPER _IDL_
#define _BEA_WRAPPER _IDL_
#include <orb.idl>
#include <PortableServer.idll>
#pragma prefix “beasys.com”
moduleBEAWrapper
{
interfaceCallbacks
{
exception ServantAlreadyActive{ };
exception ObjectAlreadyActive { };
exception NotInRequest{ };
// set up transient callback Object
raises (ServantAlreadyActive);
// -- prepare POA, activate object, return objref
Object start_transient(
in PortableServer::Servant Servant,
in CORBA::RepositoryId rep_id)
// set up persistent/systemid callback Object
Object start_persistent_systemid(
in PortableServer::Servant servant,
in CORBA::Repository rep_id,
out string stroid)
raises (ServantAlreadyActive);
// reinstate set up for persistent/systemid
// callback object
Object restart_persistent_systemid(
in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id,
in string stroid)
raises (ServantAlreadyActive, ObjectAlreadyActive);
// set up persistent/userid callback Object
Object start_persistent_userid(
in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id,
in string stroid)
raises (ServantAlreadyActive, ObjectAlreadyActive);
// stop servicing a particular callback Object
// with the given servant
void stop_object( in PortableServer::Servant servant);
//Stop all callback Object processing
void stop_all_objects();
// get oid string for the current request
;
string get_string_oid() raises (NotInRequest)
};
}
#endif /* _BEA_WRAPPER _IDL_ */
リスト11-4に示すように、OracleWrapperはC++で記述されます。
#ifndef _BEAWRAPPER_H_
#define _BEAWRAPPER_H_
#include <PortableServer.h>
class BEAWrapper{
class Callbacks{
public:
Callbacks (CORBA::ORB_ptr init_orb);
CORBA::Object_ptr start_transient (
PortableServer::Servant servant,
const char * rep_id);
CORBA::Object_ptr start_persistent_systemid (
PortableServer::Servant servant,
const char * rep_id,
char * & stroid);
CORBA::Object_ptr restart_persistent_systemid (
PortableServer::Servant servant,
const char * rep_id,
const char * stroid);
CORBA::Object_ptr start_persistent_userid (
PortableServer::Servant servant,
const char * rep_id,
const char * stroid);
void stop_object(PortableServer::Servant servant);
char* get_string_oid ();
void stop_all_objects();
~Callbacks();
private:
static CORBA::ORB_var orb_ptr;
static PortableServer::POA_var root_poa;
static PortableServer::POA_var trasys_poa;
static PortableServer::POA_var persys_poa;
static PortableServer::POA_var peruser_poa;
};
};
#endif // _BEAWRAPPER_H_
このC++ OracleWrapper CallbacksインタフェースAPIについては、以下のセクションで説明します。
Callbacksインタフェースへのリファレンスを返します。
BEAWrapper::Callbacks( CORBA::ORB_ptr init_orb);
init_orb
CORBA::IMP_LIMIT
BEAWrapper::Callbacks
クラスはすでにORBポインタでインスタンス化されています。プロセス内で使用できるこのクラスのインスタンスは1つだけです。より柔軟性が必要なユーザーは、POAを直接使用する必要があります。
コンストラクタは、Callbacksインタフェースへのリファレンスを返します。複数のスレッドが使用されている場合でも、プロセスのために作成するそのようなオブジェクトは1つのみとします。複数のオブジェクトを使用すると、未定義の振る舞いが発生します。
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
Object start_transient( in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id)
raises ( ServantAlreadyActive );
CORBA::Object_ptr start_transient(
PortableServer::Servant servant,
const char* rep_id);
servant
rep_id
ServantAlreadyActive
ObjectId
が1つのコールバックのみに使用できます。複数のObjectId
があるオブジェクトに対するコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop_object
操作がシステムに対して、サーバントを元のObjectId
について使用することを止めるように指示する場合のみです。
CORBA::BAD_PARAM
CORBA::Object_ptr
ObjectId
と、ユーザーが指定したrep_id
で作成されたオブジェクトへのリファレンス。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()
操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。変換が終了したときにオブジェクトを解放するのは、呼出し側の役割です。
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、出力パラメータstroid
を設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
Objectstart_persistent_systemid
(
in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id,
out string stroid)
raises ( ServantAlreadyActive );
CORBA::Object_ptrstart_persistent_systemid
(
PortableServer::Servant servant,
const char* rep_id,
char*& stroid);
servant
rep_id
stroid
restart_persistent_systemid
でオブジェクトを再アクティブ化する場合に、これを使用します。
ServantAlreadyActive
ObjectId
が1つのコールバックのみに使用できます。複数のObjectId
があるコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop
操作がシステムに対して、元のObjectId
についてこのサーバントを使用することを止めるように指示する場合のみです。
CORBA::BAD_PARAMETER
CORBA::IMP_LIMIT
rep_id
型のサービス・オブジェクトに与えられたServant
を使用するオブジェクトをアクティブ化します。これには、システムによって生成されたObjectId
を使用します。 stroid
を、システムによって割り当てられたObjectId
の文字列化されたバージョンに設定します。 rep_id
で、同じObjectId
についてサーバントをアクティブ化した場合に、サーバントはその同じオブジェクト参照に対して行われたリクエストを受け付けます。ObjectId
はシステムによって生成されているため、アプリケーションはそのObjectId
を保存しておく必要があります。CORBA::Object_ptr
ObjectId
と、ユーザーが指定したrep_id
で作成されたオブジェクト参照。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()
操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。変換が終了したときにオブジェクトを解放するのは、呼出し側の役割です。
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
Objectrestart_persistent_systemid
(
in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id,
in string stroid)
raises (ServantAlreadyActive, ObjectAlreadyActive);
CORBA::Object_ptrrestart_persistent_systemid(
PortableServer::Servant servant,
const char* rep_id
const char* stroid);
servant
rep_id
stroid
ObjectId
の文字列化されたバージョン。start_persistent_systemid
に対する以前の呼出しから返されたものである必要があります。
ServantAlreadyActive
ObjectId
が1つのコールバックのみに使用できます。複数のObjectId
があるオブジェクトに対するコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop_object
操作がシステムに対して、サーバントを元のObjectId
について使用することを止めるように指示する場合のみです。
ObjectAlreadyActive
ObjectId
はすでにコールバックに使用されています。ある特定のObjectId
には、1つのサーバントしか関連付けられません。別のサーバントに変更する場合は、まず現在使用しているサーバントでstop_object
を呼び出す必要があります。
CORBA::BAD_PARAM
CORBA::IMP_LIMIT
CORBA::Object_ptr
ObjectId
stroid
と、ユーザーが指定したrep_id
で作成されたオブジェクト参照。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()
操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。終了したときにオブジェクトを解放するのは、呼出し側の役割です。
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
Objectstart_persistent_userid(
portableServer::Servant a_servant,
in CORBA::RepositoryId rep_id,
in string stroid)
raises ( ServantAlreadyActive, ObjectAlreadyActive );
CORBA::Object_ptr start_persistent_userid (
PortableServer::Servant servant,
const char* rep_id,
const char* stroid);
servant
rep_id
stroid
ServantAlreadyActive
ObjectId
が1つのコールバックのみに使用できます。複数のObjectId
があるオブジェクトに対するコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop_object
操作がシステムに対して、サーバントを元のObjectId
について使用することを止めるように指示する場合のみです。
ObjectAlreadyActive
ObjectId
はすでにコールバックに使用されています。ある特定のObjectId
には、1つのサーバントしか関連付けられません。別のサーバントに変更する場合は、まず現在使用しているサーバントでstop_object
を呼び出す必要があります。
CORBA::BAD_PARAM
CORBA::IMP_LIMIT
CORBA::Object_ptr
ObjectId
stroid
と、ユーザーが指定したrep_id
で作成されたオブジェクト参照。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()
操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。変換が終了したときにオブジェクトを解放するのは、呼出し側の役割です。
所定のサーバントを使用しているオブジェクトに対するリクエストの受け付けを止めるようにORBに指示します。
void stop_object( in PortableServer::Servant servant);
void stop_object
(PortableServer::Servant servant);
servant
この操作は、所定のサーバントに対するリクエストの受け付けを止めるようにORBに指示します。サーバントの状態は、アクティブ化されていても、非アクティブ化されていてもかまいません。エラーが報告されることはありません。
注: | stop_object 操作の呼出し後にコールバック・オブジェクトを呼び出すと、呼出し側にOBJECT_NOT_EXIST 例外が返されます。これは、stop_object 操作が事実上、オブジェクトを削除するためです。 |
すべてのサーバントに対するリクエストの受け付けを止めるようにORBに指示します。
void stop_all_objects ();
void stop_all_objects ();
この操作は、このプロセスで設定されたすべてのサーバントに対するリクエストの受け付けを止めるようにORBに指示します。
ORB::shutdown
メソッドを呼び出したクライアントが、その後にstop_all_objects
を呼び出さないようにしてください。
現在のリクエストのObjectId
の文字列バージョンをリクエストします。
string get_string_oid() raises (NotInRequest);
char* get_string_oid();
NotInRequest
この操作は、現在のリクエストのObjectId
の文字列バージョンを返します。
char*
ObjectId
の文字列バージョン。これは、オブジェクト参照の作成時に指定された文字列です。この文字列がユーザーにとって意味を持つのは、オブジェクト参照がstart_persistent_userid関数によって作成された場合のみです。(つまり、start_transientおよびstart_persistent_systemidによって作成されたObjectId
は、ORBによって作成されており、ユーザー・アプリケーションとの間に関係はありません。)
BEAWrapper::~Callbacks( );
このデストラクタは、コールバック・オブジェクトを破棄します。
ラッパーは破棄するがORBは停止しない場合、クライアントはstop_all_objects
メソッドを呼び出す必要があります。