Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編) |
目次 索引 |
第3章 クライアントアプリケーションの作成 | > 3.1 クライアントアプリケーションソースの作成(C言語) | > 3.1.2 ソースの作成 |
動的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。
初期化処理として、ORBのオブジェクトリファレンスを取得します。オブジェクトリファレンスを取得するには、初期化メソッドを呼び出します。記述例を以下に示します。
main( argc, argv ) int argc; char *argv[]; { int current_argc = argc; CORBA_Environment env; /* 例外情報 */ CORBA_ORB orb; /* ORBのオブジェクトリファレンス */ orb = CORBA_ORB_init(¤t_argc,argv, FJ_OM_ORBid, &env ); |
実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスを取得します。ネーミングサービスのオブジェクトリファレンスには、CORBAインタフェースのオブジェクトリファレンスの取り出しメソッドを使用します。処理の記述例を以下に示します。
CosNaming_NamingContext cos_naming; /* NamingServiceのオブジェクトリファレンス */ CORBA_Environment env; /* 例外情報 */ /* NamingServiceのオブジェクトリファレンスを獲得 */ cos_naming = CORBA_ORB_resolve_initial_references ( orb, CORBA_ORB_ObjectId_NameService, &env); |
インタフェースリポジトリには、IDLで定義されたモジュール名、インタフェース名、オペレーション名、パラメタが階層構造で格納されています。インタフェースリポジトリからサーバアプリケーションの情報を獲得する方法について、以下に示します。
インタフェースリポジトリからサーバアプリケーションの情報を取得するためには、InterfaceDefオブジェクトのオブジェクトリファレンスが必要です。InterfaceDefオブジェクトのオブジェクトリファレンスを求めるには、オブジェクト名をパラメタとして、ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを求め、その後、CORBA_Object_get_interface()メソッドにより、InterfaceDefオブジェクトリファレンスを取得します。処理の記述例を以下に示します。
CosNaming_Name name; /* 検索したい情報格納域 */ CosNaming_NameComponent name_component; /* オブジェクト格納域 */ CORBA_Object obj; /* サーバアプリケーションのオブジェクトリファレンス */ CORBA_InterfaceDef intf; /* InterfaceDefオブジェクトリファレンス */ name._length = name._maximum = 1; /* オブジェクト名の数 */ name._buffer = &name_component; /* オブジェクト名格納域 */ name_component.id = "ODdemo::calculator"; /* オブジェクト名 */ name_component.kind = ""; /* オブジェクトのタイプ */ /* サーバアプリケーションのオブジェクトリファレンスを獲得 */ obj = CosNaming_NamingContext_resolve ( cos_naming, &name, &env ); /* InterfaceDefオブジェクトリファレンス取得 */ intf = CORBA_Object_get_interface(obj, &env); |
サーバアプリケーションのメソッド名をパラメタとして、CORBA_InterfaceDef_lookup_name()メソッドにより、指定されたメソッドをインタフェースリポジトリから検索します。このメソッドにより、指定したメソッド情報が格納されているOperationDefオブジェクトのオブジェクトリファレンスが通知されます。
処理の記述例を以下に示します。
CORBA_ContainedSeq *intf_opr; /* メソッドのOperationDefオブジェクトリファレンス取得 */ intf_opr = (CORBA_OperationDef)CORBA_InterfaceDef_lookup_name( intf, "calculate", -1, CORBA_dk_Operation, /* Operation情報の取得 */ CORBA_FALSE, &env ); |
OperationDefオブジェクトリファレンスをパラメタとして、CORBA_OperationDef_describe()メソッドにより、サーバアプリケーションが所持しているメソッドのパラメタの情報(パラメタの名前、個数、パラメタの型等)をインタフェースリポジトリから検索します。
/* OperationDefオブジェクトが保持しているパラメタ情報の構造体 */ CORBA_Contained_Description *description; /* パラメタ情報の構造体の取得 */ description = CORBA_OperationDef_describe( intf_opr->_buffer[0], &env ); |
トランザクションを開始するために、Currentインタフェースのオブジェクトリファレンスを取得し、CosTransactions_Current_beginメソッドを呼び出します。処理の記述例を以下に示します。
CORBA_Object Current; /* トランザクション開始オブジェクトリファレンス */ /*トランザクション開始インタフェースのオブジェクトリファレンスを獲得 */ Current = CORBA_ORB_resolve_initial_references( orb, CORBA_ORB_ObjectId_TransactionCurrent, &env); /* トランザクション開始メソッドの呼び出し */ CosTransactions_Current_begin(Current, &env); |
サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクト(NVListオブジェクト)を生成するために、CORBA_ORB_create_list()メソッドに、何個のパラメタを格納するかを指定します。これにより、NVListオブジェクトリファレンスが通知されます。処理の記述例を以下に示します。
CORBA_OperationDescription *opr_description; /* パラメタ情報の構造体 */ CORBA_any *tmp_any; /* ワーク用 */ CORBA_ParDescriptionSeq *params; /* パラメタ情報 */ CORBA_NVList arg_list; /* リストオブジェクト */ CORBA_long a,b; /* 入力パラメタ */ /* Contained_Description構造体から構造体の抽出 */ tmp_any = &description->value; opr_description = (CORBA_OperationDescription *)tmp_any->_value; /* パラメタ情報の抽出 */ params = &opr_description->parameters; /* リストオブジェクトの生成 */ CORBA_ORB_create_list( orb, params->_length, &arg_list, &env ); |
CORBA_NVListオブジェクトリファレンス、サーバアプリケーションのパラメタの名前、型、値および長さをパラメタとしてCORBA_NVList_add_item()メソッドにより、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。処理の記述例を以下に示します。
/* パラメタの設定 */ CORBA_NVList_add_item( arg_list, /* リストオブジェクト */ params->_buffer[0].name, /* パラメタ名 */ TC_long, /* パラメタの型 */ &a, /* パラメタの値 */ sizeof( CORBA_long ), /* パラメタの長さ */ CORBA_ARG_IN, /* パラメタのタイプ(in,out, inout) */ &env); CORBA_NVList_add_item( arg_list, /* リストオブジェクト */ params->_buffer[1].name, /* パラメタ名 */ TC_long, /* パラメタの型 */ &b, /* パラメタの値 */ sizeof( CORBA_long ), /* パラメタの長さ */ CORBA_ARG_IN, /* パラメタのタイプ(in,out, inout) */ &env); |
CORBA_Object_create_request()メソッドにより、リクエストオブジェクトを作成します。リクエストとは、メソッド名にパラメタを加えたものです。リクエストオブジェクトに対して、サーバオブジェクトのオブジェクトリファレンス、NVListオブジェクトリファレンス、後述するNamedValueと呼ぶサーバの処理結果を格納する領域を指定することによりリクエストオブジェクトのオブジェクトリファレンスが通知されます。処理の記述例を以下に示します。
CORBA_NamedValue result; /* 復帰 */ CORBA_Request request; /*リクエストオブジェクト*/ result.argument._type = TC_ODdemo_calculator_result; /* 復帰パラメタの型 */ result.len = sizeof( ODdemo_calculator_result ); /* 復帰パラメタの長さ */ result.argument._value = NULL; /*リクエストオブジェクトの生成 */ CORBA_Object_create_request( obj, /* サーバアプリケーションのオブジェクトリファレンス */ CORBA_OBJECT_NIL, /* context */ "calculate", /* メソッド名 */ arg_list, /* 入力パラメタ */ &result, /* 復帰値 */ &request, CORBA_OUT_LIST_MEMORY, &env ); |
NamedValueは、サーバの処理結果を格納するための領域です。システムで定義する定義例を以下に示します。
module CORBA { struct NamedValue { identifier name; // パラメタの名前 any argument; // パラメタの値 long len; // パラメタの長さ Flags arg_modes; // パラメタの引き渡し方法(in,out, inout) }; }; |
struct CORBA_NamedValue { CORBA_identifier name; /* パラメタの名前 */ CORBA_any argument; /* パラメタの値 */ CORBA_long len; /* パラメタの長さ */ CORBA_Flags arg_modes; /* パラメタの引き渡し方法(in,out,inout) */ }; |
サーバアプリケーションに対してリクエストを送信します。リクエストの方法として、以下に示す方法があります。
それぞれについて、以下に示します。
リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA_Request_invoke()メソッドにより、サーバアプリケーションを呼び出します。処理の記述例を以下に示します。
CORBA_Request_invoke( request, NULL, &env ); |
リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA_Request_send()メソッドにより、サーバアプリケーションを呼び出します。サーバアプリケーションの処理結果は、CORBA_Request_get_response()メソッドにより受け取ります。処理の記述例を以下に示します。
CORBA_Request_send( request, /* 処理の要求 */ CORBA_INV_NO_RESPONSE, &env ); ..... if ( CORBA_Request_get_response( /* 処理結果の受け取り */ request, CORBA_RESP_NO_WAIT, &env ) == CORBA_OK ) { /*ユーザ指定の処理 */ ..... } |
リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA_Request_delete()メソッドにより、リクエストオブジェクトを削除します。処理の記述例を以下に示します。
CORBA_Request_delete(request,&env); /*リクエストオブジェクトの削除 */ |
サーバアプリケーションのメソッド呼び出しの結果を復帰状態から判断し、トランザクションの状態を決定します。トランザクションを正常に終了させる場合には、CosTransactions_Current_commitメソッドを呼び出し、トランザクションをコミットさせます。トランザクションを異常で終了させる場合には、CosTransactions_Current_rollbackメソッドを呼び出し、トランザクションをロールバックさせます。処理の記述例を以下に示します。
/*サーバアプリケーションのメソッド呼び出しの復帰状態を確認 */ if(env._major != CORBA_NO_EXCEPTION) CosTransactions_Current_rollback(Current, &env); else CosTransactions_Current_commit(Current, CORBA_TRUE, &env); |
目次 索引 |