ページの先頭行へ戻る
Interstage Application Server V13.0.0 アプリケーション作成ガイド(データベース連携サービス編)
FUJITSU Software

1.4.3 その他のインタフェース

データベース連携サービスで提供するその他のインタフェースを以下に示します。これらのインタフェースは、CORBAアプリケーションで使用します。


インタフェース名

機能名

対応言語

機能概要

Control

get_terminator(注)

  • C

  • C++

terminatorオブジェクトを取得します。

get_coordinator

Coordinatorオブジェクトを取得します。

Coordinator

get_status

トランザクションの状態を取得します。
Currentインタフェースのget_status機能と同様の方法で使用します。

register_synchronization

Synchronizationオブジェクトを登録します。

rollback_only

該当トランザクションをrollbackにだけ可能な状態にします。
Currentインタフェースのrollback_only機能と同様の方法で使用します。

get_transaction_name

トランザクションIDを取得します。
Currentインタフェースのget_transaction_name機能と同様の方法で使用します。

Synchronization

before_completion

register_synchronization機能を使用して登録されたSyncronaizationオブジェクトにトランザクションの完了前であることを通知します。

after_completion

register_synchronization機能を使用して登録されたSynchronizationオブジェクトにトランザクションの完了/状態を通知します。

注)get_terminator機能は、システムサービス相当で使用します。ユーザアプリケーションでは、使用できません。


Synchronizationオブジェクトの登録

ユーザアプリケーションにおいて分散トランザクションの完了と同期をとった処理を行う場合、サーバアプリケーションにおいてデータベース連携サービスにSynchronizationオブジェクトを登録する必要があります。

サーバアプリケーションにおいて、ControlインタフェースおよびCoordinatorインタフェースを使用してSynchronizationオブジェクトを登録する処理手順を以下に示します。


  1. Controlインタフェースのget_coordinator機能を使用して、Coordinatorオブジェクトを取得します。
    Coordinatorオブジェクトは、トランザクションごと生成されています。Coordinatorオブジェクトを取得することにより、トランザクションの状態およびトランザクションIDの管理/コーディネートを行うことができます。

  2. Coordinatorインタフェースのregister_synchronization機能を使用して、データベース連携サービスに、任意の処理を記述したSynchronizationオブジェクトを登録します。


データベース連携サービスは、該当トランザクションの完了依頼(commit/rollback)を受け付けた時点にSynchronizationオブジェクトが登録されていた場合、そのオブジェクトを実行します。また、該当トランザクションの完了後、Synchronizationオブジェクトが登録されていた場合、そのオブジェクトを実行し、パラメタとしてSynchronizationオブジェクトにトランザクションの状態を渡します。

したがって、上記のサーバアプリケーションのSynchronizationオブジェクト登録処理を行うことでSynchronizationオブジェクト機能の使用が可能となり、CORBAサーバアプリケーションにおいてトランザクションの完了前/完了後の状態を確認できるようになります。

なお、Synchronizationオブジェクトは、データベースにアクセスするサーバアプリケーションのオブジェクトと同じプロセス上に配置するように作成してください。

Synchronizationオブジェクト使用時の処理の流れを以下に示します。

注意

図内の番号順に制御されます。



■Synchronizationオブジェクト機能

Synchronizationオブジェクトは、Synchronizationインタフェースの以下の機能を実装したオブジェクトです。Synchronizationオブジェクト機能を使用することにより、トランザクションの完了前/完了後の状態を確認して、分散トランザクションの完了と同期をとった処理を行います。


before_completion機能

Synchronizationオブジェクトのbefore_completionメソッドは、データベース連携サービスがデータベースにトランザクション完了を依頼する前に、データベース連携サービスから呼ばれます。before_completionメソッド実行時にエラーが発生した場合は、該当トランザクションは、データベース連携サービスによりrollbackされます。

after_completion機能

Synchronizationオブジェクトのafter_completionメソッドは、トランザクション完了後に、データベース連携サービスから呼ばれます。


■アプリケーション例

(1) サーバアプリケーションオブジェクト内にSynchronizationインタフェースをもつ場合

Synchronizationオブジェクトの実装について、サーバアプリケーションと同じオブジェクトに配置する場合の例を以下に示します。


注意

ユーザアプリケーションのインプリメンテーションリポジトリへの登録時は、設計に合わせて、プロセス多重度を少なくとも2以上に設定してください。


IDL定義

ユーザアプリケーションのインタフェース宣言において、Synchronizationインタフェースを以下のように継承します。


ポイント

include文で指定する「CosTransactions.idl」の格納先を以下に示します。


(インストールパスはデフォルト)

C:\Interstage\ots\src\idls\CosTransactions.idl

(インストールパスはデフォルト)

/opt/FSUNots/src/idls/CosTransactions.idl

/opt/FJSVots/src/idls/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  データベースへのアクセス
              :

}

/* before_completion  */
bankA_accountA_before_completion(
        bankA_accountA        obj,
        CORBA_Environment        *env )
{
        fprintf(stderr,"bankA_accountA_before_completion \n");
        return;
}

/* after_completion  */
void bankA_accountA_after_completion(
        bankA_accountA        obj,
        CosTransactions_Status status,
        CORBA_Environment        *env )
{
        fprintf(stderr,"bankA_acoountA_after_completion %d\n",status);
        return;
}

(2) サーバアプリケーションオブジェクトと別のオブジェクトとして配置した場合

Synchronizationオブジェクトの実装について、サーバアプリケーションと別のオブジェクトとして作成する場合の例を以下に示します。


注意

ユーザアプリケーションのインプリメンテーションリポジトリへの登録時は、プロセス多重度を2以上に設定してください。


IDL定義

Synchronizationオブジェクトのインタフェース宣言において、Synchronizationインタフェースを以下のように継承します。


ポイント

include文で指定している「CosTransactions.idl」の格納先を以下に示します。


(インストールパスはデフォルト)

C:\Interstage\ots\src\idls\CosTransactions.idl

(インストールパスはデフォルト)

/opt/FSUNots/src/idls/CosTransactions.idl

/opt/FJSVots/src/idls/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オブジェクトの例

/***********************************************************************/
/*  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;
}