目次 前 次 PDF


共同クライアント/サーバー

共同クライアント/サーバー
この章では、CORBA共同クライアント/サーバーおよびC++ OracleWrapper Callbacks APIのプログラミング要件を説明します。
注意:
サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートやマニュアルは提供していません。
このトピックには次の項が含まれます:
概要。この項では、次の内容について説明します。
はじめに
プログラマは、Oracle TuxedoのCORBAクライアントと共同クライアント/サーバー(オブジェクト呼出しの受信と処理が可能なクライアント)のいずれかにあわせて、クライアントのmain()を記述します。main()はOracle Tuxedo CORBA環境オブジェクトを使用して接続を確立し、セキュリティを設定し、トランザクションを開始します。
Oracle Tuxedoクライアントは、オブジェクトの操作を呼び出します。DIIの場合、クライアント・コードはDIIリクエスト・オブジェクトを作成し、DIIリクエストの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クライアントと同様に、ユーザーがメイン・プログラムを作成し、すべての初期化を担当します。メイン・プログラムを完全に制御し、任意の便利な方法で初期化と停止のコードを提供できるため、サーバー・オブジェクトを提供する必要はありません。
共同クライアント/サーバーのみで必要な初期化の詳細は、11-3ページの「サーバント」という項を参照してください。
サーバント
共同クライアント/サーバーのサーバント(メソッド・コード)は、サーバーのサーバントに非常によく似ています。すべてのビジネス・ロジックが同じ方法で記述されます。違いは、TPフレームワークを使用しないことによるものです。したがって、TPフレームワーク経由で間接的にCORBA関数を使用するのではなく直接使用するという点が主な違いです。
Oracle Tuxedo CORBAサーバーでは、Serverインタフェースを使用して、ORBがオブジェクトに対するリクエストを受信したときに、TPフレームワークがそのオブジェクトのためのサーバントの作成をユーザーに求められるようにします。しかし、共同クライアント/サーバーでは、リクエストが届く前にサーバントを作成する役割をユーザー・プログラムが担います。したがって、Serverインタフェースは不要です。通常、プログラムはサーバントを作成してから、オブジェクトへのリファレンスを渡す前に、そのオブジェクトをアクティブ化します。これには、サーバントとObjectIdを使用します。ObjectIdはおそらく、システムで生成されています。そのようなオブジェクトは、コールバックの処理に使用されていると考えられます。したがって、サーバントは既に存在しており、オブジェクトは、そのオブジェクトに対するリクエストが届く前に、アクティブ化されます。
C++共同クライアント/サーバーの場合、ある特定の操作を実行するには、TPインタフェースを呼び出すのではなく、TPインタフェースの内部機能であるORBとPOAの呼出しをクライアント・サーバントから直接実行します。また、ORBおよびPOAとの対話の多くは、すべてのアプリケーションで同じなので、使いやすくするため、クライアント・ライブラリにより、単一の操作を使用して同じことを行う便利なラッパー・オブジェクトを提供することもできます。便利なラッパー・オブジェクトを使用する方法の詳細は、「サポートされているコールバック・オブジェクト・モデル」および「OracleWrapper Callbacksを使用してのコールバック・オブジェクトの準備」を参照してください。
スケルトンからのサーバントの継承
コールバックをサポートするクライアントでは、サーバーの場合と同様に、IDLコンパイラ(idlコマンド)によって生成されたものと同じスケルトン・クラス名から継承した実装クラスを記述します。
C++におけるスケルトンからの継承例
以下は、次のIDLを想定したC++の例です。
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ポリシーは、使用可能なオブジェクトの型とオブジェクト参照の型の両方を制御します。
適用できるPOAポリシーは、以下のとおりです。
IdAssignmentPolicy。ユーザーとシステムのどちらがObjectIdを割り当てるかを制御します。
これらのオブジェクトについては主にその動作特性の観点で説明し、ORBおよびPOAによるそれらの処理方法については詳しく説明しません。これらの詳細は、直接的なORBおよびPOAの呼出し(CORBAサーバーに関して特別な知識が少し必要)を使用するか、またはORBおよびPOAの呼出しを隠ぺいするOracleWrapper Callbacksインタフェース(詳細については考慮しないユーザー向け)を使用して、以降の項で説明します。
Transient/SystemId - オブジェクト参照は、クライアント・プロセスが存続する間のみ有効です。ObjectIdは、クライアント・アプリケーションによって割り当てられるのではなく、システムによって割り当てられる一意の値です。この型のオブジェクトは、クライアントが終了するまでの間のみクライアントによって受信される呼出しに有用です。(対応するPOA LifeSpanPolicy値はTRANSIENTで、IdAssignmentPolicyはSYSTEM_IDです。)
Persistent/SystemId - オブジェクト参照は、複数回のアクティブ化にわたって有効です。ObjectIdはクライアント・アプリケーションによって割り当てられるのではなく、システムによって割り当てられる、一意の値です。この型のオブジェクトおよびオブジェクト参照は、クライアントがある一定期間内で起動したり終了する場合に有用です。稼動中のクライアントは、その特定のオブジェクト参照に対するコールバック・オブジェクトを受信できます。

通常、クライアントは一度オブジェクト参照を作成し、それを自身の恒久的なストレージに保存し、そのオブジェクトが復帰するたびに、オブジェクトのサーバントを再アクティブ化します。たとえばOracle Tuxedo CORBA通知サービスのアプリケーションと共に使用した場合、これらは永続的なサブスクリプションの概念に対応するコールバックです。つまり、通知サービスはコールバック・リファレンスを記憶しており、クライアントが起動して再びイベントを受信する準備が整ったことを宣言すると、イベントを送達します。これにより、通知サービスのサブスクリプションは、クライアントの障害やオフライン時間の影響を受けずに済みます。(対応するPOAポリシーの値は、PERSISTENTおよびSYSTEM_IDです。)
Persistent/UserId - 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を使用してのコールバック・オブジェクトの準備(C++共同クライアント/サーバーのみ)
CORBAを使用してOracle Tuxedo C++コールバック・オブジェクトを設定するには、クライアントは次の処理を行う必要があります。
1.
2.
3.
4.
5.
6.
クライアントがORBへの参照を取得済であれば、このタスクの実行に必要なORBおよびPOAとの対話は4回です。リスト11-1に示すモデルのようになります。このモデルでは、ルートPOAのみが必要とされます。
リスト11-1 Transient/SystemIdモデル
// 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に示すモデルのようになります。
リスト11-2 Persistent/UserIdモデル
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インタフェースおよび操作です。
OracleWrapper Callbacksを使用してのコールバック・オブジェクトの準備
C++の共同クライアント/サーバーのどちらかを記述するには、OracleWrapper Callbacks APIを使用します。
C++でのOracleWrapper Callbacksの使用
コールバック・オブジェクトに必要なコードは、コールバックをサポートするどのクライアントについてもほぼ同一であるため、共同クライアント/サーバー用のライブラリで提供されているOracleWrapperを使用すると便利なことがあります。
リスト11-3に示すように、OracleWrapperはIDLで記述されます。
リスト11-3 OracleWrapper IDL
// File: BEAWrapper
#ifndef _BEA_WRAPPER _IDL_
#define _BEA_WRAPPER _IDL_
#include <orb.idl>
#include <PortableServer.idll>
#pragma prefix “beasys.com”
module BEAWrapper {
interface Callbacks
{
exception ServantAlreadyActive{ };
exception ObjectAlreadyActive { };
exception NotInRequest{ };

// set up transient callback Object
// -- prepare POA, activate object, return objref
Object start_transient(
in PortableServer::Servant Servant,
in CORBA::RepositoryId rep_id)
raises (ServantAlreadyActive);
// 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++で記述されます。
リスト11-4 C++宣言(beawrapper.h内)
#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
このC++ OracleWrapper CallbacksインタフェースAPIについては、以下のセクションで説明します。
Callbacks
概要
Callbacksインタフェースへのリファレンスを返します。
C++バインディング
BEAWrapper::Callbacks( CORBA::ORB_ptr init_orb);
引数
init_orb
これ以降のすべての操作に使用するORB。
例外
CORBA::IMP_LIMIT
BEAWrapper::CallbacksクラスはすでにORBポインタでインスタンス化されています。プロセス内で使用できるこのクラスのインスタンスは1つだけです。より柔軟性が必要なユーザーは、POAを直接使用する必要があります。
説明
コンストラクタは、Callbacksインタフェースへの参照を返します。複数のスレッドを使用している場合でも、このようなオブジェクトはプロセスに対して1つのみ作成してください。このようなオブジェクトを複数使用すると、未定義の動作が発生します。
戻り値
Callbacksオブジェクトへのリファレンス。
 
start_transient
概要
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
IDL
Object start_transient( in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id)
raises ( ServantAlreadyActive );
C++バインディング
CORBA::Object_ptr start_transient(
PortableServer::Servant servant,
const char* rep_id);
引数
servant
インタフェースのC++実装クラスのインスタンス。
rep_id
インタフェースのリポジトリid
例外
ServantAlreadyActive
サーバントはすでにコールバックに使用されています。サーバントは、ObjectIdが1つのコールバックのみに使用できます。複数のObjectIdがあるオブジェクトに対するコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop_object操作がシステムに対して、サーバントを元のObjectIdについて使用することを止めるように指示する場合のみです。
CORBA::BAD_PARAM
リポジトリIDがNULL文字列であったか、サーバントがNULLポインタでした。
 
説明
この操作は、次の作業を実行します。
rep_id型のサービス・オブジェクトに与えられたServantを使用するオブジェクトをアクティブ化します。これには、システムによって生成されたObjectIdを使用します。
アクティブ化したオブジェクトへのオブジェクト参照を返します。返されたオブジェクト参照が有効である期間は、クライアントが終了するまで、またはstop_object操作によってユーザーがコールバック・サーバントを停止するまでのみです。それ以降は、そのオブジェクト参照に対する呼出しは無効となり、有効にすることができなくなります。
戻り値
CORBA::Object_ptr
システムが生成したObjectIdと、ユーザーが指定したrep_idで作成されたオブジェクトへの参照。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。変換が終了したときにオブジェクトを解放するのは、呼出し側の役割です。
start_persistent_systemid
概要
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、出力パラメータstroidを設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
IDL
Object start_persistent_systemid(
in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id,
out string stroid)
raises ( ServantAlreadyActive );
C++バインディング
CORBA::Object_ptr start_persistent_systemid(
PortableServer::Servant servant,
const char* rep_id,
char*& stroid);
引数
servant
インタフェースのC++実装クラスのインスタンス。
rep_id
インタフェースのリポジトリID。
stroid
この引数は、システムによって設定され、ユーザーにとっては非透過的です。クライアントは、後になって、おそらくはクライアント・プロセスが終了して再起動してから、restart_persistent_systemidでオブジェクトを再アクティブ化する場合に、これを使用します。
例外
ServantAlreadyActive
サーバントはすでにコールバックに使用されています。サーバントは、ObjectIdが1つのコールバックのみに使用できます。複数のObjectIdがあるコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop操作がシステムに対して、元のObjectIdについてこのサーバントを使用することを止めるように指示する場合のみです。
CORBA::BAD_PARAMETER
リポジトリIDがNULL文字列であったか、サーバントがNULLポインタでした。
CORBA::IMP_LIMIT
この例外のほかのシステム上の理由に加えて、この状況に特有の理由は、共同クライアント/サーバーがポート番号付きでは初期化されておらず、したがって永続オブジェクト参照が作成できないことです。
説明
この操作は、次の作業を実行します。
rep_id型のサービス・オブジェクトに与えられたServantを使用するオブジェクトをアクティブ化します。これには、システムによって生成されたObjectIdを使用します。
出力パラメータstroidを、システムによって割り当てられたObjectIdの文字列化されたバージョンに設定します。
アクティブ化したオブジェクトへのオブジェクト参照を返します。つまり、クライアントが終了してから再起動され、その後同じrep_idで、同じObjectIdについてサーバントをアクティブ化した場合に、サーバントはその同じオブジェクト参照に対して作成されたリクエストを受け付けます。ObjectIdはシステムによって生成されているため、アプリケーションはそのObjectIdを保存しておく必要があります。
戻り値
CORBA::Object_ptr
システムが生成したObjectIdと、ユーザーが指定したrep_idで作成されたオブジェクト参照。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。変換が終了したときにオブジェクトを解放するのは、呼出し側の役割です。
restart_persistent_systemid
概要
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
IDL
Object restart_persistent_systemid(
in PortableServer::Servant servant,
in CORBA::RepositoryId rep_id,
in string stroid)
raises (ServantAlreadyActive, ObjectAlreadyActive);
C++バインディング
CORBA::Object_ptr restart_persistent_systemid(
PortableServer::Servant servant,
const char* rep_id
const char* stroid);
引数
servant
インタフェースのC++実装クラスのインスタンス。
rep_id
インタフェースのリポジトリID。
stroid
作成されているオブジェクト参照内で設定される、ユーザー指定のObjectIdの文字列化されたバージョン。start_persistent_systemidに対する以前の呼出しから返されたものである必要があります。
例外
ServantAlreadyActive
サーバントはすでにコールバックに使用されています。サーバントは、ObjectIdが1つのコールバックのみに使用できます。複数のObjectIdがあるオブジェクトに対するコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop_object操作がシステムに対して、サーバントを元のObjectIdについて使用することを止めるように指示する場合のみです。
ObjectAlreadyActive
文字列化されたObjectIdはすでにコールバックに使用されています。ある特定のObjectIdには、1つのサーバントしか関連付けられません。別のサーバントに変更する場合は、まず現在使用しているサーバントでstop_objectを呼び出す必要があります。
CORBA::BAD_PARAM
リポジトリIDがNULL文字列であったか、またはサーバントがNULLポインタであったか、または指定されたObjectIdが事前にシステムによって割り当てられていませんでした。
CORBA::IMP_LIMIT
この例外のほかのシステム上の理由に加えて、この状況に特有の理由は、共同クライアント/サーバーがポート番号付きでは初期化されておらず、したがって永続オブジェクト参照が作成できないことです。
説明
この操作は、次の作業を実行します。
rep_id型のサービス・オブジェクトに与えられたServantを使用するオブジェクトをアクティブ化します。これには、指定のstroid (文字列化されたObjectId)を使用します。これは、事前にstart_persistent_systemidに対する呼出しによって取得されている必要があります。
再アクティブ化は、restart_persistent_systemidメソッドを使用して実行されます。
戻り値
CORBA::Object_ptr
文字列化されたObjectId stroidと、ユーザーが指定したrep_idで作成されたオブジェクト参照。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。終了したときにオブジェクトを解放するのは、呼出し側の役割です。
start_persistent_userid
概要
オブジェクトをアクティブ化し、ORBおよびPOAを適切な状態に設定し、アクティブ化したオブジェクトへのオブジェクト参照を返します。
IDL
Object start_persistent_userid(
portableServer::Servant a_servant,
in CORBA::RepositoryId rep_id,
in string stroid)
raises ( ServantAlreadyActive, ObjectAlreadyActive );
C++バインディング
CORBA::Object_ptr start_persistent_userid (
PortableServer::Servant servant,
const char* rep_id,
const char* stroid);
引数
servant
インタフェースのC++実装クラスのインスタンス。
rep_id
インタフェースのリポジトリID。
stroid
作成されているオブジェクト参照内で設定される、ユーザー指定のObjectIdの文字列化されたバージョン。stroidは、アプリケーション固有のデータを保持しており、ORB側からは非透過的です。
例外
ServantAlreadyActive
サーバントはすでにコールバックに使用されています。サーバントは、ObjectIdが1つのコールバックのみに使用できます。複数のObjectIdがあるオブジェクトに対するコールバックを受信するには、複数のサーバントを作成して、個別にアクティブ化する必要があります。同じサーバントを再利用できるのは、stop_object操作がシステムに対して、サーバントを元のObjectIdについて使用することを止めるように指示する場合のみです。
ObjectAlreadyActive
文字列化されたObjectIdはすでにコールバックに使用されています。ある特定のObjectIdには、1つのサーバントしか関連付けられません。別のサーバントに変更する場合は、まず現在使用しているサーバントでstop_objectを呼び出す必要があります。
CORBA::BAD_PARAM
リポジトリIDがNULL文字列であったか、サーバントがNULLポインタでした。
CORBA::IMP_LIMIT
この例外のほかのシステム上の理由に加えて、この状況に特有の理由は、共同クライアント/サーバーがポート番号付きでは初期化されておらず、したがって永続オブジェクト参照が作成できないことです。
説明
この操作は、次の作業を実行します。
rep_id型のサービス・オブジェクトに与えられたServantを使用するオブジェクトをアクティブ化します。これには、オブジェクトID stroidを使用します。
アクティブ化したオブジェクトへのオブジェクト参照を返します。つまり、クライアントが終了してから再起動され、その後同じrep_idで、同じObjectIdについてサーバントをアクティブ化した場合に、サーバントはその同じオブジェクト参照に対して作成されたリクエストを受け付けます。
戻り値
CORBA::Object_ptr
文字列化されたObjectId stroidと、ユーザーが指定したrep_idで作成されたオブジェクト参照。オブジェクト参照は、特定のオブジェクト用に定義された_narrow()操作を呼び出すことによって、特定のオブジェクト型に変換する必要があります。変換が終了したときにオブジェクトを解放するのは、呼出し側の役割です。
stop_object
概要
所定のサーバントを使用しているオブジェクトに対するリクエストの受け付けを止めるようにORBに指示します。
IDL
void stop_object( in PortableServer::Servant servant);
C++バインディング
void stop_object(PortableServer::Servant servant);
引数
servant
インタフェースのC++実装クラスのインスタンス。このサーバントとそのObjectIdとの関連付けは、アクティブ・オブジェクト・マップから削除されます。
例外
なし。
説明
この操作は、所定のサーバントを使用しているオブジェクトに対するリクエストを受け付けないようにORBに指示します。サーバントの状態は、アクティブ化されていても、非アクティブ化されていてもかまいません。エラーが報告されることはありません。
注意:
stop_object操作の呼出し後にコールバック・オブジェクトを呼び出すと、呼出し側にOBJECT_NOT_EXIST例外が返されます。これは、stop_object操作が事実上、オブジェクトを削除するためです。
戻り値
なし。
stop_all_objects
概要
すべてのサーバントに対するリクエストの受け付けを止めるようにORBに指示します。
IDL
void stop_all_objects ();
C++バインディング
void stop_all_objects ();
例外
なし。
説明
この操作は、このプロセスで設定されたすべてのサーバントに対するリクエストの受け付けを止めるようにORBに指示します。
使用上の注意
ORB::shutdownメソッドを呼び出したクライアントが、その後にstop_all_objectsを呼び出さないようにしてください。
戻り値
なし。
get_string_oid
概要
現在のリクエストのObjectIdの文字列バージョンをリクエストします。
IDL
string get_string_oid() raises (NotInRequest);
C++バインディング
char* get_string_oid();
例外
NotInRequest
ORBがリクエストのコンテキスト内に入っていなかったとき、つまりORBがメソッド・コード内のリクエストを処理していないときに、関数が呼び出されました。クライアント・コードからこの関数を呼び出さないでください。それは、コールバック・オブジェクト(つまり、サーバント)のメソッドを実行している間のみ有効です。
説明
この操作は、現在のリクエストのObjectIdの文字列バージョンを返します。
戻り値
char*
現在のリクエストのObjectIdの文字列バージョン。これは、オブジェクト参照の作成時に指定された文字列です。この文字列は、オブジェクト参照がstart_persistent_userid関数によって作成された場合にのみ、ユーザーにとって意味があります。(つまり、start_transientおよびstart_persistent_systemidによって作成されたObjectIdは、ORBによって作成されており、ユーザー・アプリケーションとの間に関係はありません。)
~Callbacks
概要
コールバック・オブジェクトを破棄します。
C++バインディング
BEAWrapper::~Callbacks( );
引数
なし。
例外
なし。
説明
このデストラクタは、コールバック・オブジェクトを破棄します。
使用上の注意
ラッパーは破棄するがORBは停止しない場合、クライアントはstop_all_objectsメソッドを呼び出す必要があります。
戻り値
なし。

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved