•
|
CORBA::Object::_requestメンバー関数を使用します。
|
CORBA::Object::_requestメンバー関数を使用して、そのリクエストで呼び出すインタフェース名のみを指定する空のリクエスト・オブジェクト(
get_course_detailsなど)を作成します。リクエスト・オブジェクトを作成したら、CORBAサーバー・アプリケーションに送信する前に引数を指定する必要があります(存在する場合)。呼び出すメソッドで必要な引数ごとに、
CORBA::NVList::add_valueメンバー関数を呼び出します。
また、CORBA::Request::resultメンバー関数を使用して、リクエストの結果の型を指定する必要があります。パフォーマンス上の理由から、Object Request Brokers (ORB)間で交換されるメッセージには型情報は含まれません。結果の型のプレース・ホルダーを指定することによって、応答から結果を適切に抽出するために必要な情報をORBに提供します。同様に、呼び出すメソッドによって例外が発生する可能性がある場合、リクエスト・オブジェクトを送信する前に例外用のプレース・ホルダーを追加する必要があります。
•
|
CORBA::Object::_create_requestメンバー関数を使用します。
|
CORBA::Object:: _create_requestメンバー関数を使用してリクエスト・オブジェクトを作成する場合、そのリクエストを行うために必要なすべての引数を受け渡し、その結果の型とそのリクエストが返す可能性のあるユーザー例外を指定します。このメンバー関数を使用することで、空のNVListを作成し、一度に1つの引数をNVListに追加し、リクエスト・オブジェクトを作成して、完成したNVListをそのリクエストに引数として受け渡します。
CORBA::Object::_create_request メンバー関数には、パフォーマンス上のメリットがあります。複数のオブジェクトの同じオブジェクトを呼び出す場合、これらの引数を複数の
CORBA::ORB::_create_request呼出しで再利用できます。
•
|
最も単純な方法は、CORBA::Request::invokeメンバー関数を呼び出すことです。この関数は、応答メッセージを取得するまでブロックします。
|
注意:
|
CORBA::Request::send_deferredメンバー関数を使用する場合、ターゲット・オブジェクトが呼出しを発行するCORBAクライアント・アプリケーションと同じアドレス空間に存在するときには、リクエスト・オブジェクトの呼出しは同期的に動作します。この動作の結果、 CosTransaction::Current::suspend操作を呼び出しても、 CORBA::BAD_IN_ORDER例外は発生しません。トランザクションが完了したからです。
|
CORBA::Request::send_onewayメンバー関数を使用する場合、結果は存在しません。
idl2ir [-f repositoryfile.idl] file.idl
idl2irコマンドの詳細は、
『Oracle Tuxedoコマンド・リファレンス』を参照してください。
CORBA::Object::create_requestメンバー関数を使用してリクエスト・オブジェクトを作成する場合、空のNVListを作成し、そのNVListに引数を1つずつ追加します。次に、リクエスト・オブジェクトを作成し、完成したNVListを引数としてそのリクエストに受け渡します。
CORBA::NamedValueメンバー関数は、リクエストの入力引数と出力引数を表すために使用する名前付き/値オブジェクトを指定します。名前付き/値オブジェクトは、リクエスト・オブジェクトの引数として使用されます。また、
CORBA::NamedValueのペアは、CORBAクライアント・アプリケーションに返されるリクエストの結果を表すためにも使用されます。名前付き/値オブジェクトの名前プロパティは文字列で、値プロパティはCORBA
Anyによって表されます。
CORBA::NamedValueメンバー関数の詳細は、
『CORBAプログラミング・リファレンス』を参照してください。
同期通信を行う場合、CORBA::Request::invokeメンバー関数はリクエストを送信し、そのレスポンスがCORBAクライアント・アプリケーションに返されるまで待機します。
CORBA::Request::resultメンバー関数は、戻り値を表す名前付き/値オブジェクトの参照を返すために使用します。結果を取得したら、リクエストに格納されているNVListから値を読み出します。
リクエストの送信用として、非ブロッキング・メンバー関数のCORBA::Request::send_deferredも用意されています。このメンバー関数を使用すると、CORBAクライアント・アプリケーションはリクエストを送信し、
CORBA::Request::poll_response メンバー関数を使用してレスポンスが利用可能であるかどうかを調べることができます。
CORBA::Request::get_responseメンバー関数は、レスポンスが利用可能になるまでブロックします。
次のサンプル・コードに、CORBA::Request::send_deferred、
CORBA::Request::poll_responseおよび
CORBA::Request::get_responseメンバー関数の使い方を示します。
一方向リクエストを送信するには、CORBA::Request::send_onewayメンバー関数を使用します。一方向リクエストでは、CORBAサーバー・アプリケーションからレスポンスが返されません。
CORBA::Request::send_onewayメンバー関数の詳細は、
『CORBAプログラミング・リファレンス』を参照してください。
CORBA::Request::send_multiple_requests_deferredメンバー関数を使用してリクエスト・オブジェクトのシーケンスを送信する場合、
CORBA::ORB::poll_response、
CORBA::ORB::poll_next_response、CORBA::ORB::get_responseおよび
CORBA::ORB::get_next_responseメンバー関数を使用すると、CORBAサーバー・アプリケーションが各リクエストに対して送信するレスポンスを取得できます。
CORBA::ORB::poll_responseメンバー関数と
CORBA::ORB::poll_next_responseメンバー関数を使用すると、CORBAサーバー・アプリケーションからレスポンスを取得したかどうかを調べることができます。これらのメンバー関数は、少なくとも1つのレスポンスが利用可能な場合は1を返し、利用可能なレスポンスが存在しない場合は0を返します。
CORBA::ORB::get_responseメンバー関数と
CORBA::ORB::get_next_responseメンバー関数を使用すると、レスポンスを取得できます。利用可能なレスポンスが存在しない場合、これらのメンバー関数はレスポンスを取得するまでブロックします。CORBAクライアント・アプリケーションがブロックしないようにする場合は、最初に
CORBA::ORB::poll_next_responseメンバー関数を使用してレスポンスが利用可能かどうかを調べてから、
CORBA::ORB::get_next_responseメソッドを使用してその結果を取得します。
また、CORBA::Request::send_multiple_requests_onewayメンバー関数を使用すると、複数の一方向リクエストを送信できます。
次のサンプル・コードに、CORBA::Request::send_multiple_requests_deferred、
CORBA::Request::poll_next_responseおよび
CORBA::Request::get_next_responseメンバー関数の使い方を示します。
CORBA::Context_ptr ctx;
CORBA::Request_ptr requests[2];
CORBA::Request_ptr request;
CORBA::NVList_ptr arg_list1, arg_list2;
CORBA::ULong i, nreq;
CORBA::Long arg1 = 1;
Boolean aResult1 = CORBA_FALSE;
Boolean expected_aResult1 = CORBA_TRUE;
CORBA::Long arg2 = 3;
Boolean aResult2 = CORBA_FALSE;
Boolean expected_aResult2 = CORBA_TRUE
try
{
orbp->get_default_context(ctx);
populate_arg_list ( &arg_list1, &arg1, &aResult1 );
nreq = 0;
anObj->_create_request ( ctx,
“Multiply”,
arg_list1,
0,
requests[nreq++],
0);
populate_arg_list ( &arg_list2, &arg2, &aResult2 );
anObj->_create_request ( ctx,
“Multiply”,
arg_list2,
0,
requests[nreq++],
0 );
// Declare a request sequence variable...
CORBA::ORB::RequestSeq rseq ( nreq, nreq, requests, CORBA_FALSE );
orbp->send_multiple_requests_deferred ( rseq );
for ( i = 0 ; i < nreq ; i++ )
リクエスト全体を削除するには、削除するリクエストに対してCORBA::Release(request)メンバー関数を使用します。この操作により、リクエストに関連するすべてのメモリーが解放されます。遅延同期通信を使用して発行されたリクエストを削除する場合、そのリクエストが完了していないときはそのリクエストが取り消されされます。
1.
|
CORBA.hの ORB_INCLUDE_REPOSITORYを、Oracle Tuxedoシステム内でのインタフェース・リポジトリ・ファイルの格納場所に設定します。
|
3.
|
CORBA::Object::_get_interfaceメンバー関数を使用して、目的のCORBAオブジェクトを実装するCORBAサーバー・アプリケーションと通信します。
|
4.
|
CORBA::InterfaceDef_ptrを使用して、インタフェース・リポジトリに格納されているCORBAインタフェースの定義を取得します。
|
5.
|
FullInterfaceDescription操作で、目的の操作用の OperationDescriptionを検索します。
|
6.
|
OperationDescriptionからリポジトリIDを取得します。
|
7.
|
OperationDescriptionで返されたリポジトリIDを使用して CORBA::Repository::lookup_idを呼び出して、インタフェース・リポジトリ内の OperationDefを検索します。この呼出しにより、包含オブジェクトが返されます。
|
9.
|
OperationDef引数と CORBA::ORB::create_operation_listメンバー関数を使用して、操作の引数リストを作成します。
|