ページの先頭行へ戻る
Interstage Business Application Server アプリケーション開発ガイド
FUJITSU Software

10.2.4 クライアントアプリケーションの処理の作成

同期アプリケーション連携実行基盤に配備されたサーバアプリケーションを呼び出すためのクライアントアプリケーションを作成します。
クライアントアプリケーションは、同期アプリケーション連携実行基盤のC言語用のクライアントAPIを利用して作成します。

クライアントアプリケーションでは、以下のように処理を実施してください。

注1)XXXXXは業務処理の関数名が入ります。
注2)YYYYYは業務共通制御の関数名が入ります。

プロセス開始時に行う処理

プロセスの開始時に1度だけ実施してください。

コネクションごとに行う処理

サーバアプリケーションとのコネクションを保持する単位で実施してください。
コネクションの確立・切断を実施するタイミングで呼び出します。
繰り返し実施することが可能です。
複数のサーバアプリケーションと通信を実施する場合、サーバアプリケーションごとに実施する必要があります。

サーバアプリケーションの呼び出しごとに行う処理

サーバアプリケーションを呼び出す際に実施してください。
コネクション内で繰り返し呼び出すことが可能です。

プロセス終了時に行う処理

プロセスの終了時に一度だけ実施してください。
処理を省略することはできません。

アプリケーション内で複数のコネクションを保持し、複数のサーバアプリケーションを連携して呼び出すことも可能です。  
連携するアプリケーションは、同一の言語のサーバ間(C言語のサーバ - C言語のサーバ)でも、異なる言語のサーバ間(C言語のサーバ - COBOLのサーバ)でも可能です。
以下に、サーバアプリケーション“A”とサーバアプリケーション“B”を連携して呼び出す例を示します。

//プロセス初期処理
    apfw_sccl_init( ... ):

    ...

//コネクションの確立処理 (AとBを同時に確立)
   apfw_sccl_create( “A”, &A_handle, ... );
   apfw_sccl_create( “B”, &B_handle, ... );

//AとBに同一のコンテキストIDを設定(別のIDでも可)
   apfw_sccl_set_contextid( A_handle, “tran001”, ... );
   apfw_sccl_set_contextid( B_handle, “tran001”, ... );

// サーバアプリ“A”の呼び出し
   A_encode_data( ... );
   apfw_sccl_invoke( A_handle, ... );
   A_decode_data( ... );

// サーバアプリ“B”の呼び出し
   B_encode_data( ... );
   apfw_sccl_invoke( B_handle, ... );
   B_decode_data( ... );

// サーバアプリ“A”の呼び出し(2回目)
   A_encode_data( ... );
   apfw_sccl_invoke( A_handle, ... );
   A_decode_data( ... );

//コネクションの切断処理 (AとBを切断)
   apfw_sccl_remove( A_handle, ... );
   apfw_sccl_remove( B_handle, ... );

...

//プロセス終了処理
    apfw_sccl_term( ... );

C言語アプリケーションからの呼出し

処理手順

C言語アプリケーションからサーバアプリケーションを呼び出すプログラムの処理手順を示します。

  1. コネクションの確立

  2. コンテキストIDの設定

  3. サーバアプリケーションの呼出し

  4. コネクションの切断

これらの手順の詳細については、C言語アプリケーションからの呼出しの記述例(参考)を参考にしてください。

エラー処理

クライアントアプリケーションで利用する同期アプリケーション連携実行基盤のAPIを実行したときの、メソッドの動作に従ってエラー処理を記述します。
同期アプリケーション連携実行基盤のC言語クライアントAPIの詳細は、“ Interstage Business Application Server リファレンス”の“アプリケーションインタフェース(C言語)”を参照してください。
同期アプリケーション連携実行基盤では、呼び出す方法によって、通知される例外が異なります。

記述例
C言語アプリケーションからの呼出しの記述(参考)

IDLファイル

module apfw_mod {
    interface apfw_intf {
        string SAMPLEOP01(in string p1,inout wstring p2,out string p3);
    };
};

クライアントアプリケーション

#include <stdio.h>
#include <stdlib.h>
#include "apfwcom.h"
#include "apfw_cdr_lib.h"
#include "apfwsccl.h" /* C言語クライアントAPIのヘッダ */
#include "sample_apfwsccl.h"

#define IN_DATA         "IN DATA"
#define INOUT_DATA      "INOUT  DATA"

#define NORMAL_END      0
#define ERROR_END       -1

/* プロセスで1回のみ実施する初期化処理 */
void doInit(){
    apfwScclExcept env;
    if(APFW_SCCL_SUCCESS != apfw_sccl_init(&env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        apfw_sccl_except_free(env);
        abort();
    }
}

/* プロセスで1回のみ実施する終了処理 */
void doTerm(){
    apfwScclExcept env;
    if(APFW_SCCL_SUCCESS != apfw_sccl_term(&env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        apfw_sccl_except_free(env);
        abort();
    }
}

/* サーバアプリケーションの呼び出しを行う関数 */
int doSomething(char *p1, unsigned short **p2, char **p3, char **r){
    /* ハンドル */
    apfwScclHandle handle = NULL;
    /* 送信データ */
    apfwSequenceOctet send_data, send_cdata;
    /* 受信データ */
    apfwSequenceOctet recv_data, recv_cdata;
    /* 例外情報 */
    apfwScclExcept env;
    /* 関数の復帰状態 */
    int return_code = ERROR_END;

    /* 例外情報初期化 */
    memset( &env, 0, sizeof(apfwScclExcept) );
    /* 送受信データ領域初期化 */
    memset( &send_data, 0, sizeof(apfwSequenceOctet) );
    memset( &send_cdata, 0, sizeof(apfwSequenceOctet) );
    memset( &recv_data, 0, sizeof(apfwSequenceOctet) );
    memset( &recv_cdata, 0, sizeof(apfwSequenceOctet) );

    /* 業務名”MyApp”に対するコネクションを確立する*/
    if(APFW_SCCL_SUCCESS != apfw_sccl_create(NULL, "MyApp", &handle, &env)){
        printf("apfw_sccl_create failed\n");
        goto CLEANUP;
    }

    /* コンテキストIDの設定 */
    if(APFW_SCCL_SUCCESS != apfw_sccl_set_contextid(handle, "abcdef", &env)){
        printf("apfw_sccl_set_contextid failed\n");
        goto CLEANUP;
    }

    /* 送信用データ変換関数 */
    if(APFW_SCCL_SUCCESS != SAMPLEOP01_encode_data(handle, p1, p2, p3, &send_data, &env)){
        printf("SAMPLEOP01_encode_data failed\n");
        goto CLEANUP;
    }
    /* サーバアプリケーション“apl”を呼び出す */
    if(APFW_SCCL_SUCCESS != apfw_sccl_invoke(handle, "apl", send_data, &recv_data, &env) ){
        printf("apfw_sccl_invoke failed\n");
        goto CLEANUP;
    }
    /* INOUTデータの解放 */
    if(*p2 != NULL){
        apfw_c_free(*p2);
        *p2 = NULL;
    }

    /* 受信用データ変換関数 */
    if(APFW_SCCL_SUCCESS != SAMPLEOP01_decode_data(handle, &recv_data, r, p1, p2, p3, &env)){
        printf("SAMPLEOP01_decode_data failed\n");
        goto CLEANUP;
    }
    return_code = NORMAL_END;

CLEANUP:
    /* コネクションの切断 */
    if(handle != NULL){
        apfw_sccl_remove(handle, &env);
    }
    /* 例外情報解放 */
    apfw_sccl_except_free(env );
    /* 送受信データ解放 */
    if ( send_data.val != NULL ){
        apfw_c_free( send_data.val );
    }
    if ( send_cdata.val != NULL ){
        apfw_c_free( send_cdata.val );
    }
    if ( recv_data.val != NULL ){
        apfw_c_free( recv_data.val );
    }
    if ( recv_cdata.val != NULL ){
        apfw_c_free( recv_cdata.val );
    }
    return return_code;
}

/* クライアントアプリケーションで扱うデータの領域の獲得 / 解放を行う関数 */
void call_doSomething(){
    char            *p1 = NULL;
    unsigned short  *p2 = NULL;
    char            *p3 = NULL;
    char            *result = NULL;
    
    /* INパラメタ */
    p1 = apfw_c_alloc( strlen(IN_DATA) + 1 );
    if( p1 == NULL ){
        printf("malloc failed\n");
        goto CLEANUP;
    }
    memset(p1, 0x00, strlen(IN_DATA) + 1);
    strcpy(p1, IN_DATA);

    /* INOUTパラメタ */
    p2 = apfw_c_alloc( sizeof(INOUT_DATA) + 2);
    if( p2 == NULL ){
        printf("malloc failed\n");
        goto CLEANUP;
    }
    memset( p2, 0x00, sizeof(INOUT_DATA) + 2);
    memcpy( p2, INOUT_DATA, sizeof(INOUT_DATA));

    /* クライアントアプリの呼び出し */
    if( NORMAL_END != doSomething( p1, &p2, &p3, &result ) ){
        printf("call doSomething failed\n");
        goto CLEANUP;
    }
    /* INOUTパラメタの出力 */
    printf("Get IN OUT Data [%02x]\n", p2[0]);
    /* OUTパラメタの出力 */
    printf("Get OUT Data [%s]\n", p3);
    /* 復帰値の出力 */
    printf("Result Data [%s]\n", result);

CLEANUP:
    /* INパラメタの解放 */
    if ( p1 != NULL )
        apfw_c_free( p1 );
    /* INOUTパラメタの解放 */
    if ( p2 != NULL )
        apfw_c_free( p2 );
    /* OUTパラメタの解放 */
    if ( p3 != NULL )
        apfw_c_free( p3 );
    /* 復帰値の解放 */
    if ( result != NULL )
        apfw_c_free( result );
}

処理の手順を以下に示します。

  1. コネクションの確立
    apfw_sccl_create関数は、同期アプリケーション連携実行基盤を呼び出すためのコネクションの確立をします。

  2. コンテキストIDの設定
    apfw_sccl_set_contextid関数は、コンテキストIDを設定します。

  3. サーバアプリケーションの呼出し
    apfw_sccl_invoke関数で、サーバアプリケーションを呼び出します。apfw_sccl_invoke関数の引数に与えたデータとサーバアプリケーション名が、サーバに送信されます。サーバアプリケーションが返した結果とOUT値、INOUT値を格納して返します。

  4. コネクションの切断
    apfw_sccl_remove関数は、apfw_sccl_create関数で作成したコネクションの切断をします。

注意

サーバアプリケーションまたはサーバアプリケーションが動作するCORBAサービスを再起動した場合は、apfw_sccl_create関数を再実施してハンドルの再取得をしてください。
例外の詳細情報にCORBAサービスの例外情報とマイナーコードが出力された場合は、“Interstage Application Server メッセージ集”の“CORBAサービスの例外情報”および“CORBAサービスのマイナーコード”を参照してください。