Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編) |
目次 索引 |
第2章 分散トランザクション機能の使用方法 | > 2.4 その他のインタフェース |
Synchronizationオブジェクトは、Synchronizationインタフェースのbefore_completion機能とafter_completion機能を実装したオブジェクトです。Synchronizationオブジェクト内before_completionメソッドは、データベース連携サービスが、データベースにトランザクションの完了依頼をする前に、データベース連携サービスから呼ばれます。before_completionメソッド実行時にエラーが発生した場合は、該当トランザクションは、データベース連携サービスによってrollbackされます。また、Synchronizationオブジェクト内after_completionメソッドは、トランザクションが完了した後に、データベース連携サービスから呼ばれます。
Synchronizationオブジェクトは、データベースにアクセスするサーバアプリケーションオブジェクトと同じプロセス上に配置するように作成します。
注) 図中番号順に制御されます。
以下に、Syncronizaionオブジェクト用のアプリケーションの例を示します。
Synchronizationオブジェクトの実装を、サーバアプリケーションと同じオブジェクトに配置する場合のIDL定義とユーザアプリケーションの例を示します。なお、ユーザアプリケーションのインプリメンテーションリポジトリへの登録時には、設計に合わせ、プロセス多重度を少なくとも2以上に設定してください。
以下のように、ユーザアプリケーションのインタフェース宣言でSynchronizationインタフェースを継承してください。
include文で指定している"CosTransactions.idl"は、以下にあります。
bankA.idl
#include "CosTransactions.idl" module bankA{ interface accounA : CosTransactions::Synchronization{ void deposit1(in long a,in CosTransactions::Control control); }; }; |
bankA_accountA_deposit1(bankA_accountA obj,long a, CosTransactions_Control control, CORBA_Environment *env) { CosTransactions_Coordinator coordinator; coordinator = CosTransactions_Control_get_coordinator(control, env ); CosTransactions_Coordinator_register_synchronization( coordinator, obj , env); /* ユーザの操作 */ SQL データベースへのアクセス ................. }
|
Synchronizationオブジェクトの実装を、サーバアプリケーションと別のオブジェクトとして作成する場合の、IDL定義とSynchronizationインタフェースを使用したアプリケーションの例を示します。この場合、ユーザアプリケーションのインプリメンテーションリポジトリへの登録時には、プロセス多重度を2以上に設定してください。
以下のように、Synchronizationオブジェクトのインタフェース宣言でSynchronizationインタフェースを継承してください。
include文で指定している"CosTransactions.idl"は、以下にあります。
bankA.idl
#include "CosTransactions.idl" module bankA{ interface accountA { void deposit1(in long a,in CosTransactions::Control b); }; interface Synch : CosTransactions::Synchronization{ }; }; |
/***********************************************************************/ /* Synchronization application */ /***********************************************************************/ #include <windows.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include "ORB.H" #include "COSNAMIN.H" #include "OTS.H" #include "bankAh" #define IMPL_bankA "IDL:bankA:1.0" static char *error_id; /* Global Variable */ static CORBA_ORB orb; static CORBA_BOA boa; static CORBA_Repository intf_rep; static FJ_ImplementationRep impl_rep; static CORBA_InterfaceDef intf; static CORBA_ImplementationDef impl; static CORBA_Environment env_g; static CosNaming_NamingContext cos_naming; static CosNaming_Name name2; static CosNaming_NameComponent name_component2; static void env_check( CORBA_string pos ) { if ( env_g._major != CORBA_NO_EXCEPTION ){ fprintf( stderr, "env_check: %s fails\n", pos ); error_id = CORBA_exception_id( &env_g ); fprintf(stderr,"%s\n",error_id); exit(1); } } /* before_completion */ void bankA_Synch_before_completion( bankA_Synch obj, CORBA_Environment *env ) { fprintf(stderr,"bankA_Sync_before_completion \n"); return; } /* after_completion */ void bankA_Synch_after_completion( bankA_Synch obj, CosTransactions_Status status, CORBA_Environment *env ) { fprintf(stderr,"bankA_Sync_after_completion %d\n",status); return; } int main( argc, argv ) int argc; char *argv[]; { int cr_argc = argc; CORBA_Object ots; /* Initialization of CORBA service */ orb = CORBA_ORB_init( &cr_argc, argv, FJ_OM_ORBid , &env_g); env_check( "CORBA_ORB_BOA_init" ); fprintf(stderr,"ORB_INIT OK\n"); boa = CORBA_ORB_BOA_init( orb, &cr_argc, argv, CORBA_BOA_OAid, &env_g ); env_check( "CORBA_ORB_BOA_init" ); fprintf(stderr,"BOA_INIT OK\n"); /* get the OR of InterfaceRepository */ intf_rep = CORBA_ORB_resolve_initial_references( orb, CORBA_ORB_ObjectId_LightInterfaceRepository, &env_g ); env_check( "CORBA_ORB_resolve_initial_references" ); /* get the OR of ImplementationRepository */ impl_rep = CORBA_ORB_resolve_initial_references( orb,CORBA_ORB_ObjectId_ImplementationRepository,&env_g ); env_check( "CORBA_ORB_resolve_initial_references" ); impl = FJ_ImplementationRep_lookup_id( impl_rep,_IMPL_bankA_Synch,&env_g ); env_check( "FJ_ImplementationRep_lookup_id" ); intf = CORBA_Repository_lookup_id( intf_rep, _INTF_ bankA_Synch, &env_g ); env_check( "CORBA_Repository_lookup_id" ); CORBA_BOA_impl_is_ready( boa, impl, &env_g ); env_check( "CORBA_BOA_impl_is_ready" ); return 0; } |
目次 索引 |