Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編)
目次 索引 前ページ次ページ

第7章 サーバアプリケーションの開発(CORBAアプリケーション/Java言語)

7.3 サーバアプリケーションの作成手順

 サーバアプリケーションの構成のうち、利用者が作成する初期化処理、ユーザサービス処理部についての基本形を以下に示します。なお、サーバアプリケーションは、JNIの機構を使用して作成します。

初期化処理部

 初期化処理部では、以下を実装します。

1) ORBの初期化

// ORBの生成と初期化
ORB Orb = ORB.init( args, null ); 

2) POAオブジェクトの初期化と生成

// RootPOAのオブジェクトリファレンスの取得
org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "RootPOA" );
POA rootPOA = POAHelper.narrow( _tmpObj );

// インタフェース用のPOA作成
// ポリシリスト作成
org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[4];
policies[0] = rootPOA.create_servant_retention_policy(
    ServantRetentionPolicyValue.NON_RETAIN );
policies[1] = rootPOA.create_request_processing_policy(
    RequestProcessingPolicyValue.USE_DEFAULT_SERVANT );
policies[2] = rootPOA.create_id_assignment_policy(
    IdAssignmentPolicyValue.SYSTEM_ID );
policies[3] = rootPOA.create_id_uniqueness_policy(
    IdUniquenessPolicyValue.MULTIPLE_ID );

// Default Servant用のPOAオブジェクトの作成
POA childPOA = rootPOA.create_POA( "childPOA", null, policies );

3) Servantオブジェクトの生成

// Servantの生成
Servant svt = new UserServant();
// Default Servantに設定
childPOA.set_servant( svt );

org.omg.CORBA.Object _bindObj =                
childPOA.create_reference( "IDL:ODdemo/calculator:1.0" );

4) オブジェクトリファレンスの取得およびネーミングサービスへの登録

// ネーミングサービスのオブジェクトリファレンスの取得
tmpObj = Orb.resolve_initial_references( "NameService" );
NamingContextExt Cos = NamingContextExtHelper.narrow( _tmpObj );

// ネーミングサービスのresolveメソッドを発行し、
//サーバアプリケーションのオブジェクトリファレンスの獲得
String NCid   = new String( "ODdemo::calculator " );
String NCkind = new String( "" );
NameComponent nc =  new NameComponent( NCid, NCkind );
NameComponent NCo[] = { nc };
try {
    Cos.unbind( NCo );
} catch( Exception e ) {
    ;
}
Cos.bind( NCo, _bindObj );

5) サーバがデータベースにアクセスするための初期化

_tmpObj = Orb.resolve_initial_references( "TransactionServerInit" );
OTS _ots = OTSHelper.narrow( _tmpObj );
_ots.init(Orb, "IDL:ODdemo/calculator:1.0", "XA連携プログラム");

 サーバがデータベースにアクセスするための初期化を行います。
 _ots.initオペレーションのパラメタにはサーバアプリケーションのインプリメンテーションIDを指定します。また、XA連携用プログラムには、otsxamkpgmコマンドの-javaオプションで作成されたものを指定します。
 _ots.initオペレーションはデータベースとのコネクションを確立します。

6) サーバアプリケーションの活性化

// POAマネージャの獲得
POAManager poamanager = childPOA.the_POAManager();
// POAマネージャのactivate
poamanager.activate();
Orb.run(); 

 アプリケーションの登録時には、インプリメンテーション情報定義ファイルのmodeにSYNC_ENDを指定する必要があります。SYNC_ENDを指定することによって、アプリケーションが非活性化された場合やアプリケーション停止時まで復帰しないようになります。

7) サーバがデータベースにアクセスするための終了処理

_ots.term();

 サーバがデータベースにアクセスするための終了処理を行います。_ots.termメソッドはデータベースへのコネクションをクローズします。

ユーザサービス処理部

 ユーザサービス処理部には、データベースへの処理を記述するメソッドとそのメソッドを呼び出すように記述します。

ユーザメソッド処理SQL実行ライブラリロード

public UserServant() {
    System.loadLibrary( "SQL実行ライブラリ" );
}


 SQL実行ライブラリには、C,C++言語で作成されたSQL実行ファイル(*.DLL)を指定します。
 また、SQL実行ファイルは、環境変数のPATHに指定されたフォルダに存在する必要があります。


 SQL実行ライブラリには、C,C++言語で作成されたSQL実行ファイル(*.so)を指定します。
 また、SQL実行ファイルは、環境変数のPATHに指定されたディレクトリパスに存在する必要があります。

ユーザメソッド処理

public void deposit(int a, int b) {
    N_deposit(a, b);
    return;
}
public native void N_deposit(int a, int b);

 以下に、SQL文を発行する処理部(C言語)ソース例と、IDLファイルの定義例を以下に示します。なお、SQL文を発行する処理部の関数名は、ユーザメソッドクラスファイルをもとにjavahコマンドを実行した結果、作成されたファイル内で定義されている関数名を使用します。

 また、このSQL文を発行する処理部のソースで、データベースに応じたコード系に変換する処理を入れてください。

SQL文を発行する処理部(C言語)ソース例

#include    <windows.h>
#include    <sqlca.h>
#include    <oraca.h>
#include    "UserServant.h"

EXEC ORACLE OPTION (ORACA=YES);

VARCHAR  dynstmt[80];
int      accountno;

static char      *error_id;

/* Handle SQL runtime errors. */
void sql_error();

JNIEXPORT void JNICALL Java_UserServant_N_1deposit(JNIEnv *env, jobject obj, jint param1, jint param2)
{
        EXEC SQL BEGIN DECLARE SECTION;
                  long      pa1;
                  long      pa2;
       EXEC SQL END DECLARE SECTION;
        pa1 = param1;
        pa2 = param2;

    EXEC SQL WHENEVER SQLERROR GOTO sql_err;

    oraca.orastxtf = ORASTFERR;

    EXEC SQL UPDATE a_account SET balance=balance+:pa2 WHERE accountno=:pa1;

        return;

sql_err:
        sql_error("Oracle error");
return;

}

void 
sql_error(msg)
char *msg;
{

    printf("\n%s", msg);
    printf("\n%.*s\n",
        sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
    printf("in \"%.*s...\"\n",
        oraca.orastxt.orastxtl, oraca.orastxt.orastxtc);
    printf("on line %d of %.*s.\n\n",
        oraca.oraslnr, oraca.orasfnm.orasfnml,
        oraca.orasfnm.orasfnmc);

    EXEC SQL WHENEVER SQLERROR CONTINUE;


    return;

}

IDL定義ファイル例

module ODdemo{
    interface    calculator{
              void     deposit(in long a, in long b);
              void     withdrawal(in long a, in long b);
    };
};

注意

サーバアプリケーションが異常を検出した場合

 サーバアプリケーションが以下のようなエラーを検出した場合、エラーをクライアントアプリケーションに通知する必要があります。

 エラーが通知されたクライアントアプリケーションでは、rollbackを発行してトランザクションを終了させてください。


目次 索引 前ページ次ページ

Copyright 2008 FUJITSU LIMITED