Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編) |
目次 索引 |
第3章 クライアントアプリケーションの作成 | > 3.4 クライアントアプリケーションソースの作成(CurrentインタフェースのJava言語) | > 3.4.2 ソースの作成 |
動的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。
初期化処理として、ORBのオブジェクトリファレンスを取得します。オブジェクトリファレンスを取得するには、初期化メソッドを呼び出します。記述例を以下に示します。
static org.omg.CORBA.ORB Orb; //ORB用オブジェクトリファレンス public void initialize(){ try { //ORBの初期化処理 Orb = org.omg.CORBA.ORB.init( arg, null ); ... } catch( java.lang.Exception e ){ ... } } //initialize() |
実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスを取得します。ネーミングサービスのオブジェクトリファレンスには、CORBAインタフェースのオブジェクトリファレンスの取り出しメソッドを使用します。処理の記述例を以下に示します。
org.omg.CosNaming.NamingContextExt Cos; //NamingService用オブジェクトリファレンス try { //NamingServiceのオブジェクトリファレンスの取得 org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "NameService" ); Cos = org.omg.CosNaming.NamingContextExtHelper.narrow( _tmpObj ); if( Cos == null ){ ...; } } catch( java.lang.Exception e ){ ...//例外処理 } |
インタフェースリポジトリには、IDLで定義されたモジュール名、インタフェース名、オペレーション名、パラメタが階層構造で格納されています。インタフェースリポジトリからサーバアプリケーションの情報を獲得する方法について、以下に示します。
インタフェースリポジトリからサーバアプリケーションの情報を取得するためには、InterfaceDefオブジェクトのオブジェクトリファレンスが必要です。InterfaceDefオブジェクトのオブジェクトリファレンスを求めるには、オブジェクト名をパラメタとして、ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを求め、その後、CORBA_Object_get_interface()メソッドにより、InterfaceDefオブジェクトリファレンスを取得します。処理の記述例を以下に示します。
try { String NCid = new String( "ODdemo::calculator" ); //オブジェクト名 String NCkind = new String( "" ); //オブジェクトのタイプ //オブジェクト名、タイプの設定 org.omg.CosNaming.NameComponent nc = new org.omg.CosNaming.NameComponent( NCid, NCkind ); org.omg.CosNaming.NameComponent NCo[] = { nc }; //NamingServiceのresolveメソッドを発行 org.omg.CORBA.Object target = Cos.resolve( NCo ); //org.omg.CORBA.InterfaceDefオブジェクトリファレンス取得 org.omg.CORBA.InterfaceDef intf = target._get_interface(); } catch( java.lang.Exception e ) { ...//例外処理 } |
サーバアプリケーションのメソッド名をパラメタとして、CORBA_InterfaceDef_lookup_name()メソッドにより、指定されたメソッドをインタフェースリポジトリから検索します。このメソッドにより、指定したメソッド情報が格納されているOperationDefオブジェクトのオブジェクトリファレンスが通知されます。
処理の記述例を以下に示します。
//メソッドのorg.omg.CORBA.OperationDefオブジェクトリファレンス取得 String name = new String( "calcurate" ); org.omg.CORBA.Contained[] intf_opr = intf.lookup_name( name, -1, org.omg.CORBA.DefinitionKind.dk_Operation, false ); |
org.omg.CORBA.Contained.describe()メソッドにより、サーバアプリケーションがもっているメソッドのパラメタの情報(パラメタの名前、個数、パラメタの型等)をインタフェースリポジトリから検索します。パラメタとして、org.omg.CORBA.OperationDefオブジェクトリファレンスを指定します。
org.omg.CORBA.ContainedPackage.Description desc = intf_opr[0].describe(); |
トランザクションを開始するために、Currentインタフェースのオブジェクトリファレンスを取得し、CosTransactions.Current.beginメソッドを呼び出します。処理の記述例を以下に示します。
static org.omg.CosTransactions.Current current; // トランザクション開始オブジェクトリファレンス //トランザクション開始インタフェースのオブジェクトリファレンスを獲得 org.omg.CORBA.Object _tmpObj1 = Orb.resolve_initial_references("TransactionCurrent"); current = org.omg.CosTransactions.CurrentHelper.narrow(_tmpObj1); //トランザクション開始メソッドの呼び出し current.begin(); |
org.omg.CORBA.ORB.create_list()メソッドにより、サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、何個のパラメタを格納するかを指定します。結果として、NVListオブジェクトリファレンスが通知されます。処理の記述例を以下に示します。
org.omg.CORBA.NVList Nvl; //NVList //org.omg.CORBA.ContainedPackage.Description構造体からパラメタ情報構造体の抽出 org.omg.CORBA.Any opeany = desc.value; org.omg.CORBA.OperationDescription c = org.omg.OperationDescriptionHelper.extract( opeany ); org.omg.CORBA.ParameterDescription[] paraseq = c.parameters; //パラメタ情報の抽出 int ParamCount = paraseq.length; //リストオブジェクトの生成 Nvl = Orb.create_list( ParamCount ); |
org.omg.CORBA.NVList.add_value()メソッドにより、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタとして、サーバアプリケーションのパラメタの名前、値(Any型)およびパラメタの形式を設定します。処理の記述例を以下に示します。
org.omg.CORBA.NamedValue tmpNam; org.omg.CORBA.Any Anya = Orb.create_any(); Anya.insert_long(a); tmpNam = Nvl.add_value( paraseq[0].name, Anya, org.omg.CORBA.ARG_IN.value ); org.omg.CORBA.Any Anyb = Orb.create_any(); Anyb.insert_long(b); tmpNam = Nvl.value.add_value( paraseq[1].name, Anyb, org.omg.CORBA.ARG_IN.value ); |
org.omg.CORBA.Object._create_request()メソッドにより、リクエストオブジェクトを作成します。リクエストオブジェクトに対して、サーバオブジェクトのオブジェクトリファレンス、org.omg.CORBA.NVListオブジェクトリファレンス、org.omg.CORBA.NamedValueと呼ぶサーバの処理結果を格納する領域を指定します。結果として、リクエストオブジェクトが返されます。処理の記述例を以下に示します。
//復帰パラメタ org.omg.CORBA.Any AnyResult = Orb.create_any(); AnyResult.type(c.result); //復帰パラメタ格納域 org.omg.CORBA.NamedValue Result = Orb.create_named_value( null, AnyResult, org.omg.CORBA.ARG_OUT.value); String OpName = new String(c.name); //リクエストオブジェクトの生成 org.omg.CORBA.Request Req = target._create_request( null, //context OpName, //メソッド名 Nvl, //入力パラメタ Result); //復帰値 |
サーバアプリケーションに対してリクエストを送信します。リクエストの方法として、以下に示す方法があります。
それぞれについて、以下に示します。
org.omg.CORBA.Request.invoke()メソッドにより、サーバアプリケーションを呼び出します。
処理の記述例を以下に示します。
Req.invoke(); |
org.omg.CORBA.Request.send_deferred()メソッドにより、サーバアプリケーションを呼び出します。サーバアプリケーションの処理結果は、org.omg.CORBA.Request.get_response()メソッドにより受け取ります。処理の記述例を以下に示します。
Req.send_deferred(); //処理の要求 Req.get_response(); //処理結果の受け取り |
org.omg.CORBA.Request.get_response()サーバアプリケーションからリクエストが完了していないことが判明した場合、再度org.omg.CORBA.Request.get_response()メソッドを呼び出します。
リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA.Request.delete()メソッドにより、リクエストオブジェクトを削除します。処理の記述例を以下に示します。
CORBA.Request.delete(); //リクエストオブジェクトの削除 |
サーバアプリケーションのメソッド呼び出しの結果を復帰状態から判断し、トランザクションの状態を決定します。トランザクションを正常に終了させる場合には、CosTransactions.Current.commitメソッドを呼び出し、トランザクションをコミットさせます。トランザクションを異常で終了させる場合には、CosTransactions.Current.rollbackメソッドを呼び出し、トランザクションをロールバックさせます。処理の記述例を以下に示します。
boolean rhuristic; ... rhuristic = true; try { current.commit( rhuristic ); } catch( NoTransaction e) { ...//例外処理 } ... current.rollback( ); |
目次 索引 |